|
|
/************************************************************************/
|
|
|
/* 类名:CVoronoi */
|
|
|
/* 功能:由散点生成Voronoi图(龟背图) */
|
|
|
/* 王昌伟 2011-12-1 */
|
|
|
/************************************************************************/
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
#include "Triangulation.h"
|
|
|
#include <list>
|
|
|
|
|
|
//单个Voronoi图元
|
|
|
class CVoronoiUnit
|
|
|
{
|
|
|
public:
|
|
|
CVoronoiUnit();
|
|
|
|
|
|
/** @brief判断该图元是否闭合 */
|
|
|
bool IsClosed();
|
|
|
/** @brief 添加边界,返回1表示添加成功 */
|
|
|
bool AddBorder(CCurve& border);
|
|
|
|
|
|
int npt; //中心点序号
|
|
|
CPoint3D* ppt; //中心点指针
|
|
|
list<CPoint3D> m_nodPoints;
|
|
|
|
|
|
private:
|
|
|
/** @brief 找到中心点最小包围曲线,将点存入ptlist*/
|
|
|
bool MinClosedCurve(CCurve& nodCur, CCurve& border,CPointList& ptlist);
|
|
|
};
|
|
|
|
|
|
|
|
|
class AFX_EXT_CLASS CVoronoi:public CTriangulation
|
|
|
{
|
|
|
public:
|
|
|
CVoronoi(void);
|
|
|
virtual ~CVoronoi(void);
|
|
|
|
|
|
public:
|
|
|
/** @brief 生成Voronoi图 */
|
|
|
int CreateVoronoiMap(CCurve* border = NULL);
|
|
|
/** @brief 读取2D散点数据 */
|
|
|
virtual int ReadPoints(vector<double>& X, vector<double>& Y);
|
|
|
virtual int ReadPoints(int num, double* X, double* Y);
|
|
|
|
|
|
/** @brief 清空类成员*/
|
|
|
virtual void ClearAll();
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////
|
|
|
//图件生成之后的调用函数
|
|
|
//
|
|
|
/** @brief 获得生成的Voronoi图的区域线*/
|
|
|
int GetUnitCurve(int nIndex, CCurve& pCurve);
|
|
|
/** @brief 获得生成的Voronoi图的区域线个数*/
|
|
|
int GetUnitCount() { return (int)m_VUnitList.size(); }
|
|
|
/** @brief 将Voronoi图写入文件*/
|
|
|
void Write(char* filename);
|
|
|
|
|
|
private:
|
|
|
/** @brief 求取两结点中点*/
|
|
|
bool MidPoint(int npt1, int npt2,CPoint3D& mpt);
|
|
|
/** @brief 求取两结点中点*/
|
|
|
bool MidPoint(CPoint3D& pt1, CPoint3D& pt2,CPoint3D& mpt);
|
|
|
/** @brief 由边界条件生成Voronoi图*/
|
|
|
virtual int Create();
|
|
|
/** @brief 由边界选择数据点,删除边界外的数据点*/
|
|
|
void SelectPointsByBorder();
|
|
|
/** @brief 生成单个龟背图元*/
|
|
|
bool CreateVoronoiUnit(int npt, int nTri, CVoronoiUnit& vunit);
|
|
|
/** @brief 单方向追踪nTri相邻三角形中的Voronoi结点,addMode == 0为尾部添加点,1 为头部添加 */
|
|
|
virtual int OneWayTrace(int& nTri, int& npt1, int& npt2, set<int>& FDTriNos,list<CPoint3D>& nodlist, int addMode = 0);
|
|
|
/** @brief 曲线延伸到边界,求交点桩号*/
|
|
|
bool ExtendToBorder(list<CPoint3D>& nodlist, double& l0 , double extlen);
|
|
|
/** @brief 生成包络曲线 */
|
|
|
bool CreateEnvelopeCurve();
|
|
|
/** @brief生成外心点数组*/
|
|
|
bool CreateCirCenterPoints();
|
|
|
|
|
|
private:
|
|
|
/** @brief 三角形外心*/
|
|
|
vector<CPoint3D*> m_CCPoints;
|
|
|
/** @brief 所有龟背图元容器*/
|
|
|
vector<CVoronoiUnit*> m_VUnitList;
|
|
|
/** @brief Voronoi图边界线 */
|
|
|
CCurve m_Border;
|
|
|
/** @brief 网格包络线*/
|
|
|
CCurve m_OutlineCurve;
|
|
|
};
|
|
|
|