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