You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

245 lines
8.8 KiB
C

1 month ago
#pragma once
#ifndef AFX_EXT_CLASS
#define AFX_EXT_CLASS Q_DECL_IMPORT
#endif
#include "Triangulation.h"
#include <list>
namespace NVoronoi
{
class CVoronoi;
//<2F><><EFBFBD><EFBFBD>VoronoiͼԪ
class AFX_EXT_CLASS CVoronoiUnit
{
public:
CVoronoiUnit(CVoronoi* pParent);
/** @brief<65>жϸ<D0B6>ͼԪ<CDBC>Ƿ<EFBFBD><C7B7>պ<EFBFBD> */
bool IsClosed();
/** @brief <20><><EFBFBD>ӱ߽磬<DFBD><E7A3AC><EFBFBD><EFBFBD>1<EFBFBD><31>ʾ<EFBFBD><CABE><EFBFBD>ӳɹ<D3B3> */
bool AddBorder(CMyCurve& border);
/** @brief <20><><EFBFBD>Ӷϲ<CFB2><E3A3AC><EFBFBD>ɶϲ<C9B6><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD>*/
bool ClipWithFlts(vector<CMyCurve*>* pFlts, vector<CRect8>* pRects = 0);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool GetPolygon(CMyCurve& curve);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void EraseOtherPgns(void);
list<CMyCurve*>& GetOtherPgns(void);
int npt; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>
CPoint3D* ppt; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>ָ<EFBFBD><D6B8>
list<CPoint3D> m_nodPoints; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>
list<CMyCurve*> m_otherPgns; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
private:
/** @brief <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD>С<EFBFBD><D0A1>Χ<EFBFBD><CEA7><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ptlist,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD>otherpgns*/
bool MinClosedCurve(CMyCurve& nodCur, CMyCurve& border,CPointList& ptlist, list<CMyCurve*>& otherPgns);
//<2F><><EFBFBD>걳ͼ
CVoronoi* m_pParent;
};
//vorono<6E><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class CVoronoiPolygon
{
public:
CVoronoiPolygon();
~CVoronoiPolygon();
int GetWell(void){return m_iWellPt; }
bool ContainWell(void) {return m_bWellInside;}
CMyCurve* GetPolygon(void) {return m_pPolygon; }
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
bool IsAdjacent(CVoronoiPolygon* pOther);
int m_iWellPt; //<2F><><EFBFBD>ؾ<EFBFBD><D8BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool m_bWellInside; // <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CMyCurve* m_pPolygon;
};
class AFX_EXT_CLASS CVoronoi : public CTriangulation
{
public:
CVoronoi(void);
virtual ~CVoronoi(void);
public:
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>صı߽<C4B1><DFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽硢<DFBD>ϲ<EFBFBD><CFB2>ȣ<EFBFBD>pFltΪ<74>ϲ<EFBFBD> pFltRectsΪ<73>ϲ<EFBFBD><CFB2><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD>η<EFBFBD>Χ */
int InitBoundary(CMyCurve* border = NULL, vector<CMyCurve*>* pFlts = 0, vector<CRect8>* pFltRects = 0);
/** @brief <20><><EFBFBD><EFBFBD>Voronoiͼ<69><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD>Ԫ<EFBFBD><D4AA> */
int CreateVoronoiMap(TPtrList& curveVoronoiList);
/** @brief <20><>ȡ2Dɢ<44><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
virtual int ReadPoints(vector<double>& X, vector<double>& Y);
virtual int ReadPoints(int num, double* X, double* Y);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҪͼԪ<CDBC><D4AA><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>ĵ㣨<C4B5><E3A3A8><EFBFBD><EFBFBD><E3A3A9><EFBFBD><EFBFBD>
void SetMarkedPoints(vector<int>& markVec);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD><D0B1>ǹ걳ͼԪPolygon<6F><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼԪPolygon<6F><6E>
void SplitMarkedUnits(void);
//<2F>ɶϲ<C9B6><CFB2>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD>voronoi<6F><69>Ԫ <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>Ԫ<EFBFBD>Ϸ֣<CFB7><D6A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>طָ<D8B7><D6B8><EFBFBD><EFBFBD><EFBFBD>ԭʼvunit<69><74><EFBFBD><EFBFBD>
int SplitVUnitWithFlts(void);
//<2F>ɶϲ<C9B6><CFB2>ָ<EFBFBD><D6B8><EFBFBD><EAB1B3>ԪpScrVUnit<69><74><EFBFBD>ɶ<EFBFBD><C9B6><EFBFBD>voronoi<6F><69><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD><CEB4><EFBFBD>dstVUnits<74><73><EFBFBD><EFBFBD><EFBFBD>ϲ<EFBFBD>δ<EFBFBD>ָ<D6B8><EEA3AC>v unit<69>߽<EFBFBD><DFBD><EFBFBD><EFBFBD>ɶ<EFBFBD><C9B6><EFBFBD><EFBFBD><EFBFBD>
bool SplitVUnitWithFlts(CVoronoiUnit* pScrVUnit,list<CVoronoiPolygon*>& dstVPgns,
vector<CMyCurve*>* pFlts);
//<2F><>ÿ<EFBFBD>ھ<EFBFBD><DABE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ctCurs,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һһ<D2BB><D2BB>Ӧ<EFBFBD><D3A6><EFBFBD>·<EFBFBD><C2B7><EFBFBD>m_vPolygons & m_VUnitList
//<2F><><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ReassignWithConstraintRects( double width, double height );
//<2F>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>v<EFBFBD><76><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɾֲ<C9BE><D6B2>걳ͼ
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
virtual void ClearAll();
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա*/
void ClearVoronoi();
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>ϱ߽<CFB1> <20><><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
int CreateUnitedBoundaries( vector<CMyCurve*>& pgns, vector<CMyCurve*>& borders );
////////////////////////////////////////////////////////////////////////
//ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ĵ<EFBFBD><C4B5>ú<EFBFBD><C3BA><EFBFBD>
//
//<2F><>ȡVoronoi<6F><69>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
int GetVUnitCurves(vector<CMyCurve*>& curs);
//<2F><>ȡV<C8A1><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int GetVPolygonCurves(vector<CMyCurve*>& curs);
//<2F><>ȡˮ<C8A1><CBAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int GetMWSplitterCurves(vector<CMyCurve*>& curs);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD>ͼԪ<CDBC><D4AA><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD>curveVoronoiList<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD>(CCurveEx)<29><><EFBFBD><EFBFBD>*/
int GetUnitCurve(TPtrList& curveVoronoiList);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>VoronoiͼԪ<CDBC><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
int GetUnitCurve(int nIndex, CMyCurve& pCurve);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>Voronoiͼ<69><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߸<EFBFBD><DFB8><EFBFBD>*/
int GetUnitCount() { return (int)m_VUnitList.size(); }
/** @brief <20><><EFBFBD><EFBFBD>voronoi<6F><69>Ԫ*/
CVoronoiUnit* GetUnit(int index);
/** @brief <20><>Voronoiͼд<CDBC><D0B4><EFBFBD>ļ<EFBFBD>*/
void Write(char* filename);
/** @brief <20>ɱ߽<C9B1><DFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Voronoiͼ*/
virtual int Create();
//<2F><><EFBFBD><EFBFBD>λ<EFBFBD>ڶϲ<DAB6><CFB2>ڲ<EFBFBD><DAB2>ľ<EFBFBD><C4BE><EFBFBD>
void FindWellInFlts(void);
list<VSegment>& GetSplitterSegments(void);
private:
//<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>voronoiͼԪ<CDBC><D4AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͼԪ<CDBC><D4AA> idxΪ<78><CEAA><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>
void SplitMarkedUnit(int wellIndex);
//dest<73>ϲ<EFBFBD>subject<63><74><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>
void MergeAdjacentPart(CVoronoiPolygon* pSubjectUnit, CVoronoiPolygon* pDestUnit);
/** @brief <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>*/
bool MidPoint(int npt1, int npt2,CPoint3D& mpt);
/** @brief <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>*/
bool MidPoint(CPoint3D& pt1, CPoint3D& pt2,CPoint3D& mpt);
/** @brief <20>ɱ߽<C9B1>ѡ<EFBFBD><D1A1><EFBFBD><EFBFBD><EFBFBD>ݵ㣬ɾ<E3A3AC><C9BE><EFBFBD>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݵ<EFBFBD>*/
void SelectPointsByBorder();
/** @brief <20><><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD>걳ͼԪ*/
bool CreateVoronoiUnit(int npt, int nTri, CVoronoiUnit& vunit);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD><D7B7>nTri<72><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>Voronoi<6F><69><EFBFBD><EFBFBD>,addMode == 0Ϊβ<CEAA><CEB2><EFBFBD><EFBFBD><EFBFBD>ӵ㣬1 Ϊͷ<CEAA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
virtual int DirectionalTrace(int& nTri, int& npt1, int& npt2, set<int>& FDTriNos,list<CPoint3D>& nodlist, int addMode = 0);
/**@brief ׼<><D7BC>׷<EFBFBD>٣<EFBFBD>ȷ<EFBFBD><C8B7><EFBFBD>׵<EFBFBD> m_LastPoint*/
int PrepareTrace(int nTri, int npt1, int bot0,int bot1,list<CPoint3D>& nodlist, int addMode);
/**@brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׷<EFBFBD>ٵ<EFBFBD><D9B5>߽<EFBFBD> <20><><EFBFBD>н<EFBFBD><D0BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
int EndDirectionalTrace(int nTri, int nTop, int nBottom,list<CPoint3D>& nodlist, int addMode);
/** @brief ׷<><D7B7>ntri<72><69><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>Voronoi<6F><69><EFBFBD><EFBFBD>,addMode == 0Ϊβ<CEAA><CEB2><EFBFBD><EFBFBD><EFBFBD>ӵ㣬1 Ϊͷ<CEAA><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int GetVNodePoint(int nTri, int npt1, int npt2, int npt3,list<CPoint3D>& nodlist, int addMode );
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽磬<DFBD>󽻵<EFBFBD>׮<EFBFBD><D7AE>*/
bool ExtendToBorder(list<CPoint3D>& nodlist, double& l0 , double extlen);
/** @brief <20><><EFBFBD>ɰ<EFBFBD><C9B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
bool CreateEnvelopeCurve();
/** @brief<65><66><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>*/
bool CreateCirCenterPoints();
/* @brief <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>(x1,y1)(x3,y3)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(x1,y1)(x2,y2)<29><><EFBFBD>Ҳ໹<D2B2><E0BBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ҳ෵<D2B2><E0B7B5>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0B7B5>1,<2C><><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>2 **/
int VectorSide(double x1, double y1, double x2, double y2, double x3, double y3);
/**@brief <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>(pt0-pt2)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>(pt0,pt1)<29><><EFBFBD>Ҳ໹<D2B2><E0BBB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD><D2B7><EFBFBD>0 <20>󷵻<EFBFBD>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>Ϸ<EFBFBD><CFB7><EFBFBD>2*/
int VectorSide(CPoint2D& pt0, CPoint2D& pt1,CPoint2D& pt2);
//<2F><><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>걳ͼ<EAB1B3><CDBC>Ӧ<EFBFBD><D3A6>ϵ
void MapPointVoronoiUnit(void);
//<2F><><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>VPolygon<6F>Ķ<EFBFBD>Ӧmap
void MapPointVoronoiPolygon(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>еĵ<D0B5><C4B5>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>غ<EFBFBD>
bool IsAdjacent(CPoint3D& pt, list<CPoint3D>& polygon,CRect8* pRect );
//<2F><>ȡĿ<C8A1><C4BF>vector<6F><72><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD>polygon<6F><6E><EFBFBD>ڽӹ<DABD>ϵ,<2C><><EFBFBD>ڽӵ<DABD><D3B5><EFBFBD><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD>vecAdjacent<6E><74> <20><><EFBFBD><EFBFBD><EFBFBD>ڽӵ<DABD><D3B5><EFBFBD><EFBFBD><EFBFBD>
int GetAdjacentPoint(list<CPoint3D>& targetPts, list<CPoint3D>& polygon,set<CPoint3D*>& adjResult);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void AddPoint(list<CPoint3D>& nodlist, CPoint3D& pt, int addMode=0);
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>true <20><> <20><><EFBFBD><EFBFBD>false
bool IsCollinear(double prec);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B9B2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>voronoi<6F><69>Ԫ<EFBFBD><D4AA>
int CreateCollinearVoronoiMap();
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B9B2>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>voronoi<6F><69>Ԫ<EFBFBD><D4AA>curveVoronoiList<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD>(CCurveEx)<29><><EFBFBD><EFBFBD>
int CreateCollinearVoronoiMap(TPtrList& curveVoronoiList);
//<2F><>ȡV<C8A1><56><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵĶ<DAB5><C4B6><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD>γ<EFBFBD><CEB3><EFBFBD>,bCompareAllPgns= true <20><>ͼ<EFBFBD><CDBC><EFBFBD><EFBFBD><EFBFBD>о<EFBFBD><D0BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚϣ<C8BD>false= ֻ<><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƚ<EFBFBD>
int GetAdjacentPolygons(CVoronoiPolygon* pscrPgn, list<CVoronoiPolygon*>& dstpgns, bool bCompareAllPgns = false);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Voronoi<6F><69>Ԫ<EFBFBD><D4AA><EFBFBD><EFBFBD>
int GetNeighborWells(int iWell, vector<int>& neighborWells);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>εĴ<CEB5><C4B4>߽<EFBFBD>
CMyCurve* CreateBoundary( list<CVoronoiPolygon*>& pgns );
//<2F><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>εĴ<CEB5><C4B4>߽<EFBFBD><DFBD>߶<EFBFBD>
void GetBoundarySegs( list<CVoronoiPolygon*>& scrPgns, list<VSegment>& dstSegs );
//<2F><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>εĴ<CEB5><C4B4>߽<EFBFBD><DFBD>߶<EFBFBD>
void GetBoundarySegs( vector<CMyCurve*>& scrPgns, list<VSegment>& dstSegs );
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><EFBFBD><E7B9AB><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>0
CMyCurve* CreateBoundary(list<VSegment>& scrSegs);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>VORONOIͼ
bool CreateSubVoronoi(list<CVoronoiPolygon*>& pgns, CMyCurve* pBoundary,CVoronoi& dstVrn,
std::map<int,int>& subwell2origwell,vector<CMyCurve*>* pFlts);
//<2F><><EFBFBD><EFBFBD>voronoiͼ<69><CDBC><EFBFBD><EFBFBD>ԭͼ
void UpdateWithSubVoronoi(CVoronoi& dstVrn, std::map<int,int>& subwell2origwell);
//<2F><>vpolygon<6F><6E><EFBFBD><EFBFBD>vunit
void UpdateVUnitWithVPolygon(CVoronoiUnit* pDstUnit, CVoronoiPolygon* pScrPolygon);
//<2F><><EFBFBD><EFBFBD>vpolygons
void ClearVPolygons(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int GetWellIndex(double x, double y);
//<2F><><EFBFBD>߶μ<DFB6>ȥ<EFBFBD><C8A5>ͬ<EFBFBD><CDAC><EFBFBD>֣<EFBFBD><D6A3>õ<EFBFBD><C3B5><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ֵ<EFBFBD><D6B5>߶θ<DFB6><CEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E0BDBB> <20><><EFBFBD><EFBFBD>0
int SubtractSegment(VSegment& v1, VSegment& v2, vector<VSegment>& dstSegs);
//<2F><><EFBFBD><EFBFBD><EFBFBD>ڶϲ<DAB6><CFB2>еľ<D0B5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
set<int>& GetWellInFlt(void);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD> etdLen Ϊÿ<CEAA><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȣ<EFBFBD>ȱʡ-1
void GetRectLines(double x0, double y0, double w, double h,CMyCurve* lines, double etdLen = -0.1);
private:
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
vector<CPoint3D*> m_CCPoints;
/** @brief <20><><EFBFBD>й걳ͼԪ<CDBC><D4AA><EFBFBD><EFBFBD>*/
vector<CVoronoiUnit*> m_VUnitList;
/** @brief voronoi<6F><69>Ԫ<EFBFBD><D4AA><EFBFBD>ϲ<EFBFBD><CFB2>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD>*/
list<CVoronoiPolygon*> m_vPolygons;
typedef list<CVoronoiPolygon*>::iterator VPITER;
/** @brief Voronoiͼ<69>߽<EFBFBD><DFBD><EFBFBD> */
CMyCurve m_Border;
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
CMyCurve m_OutlineCurve;
vector<CMyCurve*>* m_pFlts;
vector<CRect8> m_fltRects;
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>///////////////////////
CPoint3D m_LastPoint;
set<int> m_markedPoints; //<2F><><EFBFBD>ǵľ<C7B5><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
map<int, int> m_mapPtVUnit; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>voronoi unit<69><74><EFBFBD>ŵ<EFBFBD>map
map<int,CVoronoiPolygon*> m_mapPtVPng; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӦVPolygonָ<6E><D6B8><EFBFBD><EFBFBD>map
set<int> m_wellinflt; //λ<>ڶϲ<DAB6><CFB2>ڲ<EFBFBD><DAB2>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD>ڶϲ<DAB6><CFB2>ָ<EFBFBD>
CSize8* m_pConstrainSize; //<2F><><EFBFBD>ڷָ<DAB7><D6B8>ľ<EFBFBD><C4BE>γ<EFBFBD><CEB3><EFBFBD>
list<VSegment> m_splitterSegments; //<2F>ָ<EFBFBD>ˮ<EFBFBD><CBAE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
};
}; //NTriangle