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++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/************************************************************************/
/* 类名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;
};