|
|
|
|
|
/************************************************************************/
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>CVoronoi */
|
|
|
|
|
|
/* <20><><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Voronoiͼ<69><CDBC><EFBFBD>걳ͼ<EAB1B3><CDBC> */
|
|
|
|
|
|
/* <20><><EFBFBD><EFBFBD>ΰ 2011-12-1 */
|
|
|
|
|
|
/************************************************************************/
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
#include "Triangulation.h"
|
|
|
|
|
|
#include <list>
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD>VoronoiͼԪ
|
|
|
|
|
|
class CVoronoiUnit
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
CVoronoiUnit();
|
|
|
|
|
|
|
|
|
|
|
|
/** @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(CCurve& border);
|
|
|
|
|
|
|
|
|
|
|
|
int npt; //<2F><><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
CPoint3D* ppt; //<2F><><EFBFBD>ĵ<EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
list<CPoint3D> m_nodPoints;
|
|
|
|
|
|
|
|
|
|
|
|
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*/
|
|
|
|
|
|
bool MinClosedCurve(CCurve& nodCur, CCurve& border,CPointList& ptlist);
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class AFX_EXT_CLASS CVoronoi:public CTriangulation
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
CVoronoi(void);
|
|
|
|
|
|
virtual ~CVoronoi(void);
|
|
|
|
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
/** @brief <20><><EFBFBD><EFBFBD>Voronoiͼ */
|
|
|
|
|
|
int CreateVoronoiMap(CCurve* border = NULL);
|
|
|
|
|
|
/** @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);
|
|
|
|
|
|
|
|
|
|
|
|
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ա*/
|
|
|
|
|
|
virtual void ClearAll();
|
|
|
|
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//ͼ<><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ĵ<EFBFBD><C4B5>ú<EFBFBD><C3BA><EFBFBD>
|
|
|
|
|
|
//
|
|
|
|
|
|
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD>Voronoiͼ<69><CDBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
|
|
|
int GetUnitCurve(int nIndex, CCurve& 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><>Voronoiͼд<CDBC><D0B4><EFBFBD>ļ<EFBFBD>*/
|
|
|
|
|
|
void Write(char* filename);
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
/** @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><DFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Voronoiͼ*/
|
|
|
|
|
|
virtual int Create();
|
|
|
|
|
|
/** @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 OneWayTrace(int& nTri, int& npt1, int& npt2, set<int>& FDTriNos,list<CPoint3D>& nodlist, int addMode = 0);
|
|
|
|
|
|
/** @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();
|
|
|
|
|
|
|
|
|
|
|
|
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ͼ<69>߽<EFBFBD><DFBD><EFBFBD> */
|
|
|
|
|
|
CCurve m_Border;
|
|
|
|
|
|
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
|
|
|
|
|
|
CCurve m_OutlineCurve;
|
|
|
|
|
|
};
|
|
|
|
|
|
|