#pragma once #include "CommonDefines.h" #ifdef SINGLE #define REAL float #else /* not SINGLE */ #define REAL double #endif /* not SINGLE */ struct TRIANIO { REAL *pointlist; /* In / out */ REAL *pointattributelist; /* In / out */ int *pointmarkerlist; /* In / out */ int numberofpoints; /* In / out */ int numberofpointattributes; /* In / out */ int *trianglelist; /* In / out */ REAL *triangleattributelist; /* In / out */ REAL *trianglearealist; /* In only */ int *neighborlist; /* Out only */ int numberoftriangles; /* In / out */ int numberofcorners; /* In / out */ int numberoftriangleattributes; /* In / out */ int *segmentlist; /* In / out */ int *segmentmarkerlist; /* In / out */ int numberofsegments; /* In / out */ REAL *holelist; /* In / pointer to array copied out */ int numberofholes; /* In / copied out */ REAL *regionlist; /* In / pointer to array copied out */ int numberofregions; /* In / copied out */ int *edgelist; /* Out only */ int *edgemarkerlist; /* Not used with Voronoi diagram; out only */ REAL *normlist; /* Used only with Voronoi diagram; out only */ int numberofedges; /* Out only */ }; #include struct REAL_POINT { int Marker; REAL rX; REAL rY; }; struct AREA_CONTROL { REAL Area; REAL rX; REAL rY; }; struct GRID_SEGMENT { int iPt0; int iPt1; int Marker; }; struct TRI_RELATION { int corner[3]; int neighbor[3]; }; typedef CArray REAL_POINT_ARR; typedef CArray TRI_RELATIONS; typedef CArray GRID_SEGMENTS; typedef CArray AREA_CONTROLS; class CTriAdapter { public: CTriAdapter(void); virtual ~CTriAdapter(void); typedef CArray CPointArray; typedef CArray COnePolygon; typedef CArray CPolygons; public: void SetGeneralPoints(REAL_POINT_ARR &pts); int AddOuterPolygon(REAL_POINT_ARR &pts); BOOL CreateTriangle(LPCTSTR strPara = _T("pzn")); REAL_POINT_ARR * GetTrianglePoints(); TRI_RELATIONS * GetTriangleRelation(); void ReCalcTriBounderMarker(int iException = INT_MAX); void Clear(); protected: void InitOut(TRIANIO *pOut); BOOL ConvertOutToMyConstruct(TRIANIO *pOut, CPolygons *plGs); void InitIn(TRIANIO *pIn); int VerifyOneBounder(int iTri, int iBounder, int iException); protected: void Triangulate(char *triswitches, struct TRIANIO *in, struct TRIANIO *out, struct TRIANIO *vorout); private: void ClearInnerLineArr(); void ClearInnerPolygonArr(); void ClearOuterPolygonArr(); int GetAllPointCount(); void SetInPoints(TRIANIO *pIn); int GetAllSegmentCount(); void SetInSegments(TRIANIO *pIn); void GetCenterPoint(CPoint2D &ptCenter, REAL_POINT pt[3]); BOOL PtInPolygon(CPoint2D pt, CPolygons *plGs); int IsPointOccurred(REAL_POINT &pt); int AddOnePoint(REAL_POINT &pt); private: REAL_POINT_ARR m_outPoints; TRI_RELATIONS m_outTriRelations; GRID_SEGMENTS m_outSegments; private: REAL_POINT_ARR m_WholePoints; AREA_CONTROLS m_areaCtrls; int m_iCurMarker; CPointArray m_genePointArr; CArray m_InnerLineArrs; CArray m_InnerPolygonArrs; CArray m_OuterPolygonArrs; };