//-----------------------------------------------------------------------------+ // Copyright (C), 1998-2007, SH Software Co. Ltd. // = FileName : CPloygon.h // = Version : ver2.0 // = Author : zjq // = CreateDate : 2002-09-09 // = Description: 类的声明 描述单连通区域 // = Maintainers: // //-----------------------------------------------------------------------------+ #ifndef _BPLOYGON_H_ #define _BPLOYGON_H_ #ifndef _BPLOYLINE_H_ #include "CPloyLine.h" #endif #ifndef _DLIST_H_ #include "DList.h" #endif #ifndef _C3DFACE_H_ #include "C3DFace.h" #endif #ifndef _XTRIANGLE_H_ #include "XTriangle.h" #endif class CBNode; class CPloygon; typedef CTypedPtrList TBPolygonList; class GEOAPI CPloygon : public CPloyLine { public: CPloygon(); CPloygon(const CPloyLine& bline); #if ARX > 17 CPloygon(const CPloygon& poly); #endif virtual ~CPloygon(); //返回下一结点,当作封闭环 virtual CBNode* GetNextNode(CBNode* pNode); //返回上一结点,当作封闭环 virtual CBNode* GetPreNode(CBNode* pNode); //判断多边形pPolygon是否在此多边形内部 //返回0:相交 //如果返回1,则包含pPolygon, //如果返回2,则被pPolygon包含 //如果返回3,则与pPolygon互不包含 BOOL IsSurrounded(CPloyLine* pPolygon); //释放内存 void ReleaseRgnLst(TBPolygonList& sRgnList); //是否平行于XY平面 BOOL IsParallelToXY(double tol); //根据此面创建m_plane BOOL CreatAcGePlane(); //构造从当前坐标系到此平面所在的坐标系的变换矩阵 AcGeMatrix3d GetUCSToECSMat(); //构造从此平面所在的坐标系到当前坐标系的变换矩阵 AcGeMatrix3d GetECSToUCSMat(); //将此区域通过矩阵mat进行变换 void TransformBy(AcGeMatrix3d& mat); //返回下下一结点 CBNode* GetNextNode2(CBNode* pNode); //三角化单连通区域,并将三角形存于sRgnList BOOL TrianglizePolygon(TBPolygonList& sRgnList); //将此区域一分为二直到全为三角形,并将三角形存于sRgnList void CutDown(TBPolygonList& sRgnList); //测试pTestNode是否在以pNode为结点的前后两边内部 BOOL IsPtInsideRgn(CBNode* pNode,CBNode* pTestNode); //连线PT1-PT2是否于其他边相交 BOOL IsCrossOtherEdges(CBNode* pNode1,CBNode* pNode2); //pNode1和pNode2组成的连线是否可以将此区域分为两个单连通域 BOOL IsASuitableDivLine(CBNode* pNode1,CBNode* pNode2); //以结点1-2为分界将此区域一分为二 void DivideTo2Polygon(CBNode* pNode1,CBNode* pNode2,CPloygon*& pRgn1,CPloygon*& pRgn2); //将此结点转化成3DFACE AcDbFace* ConvertTo3dFace(); //将此结点转化成3DFACE XTriangle* ConvertToTriangle(); //将此区域三角化为一系列3DFACE BOOL ConvertTo3DFaces(C3DFaceList& face3DList); //将此区域三角化为一系列3DFACE BOOL ConvertToTriangle(DList &lstRes); public: //三角化后的三角区域链表 TBPolygonList m_childSRList; //m_plane是否已经构造成功 BOOL m_bPlaned; //所在平面 AcGePlane m_plane; private: //pt是否在pt11-pt12所在线段上 BOOL IsOnLineSeg(AcGePoint3d pt11,AcGePoint3d pt12,AcGePoint3d pt,double tol = TOL); }; #endif