/** * Constructs a sprite, specifying the image it should represent as well as the * shape that it should use for size calculation. * * @param image * @param shape */ Sprite::Sprite(sprite_image_t image, const Shape& shape): m_image(image), m_position(Coord2d(0,0)), m_rotation(0) { setSizeFromShape(shape); }
/** * Constructs a sprite, specifying its size. Used by children to this class, that * can't set an image in the init list. * * @param width * @param height */ Sprite::Sprite(float width, float height): m_width(width), m_height(height), m_image(Sprite::__NOIMAGE__), m_rotation(0), m_position(Coord2d(0,0)) { }
/** * Constructs a sprite, specifying the image it should represent as well as its * size (width + height). * * @param image * @param width * @param height */ Sprite::Sprite(sprite_image_t image, float width, float height): m_image(image), m_width(width), m_height(height), m_rotation(0), m_position(Coord2d(0,0)) { }
//======================================================================= // function: Coord2dVf // purpose: //======================================================================= gp_Pnt2d Coord2dVf (const TopoDS_Edge& aE, const TopoDS_Face& aF) { Standard_Real aCoord=99.; gp_Pnt2d aP2D1(aCoord, aCoord); TopoDS_Iterator aIt; // aIt.Initialize(aE); for (; aIt.More(); aIt.Next()) { const TopoDS_Shape& aVx=aIt.Value(); if (aVx.Orientation()==TopAbs_FORWARD) { const TopoDS_Vertex& aVxx=TopoDS::Vertex(aVx); aP2D1=Coord2d(aVxx, aE, aF); return aP2D1; } } return aP2D1; }
//======================================================================= // function: Path // purpose: //======================================================================= void Path (const GeomAdaptor_Surface& aGAS, const TopoDS_Face& myFace, const TopoDS_Vertex& aVa, const TopoDS_Edge& aEOuta, BOP_EdgeInfo& anEdgeInfo, TopTools_SequenceOfShape& aLS, TopTools_SequenceOfShape& aVertVa, TColgp_SequenceOfPnt2d& aCoordVa, BOPTColStd_ListOfListOfShape& myShapes, BOP_IndexedDataMapOfVertexListEdgeInfo& mySmartMap) { Standard_Integer i,j, aNb, aNbj; Standard_Real aTol, anAngleIn, anAngleOut, anAngle, aMinAngle; Standard_Real aTol2D, aTol2D2; Standard_Real aTol2, aD2;//, aTolUVb, aTolVVb; Standard_Boolean anIsSameV2d, anIsSameV, anIsFound, anIsOut, anIsNotPassed; BOP_ListIteratorOfListOfEdgeInfo anIt; TopoDS_Vertex aVb; TopoDS_Edge aEOutb; // aTol=1.e-7; // // append block // // Do not escape through edge from which you enter aNb=aLS.Length(); if (aNb==1) { const TopoDS_Shape& anEPrev=aLS(aNb); if (anEPrev.IsSame(aEOuta)) { return; } } // // anEdgeInfo.SetPassed(Standard_True); aLS.Append(aEOuta); aVertVa.Append(aVa); TopoDS_Vertex pVa=aVa; pVa.Orientation(TopAbs_FORWARD); gp_Pnt2d aPa=Coord2d(pVa, aEOuta, myFace); aCoordVa.Append(aPa); GetNextVertex (pVa, aEOuta, aVb); gp_Pnt2d aPb=Coord2d(aVb, aEOuta, myFace); //const BOP_ListOfEdgeInfo& aLEInfoVb=mySmartMap.FindFromKey(aVb); // aTol=2.*Tolerance2D(aVb, aGAS); aTol2=10.*aTol*aTol; // aNb=aLS.Length(); if (aNb>0) { // TopTools_ListOfShape aBuf; // for (i=aNb; i>0; i--) { const TopoDS_Shape& aVPrev=aVertVa(i); const gp_Pnt2d& aPaPrev=aCoordVa(i); const TopoDS_Shape& aEPrev=aLS(i); aBuf.Append(aEPrev); anIsSameV=aVPrev.IsSame(aVb); anIsSameV2d=Standard_False; if (anIsSameV) { anIsSameV2d = Standard_True; // aD2=aPaPrev.SquareDistance(aPb); anIsSameV2d =aD2<aTol2; }//if (anIsSameV) { // if (anIsSameV && anIsSameV2d) { myShapes.Append(aBuf); // TopTools_SequenceOfShape aLSt, aVertVat; TColgp_SequenceOfPnt2d aCoordVat; // aNbj=i-1; if (aNbj<1) { // aLS.Clear(); aVertVa.Clear(); aCoordVa.Clear(); // return; } aVb=TopoDS::Vertex(aVertVa(i)); for (j=1; j<=aNbj; j++) { aLSt.Append(aLS(j)); aVertVat.Append(aVertVa(j)); aCoordVat.Append(aCoordVa(j)); } // aLS.Clear(); aVertVa.Clear(); aCoordVa.Clear(); aLS=aLSt; aVertVa=aVertVat; aCoordVa=aCoordVat; // break; } } } // aTol2D=2.*Tolerance2D(aVb, aGAS); aTol2D2=100.*aTol2D*aTol2D; // // anAngleIn in Vb from edge aEOuta const BOP_ListOfEdgeInfo& aLEInfo=mySmartMap.FindFromKey(aVb); // anAngleIn=AngleIn(aEOuta, aLEInfo); // // aEOutb BOP_EdgeInfo *pEdgeInfo=NULL; aMinAngle=100.; anIsFound=Standard_False; Standard_Integer aCurIndexE = 0; anIt.Initialize(aLEInfo); for (; anIt.More(); anIt.Next()) { BOP_EdgeInfo& anEI=anIt.Value(); const TopoDS_Edge& aE=anEI.Edge(); anIsOut=!anEI.IsIn(); anIsNotPassed=!anEI.Passed(); if (anIsOut && anIsNotPassed) { aCurIndexE++; // // Is there one way to go out of the vertex // we have to use it only. Standard_Integer iCnt; iCnt=NbWaysOut (aLEInfo); // if (!iCnt) { // no way to go . (Error) return ; } // if (iCnt==1) { // the one and only way to go out . pEdgeInfo=&anEI; anIsFound=Standard_True; break; } // // Look for minimal angle and make the choice. gp_Pnt2d aP2Dx; // aP2Dx=Coord2dVf(aE, myFace); // aD2=aP2Dx.SquareDistance(aPb); if (aD2 > aTol2D2){ continue; } // // anAngleOut=anEI.Angle(); // anAngle=ClockWiseAngle(anAngleIn, anAngleOut); if (anAngle < aMinAngle) { aMinAngle=anAngle; pEdgeInfo=&anEI; anIsFound=Standard_True; } } } // for (; anIt.More(); anIt.Next()) // if (!anIsFound) { // no way to go . (Error) return; } aEOutb=pEdgeInfo->Edge(); // Path (aGAS, myFace, aVb, aEOutb, *pEdgeInfo, aLS, aVertVa, aCoordVa, myShapes, mySmartMap); }