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.

90 lines
2.6 KiB
C

1 month ago
/************************************************************************/
/* <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;
};