/************************************************************************/ /* 类名:CVoronoi */ /* 功能:由散点生成Voronoi图(龟背图) */ /* 王昌伟 2011-12-1 */ /************************************************************************/ #pragma once #include "Triangulation.h" #include //单个Voronoi图元 class CVoronoiUnit { public: CVoronoiUnit(); /** @brief判断该图元是否闭合 */ bool IsClosed(); /** @brief 添加边界,返回1表示添加成功 */ bool AddBorder(CCurve& border); int npt; //中心点序号 CPoint3D* ppt; //中心点指针 list 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& X, vector& 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& FDTriNos,list& nodlist, int addMode = 0); /** @brief 曲线延伸到边界,求交点桩号*/ bool ExtendToBorder(list& nodlist, double& l0 , double extlen); /** @brief 生成包络曲线 */ bool CreateEnvelopeCurve(); /** @brief生成外心点数组*/ bool CreateCirCenterPoints(); private: /** @brief 三角形外心*/ vector m_CCPoints; /** @brief 所有龟背图元容器*/ vector m_VUnitList; /** @brief Voronoi图边界线 */ CCurve m_Border; /** @brief 网格包络线*/ CCurve m_OutlineCurve; };