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.

444 lines
15 KiB
C

1 month ago
/************************************************************************
<EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Triangulation.h
************************************************************************/
#pragma once
#ifndef AFX_EXT_CLASS
#define AFX_EXT_CLASS Q_DECL_IMPORT
#endif
#include <vector>
#include <list>
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <set>
#include <map>
#include "../GBase/point2d.h"
#include "mycurve.h"
using namespace std;
#define SCATTERPOINT_MODE 0 //ɢ<><C9A2>ģʽ
#define LINEARPOINT_MODE 1 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
#define POLYGON_MODE 2 //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģʽ
#ifndef ZERO6
#define ZERO6 1e-6
#endif
namespace NVoronoi
{
class AFX_EXT_CLASS CTriangle
{
public:
CTriangle();
CTriangle(const CTriangle& c);
CTriangle& operator= (const CTriangle& c);
~CTriangle();
/** @brief<65><66><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>ƽ<EFBFBD><C6BD>ϵ<EFBFBD><CFB5>A,B,C,D,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>*/
bool CreatePlane();
void Initial();
/** @brief<65>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>*/
bool IsEmpty();
/** @brief <20><><EFBFBD>߶<EFBFBD><DFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><E3A3AC><EFBFBD>޽<EFBFBD><DEBD><EFBFBD><E3A3AC><EFBFBD><EFBFBD>false*/
bool CrossPoint(CPoint3D& pt1, CPoint3D& pt2,CPoint3D& cspt);
/** @brief <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><5A><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A3AC><EFBFBD><EFBFBD>false*/
bool GetZValue(double x, double y ,double& z);
/** @brief <20>жϸ<D0B6><7A>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
bool IsZOnTriangle( double z );
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>ߵĽ<DFB5><C4BD><EFBFBD> */
bool GetCircumCenter(CPoint3D& ccpt);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵĽ<DFB5><C4BD><EFBFBD>*/
bool GetGravityCenter(CPoint3D& gcpt);
/** @brief <20><><EFBFBD><EFBFBD>ijһ<C4B3><D2BB><EFBFBD><EFBFBD><EFBFBD>ڶԱ<DAB6><D4B1>ϵĴ<CFB5><C4B4><EFBFBD>*/
bool GetOrthoPoint(CPoint3D& rpt,int npt1,int npt2);
/** @brief <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2Dƽ<44><C6BD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>н<EFBFBD><D0BD><EFBFBD>*/
int IsCross2D(CMyCurve& curve);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2Dƽ<44><C6BD><EFBFBD>ϵĽ<CFB5><C4BD><EFBFBD>*/
int Cross2D(CMyCurve& curve, vector<CPoint3D>& listCross);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD>, <20><><EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD>step<65><70><EFBFBD><EFBFBD><EFBFBD>ؼ<EFBFBD><D8BC>ܵĵ<DCB5><C4B5><EFBFBD><EFBFBD><EFBFBD>*/
int InterInfill(vector<CPoint3D*>& newPtVec, double step);
/** @brief <20><>ȡ<EFBFBD><C8A1>xyƽ<79><C6BD><EFBFBD><EFBFBD>ͶӰ<CDB6><D3B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
double GetArea2D(void);
/** @brief <20><>ȡ<EFBFBD>ռ<EFBFBD><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
double GetArea3D(void);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱպ<DDB1><D5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD>IJ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
double Volume(double dClosedZ);
/** @brief <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>λ<EFBFBD><CEBB>*/
public:
CRect8 GetRect(void);
void GetRange(CRect8 &range);
BOOL IsInTriangle(CPoint2D& pt) { return IsPtInside2D(pt); } //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
/** @brief <20>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
bool IsIncludePoint(int nPointIndex);
/** @brief <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7>޽<EFBFBD><DEBD><EFBFBD> */
bool IsTriBodySeparated(CTriangle& tri);
/** @brief <20><><EFBFBD><EFBFBD>֪<EFBFBD><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ų<EFBFBD><C5B2>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>-1*/
int The3rdPoint(int nt1,int nt2);
/** @brief <20><><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ˢ<EFBFBD><EFBFBD><C2B6><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>ַ */
bool RefreshPointers(vector<CPoint3D*>& PointsVec );
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
static double CrossProduct(double& x1, double& y1, double& x2, double& y2);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
static double DotProduct(double& x1, double& y1, double x2, double& y2);
private:
/** @brief <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD>ù<EFBFBD>ϵ<EFBFBD><CFB5>1 Ϊͬ<CEAA>࣬ 0 Ϊ<><CEAA><EFBFBD>࣬ 11 Ϊ<><CEAA>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD>ϣ<EFBFBD>22Ϊ<32><CEAA>2<EFBFBD><32>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD>*/
int IsPtsOneSide(CPoint3D& pt1, CPoint3D& pt2);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><EFBFBD><E6B7BD><EFBFBD><EFBFBD>ֵ */
double EquationValue(double x, double y, double z);
double EquationValue(CPoint3D& pt);
/** @brief <20>жϵ<D0B6><CFB5>Ƿ<EFBFBD>λ<EFBFBD><CEBB>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD> */
bool IsPtOnPlane(CPoint3D& pt);
/** @brief <20>жϵ<D0B6><CFB5><EFBFBD>XOYƽ<59><C6BD><EFBFBD>ϵ<EFBFBD>ͶӰ<CDB6>Ƿ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>XOY<4F><59><EFBFBD><EFBFBD>ͶӰ<CDB6><D3B0><EFBFBD>ڲ<EFBFBD>,<2C><><EFBFBD><EFBFBD>2<EFBFBD><32>ʾ<EFBFBD>ڱ߽<DAB1><DFBD><EFBFBD><EFBFBD><EFBFBD>*/
int IsPtInside2D(CPoint2D& pt);
int IsPtInside2D(double x, double y);
/** @brief <20>жϵ<D0B6><CFB5>Ƿ<EFBFBD><C7B7>ڿռ<DABF><D5BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>*/
int IsPtInside3D(CPoint3D& pt);
private:
/** @brief <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>θ<EFBFBD><CEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ*/
bool GetExtremeValues();
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD>ų⣬<C5B3>жϵ<D0B6><CFB5>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ*/
bool IsPtOutTriBody(CPoint3D& pt);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD>ų⣬<C5B3>жϵ<D0B6><CFB5>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ*/
bool IsPtOutTriSquare(CPoint2D& pt);
/** @brief <20>ж<EFBFBD><D0B6>߶<EFBFBD><DFB6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ⲿ */
bool IsSegmentOutTriBody(CPoint3D& pt1, CPoint3D& pt2);
/** @brief <20>ж<EFBFBD><D0B6>߶<EFBFBD><DFB6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӿ<EFBFBD><D3BE><EFBFBD><EFBFBD>ⲿ */
bool IsSegmentOutTriSquare(double x1, double y1, double x2, double y2);
//<2F>踳ֵ<E8B8B3><D6B5>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>
public:
int npt[3]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPoint3D* ppt[3]; //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
int neighbor[3]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
public:
double m_xMin, m_yMin,m_zMin,m_xMax,m_yMax,m_zMax; //<2F><><EFBFBD><EFBFBD><EFBFBD>θ<EFBFBD><CEB8><EFBFBD><EFBFBD>꼫ֵ
double A,B,C,D; // <20><><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>Ax+By+Cz+D = 0 <20>ĸ<EFBFBD><C4B8><EFBFBD>ϵ<EFBFBD><CFB5> <20><><EFBFBD>У<EFBFBD><D0A3><EFBFBD>A,B,C<><43>Ϊƽ<CEAA><EFBFBD><E6B7A8><EFBFBD><EFBFBD>
};
//Ϊ<>˼<EFBFBD><CBBC>ٲ<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD>ٶȣ<D9B6><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>й<EFBFBD><D0B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD>ٵ<EFBFBD><D9B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3>Ӷ<EFBFBD><D3B6><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class AFX_EXT_CLASS CGridSort
{
public:
CGridSort();
virtual ~CGridSort();
virtual int Create(int numx, int numy, double x0, double y0, double dx, double dy);
double xGrid(double x); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double yGrid(double x);
double x(int i);
double y(int j);
double xmin(void) { return P0[0]; }
double ymin(void) { return P0[1]; }
double xmax(void);
double ymax(void);
LONG& xnum(void) { return num[0]; }
LONG& ynum(void) { return num[1]; }
double& dx(void) { return delt[0];}
double& dy(void) { return delt[1];}
CRect8 GetRect(int i, int j);
bool IsIndexX(int i) { if(i<0 || i>=num[0]) return false; else return true; }
bool IsIndexY(int j) { if(j<0 || j>=num[1]) return false; else return true; }
protected:
LONG num[2]; ///< <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double P0[2]; ///< ԭ<><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
double delt[2]; ///< <20><><EFBFBD><EFBFBD>
};
class AFX_EXT_CLASS CGridSortIndex
: public CGridSort
{
public:
CGridSortIndex();
virtual ~CGridSortIndex();
public:
void AttachTriangulation(void* pData) { m_pTriData = pData; }
virtual int Create(int numx, int numy, double x0, double y0, double dx, double dy);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void SplitTriangle(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int GetVectorTriangle(int i, int j, vector<CTriangle*>& tg);
//<2F><><EFBFBD>÷<EFBFBD>Χ<EFBFBD>ڵ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A3AC>ȥ<EFBFBD><C8A5><EFBFBD>ظ<EFBFBD>ָ<EFBFBD><D6B8>
int GetCombinVectorTriangle(vector<CTriangle*>& outVec, int nStartRow, int nStartCol, int nStopRow, int nStopCol);
vector<int>& GetIndexTriangle(int i, int j);
//ɢ<><C9A2>
void SplitPoints(); //<2F><><EFBFBD><EFBFBD>
int FindPointIndex(CPoint2D& pt, double dError = 1e-3);
int GetVectorPoints(int i, int j, vector<CPoint3D*>& tg);
//<2F><><EFBFBD>÷<EFBFBD>Χ<EFBFBD>ڵ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E9A3AC>ȥ<EFBFBD><C8A5><EFBFBD>ظ<EFBFBD>ָ<EFBFBD><D6B8>
int GetCombinVectorPoints(vector<CPoint3D*>& outVec, int nStartRow, int nStartCol, int nStopRow, int nStopCol);
vector<int>& GetIndexPoint(int i, int j);
protected:
class CGridOne
{
public:
CGridOne() { };
void Empty() { m_vecIndex.clear(); }
vector<int> m_vecIndex;
};
//һ<><D2BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CGridOne* m_pGridPoints;
CGridOne* m_pGridTriangles;
void* m_pTriData; //CTriangulation*
CGridOne* GetGridPoints(int i, int j);
CGridOne* GetGridTriangle(int i, int j);
};
//<2F><><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><DFB6><EFBFBD>
class AFX_EXT_CLASS CTEdge
{
public:
CTEdge();
/** @brief <20>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>*/
bool Create(int np1,int np2);
bool operator == ( const CTEdge& seg) const;
bool operator < ( const CTEdge& seg) const;
/** @brief <20>õ<EFBFBD><C3B5><EFBFBD>n<EFBFBD><6E><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int Pt(int n) const;
private:
int npt[2]; ///< <20>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>ţ<EFBFBD>npt[0]<npt[1]
};
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
typedef map<int, int* > LNOMAP; ///< <20><>¼ÿ<C2BC><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>Ӧɢ<D3A6><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼλ<CABC><CEBB>
class AFX_EXT_CLASS CTriangulation
{
public:
CTriangulation();
CTriangulation(const CTriangulation& c);
CTriangulation& operator = (const CTriangulation& c);
virtual ~CTriangulation();
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
virtual void ClearAll();
//<2F><>д
public:
/** @brief <20><>Net<65><74><EFBFBD><EFBFBD>ʽ<EFBFBD><EFBFBD><E6B4A2>dft<66>ļ<EFBFBD><C4BC><EFBFBD>*/
#ifndef _QT_VERSION
bool WriteFile(char* filename, char* projectname = NULL);
#endif
/** @brief <20><>dft<66>ļ<EFBFBD><C4BC>ж<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>*/
bool ReadFile(char* filename);
/** @brief ɢ<><C9A2><EFBFBD><EFBFBD><EFBFBD>ݶ<EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>*/
virtual int ReadPoints(vector<double>& X, vector<double>& Y,vector<double>& Z);
virtual int ReadPoints(vector<double>& X, vector<double>& Y,vector<double>& Z, vector<int>& Attr,int attrnum = 1);
int ReadPoints(int num, double* X, double* Y, double* Z);
int SetPoints(vector<CPoint3D*>& pointSet); //<2F><>pointSet<65>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void AddPoint(double x, double y, double z);
//<2F><><EFBFBD><EFBFBD>
public:
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ0<CEAA><30>ʾ<EFBFBD><CABE>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>񣬲<EFBFBD><F1A3ACB2><EFBFBD>Ϊ1<CEAA><31>ʾ<EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD>Է<EFBFBD><D4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
virtual int Create(int createMode = SCATTERPOINT_MODE);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dfd<66><64>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>*/
void WriteTriangles(char* filename);
/** @brief <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ*/
int NumberOfTriangles();
/** @brief <20><><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD>Ŀ*/
int NumberOfPoints();
/** @brief <20><>ȡָ<C8A1><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><5A><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E2A3AC><EFBFBD><EFBFBD>false*/
bool GetZValue(double x, double y ,double& z);
/** @brief <20>߶<EFBFBD><DFB6>ϲ<EFBFBD>ֵ<EFBFBD>õ<EFBFBD><5A><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
bool GetZPoint( double z,CPoint3D& pt1, CPoint3D& pt2, CPoint3D& pt);
/** @brief <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>triNo<4E><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD><EFBFBD>ڱ<EFBFBD>Ϊnpt1,npt2<74><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
int GetNeighborTriangle(int triNo,int npt1, int npt2);
/** @brief <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>nptΪ<74><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ntri Ϊ<><CEAA>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
int GetCommonPointTriangles(int npt,list<int>& tNOLST,int ntri = -1);
/** @brief ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>Χ<EFBFBD><CEA7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void DeleteOuterTriangles();
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1>߼<EFBFBD><DFBC>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD>Ϊstep,<2C><><EFBFBD>ؼ<EFBFBD><D8BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5>µ<EFBFBD><C2B5><EFBFBD>Ŀ */
int InfillSegPoints(vector<CPoint3D*>& newPtVec, double step);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߽磩<DFBD><E7A3A9><EFBFBD>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ܲ<EFBFBD><DCB2><EFBFBD>Ϊstep,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5>µ<EFBFBD><C2B5><EFBFBD>Ŀ */
int InfillInterPoints(vector<CPoint3D*>& newPtVec, double step);
/** @brief <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>*/
bool IsPointVecEmpty();
/** @brief <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ<EFBFBD><CEAA>*/
bool IsTriangleVecEmpty();
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ٶ<EFBFBD><D9B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ָ<EFBFBD><D6B8>NULL<4C><4C><EFBFBD><EFBFBD><EFBFBD><EFBFBD>m_TriangleList <20><>˳<EFBFBD><CBB3><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD> */
bool DeleteMultiTriangles(list<int>& nolst);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> regenerate outline, <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
int RegenOutline();
/** @brief <20>õ<EFBFBD><C3B5>߽<EFBFBD><DFBD><EFBFBD><>ܷ<EFBFBD><DCB7><EFBFBD>false*/
bool GetOutlineCurve(CMyCurve& curve);
//<2F><>ȡ<EFBFBD><C8A1>ֵ<EFBFBD><D6B5>brecaltri<72><69>ʾ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>¼<EFBFBD><C2BC><EFBFBD><E3B5A5><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD>ֵ
int GetExtremeValues(bool bRecalTri = false);
//<2F><>linkedmap<61><70>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8> linkedPtsmap<61>е<EFBFBD><D0B5><EFBFBD>Чֵ<D0A7><D6B5><EFBFBD>в<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ɲ<EFBFBD>ֵ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>Ƴ<EFBFBD>
void InterpolateInvalidNodes(map<int, vector<int> >& linkedPtsMap, double invalidVal);
//<2F><>linkedmap<61><70>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8> linkedPtsmap<61>е<EFBFBD><D0B5><EFBFBD>Чֵ<D0A7><D6B5><EFBFBD>в<EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD>ɲ<EFBFBD>ֵ<EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD>Ƴ<EFBFBD>
void InterpolateInvalidNodes(map<int, vector<int> >& linkedPtsMap);
/*void InterpolateInvalidNodes(vector<int>& nodeIndexs);*/
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>в<EFBFBD>ֵ
void InterpolateInvalidNodes(double invalidVal);
//<2F><><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Ĭ<EFBFBD><C4AC>z>1e20Ϊ<30><CEAA>Ч<EFBFBD><D0A7>
void InterpolateInvalidNodes(void);
//<2F><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD>
void GetLinkedNodes(int iPt,vector<int>& linkedNodes, bool bUsingSortGrid = true);
//<2F><>ȡһ<C8A1><D2BB><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD><D3B5><EFBFBD><EFBFBD>н<EFBFBD><D0BD><EFBFBD>,iTriΪ<69>ý<EFBFBD><C3BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void GetLinkedNodes(int iPt, int iTri, vector<int>& linkedNodes);
/** @brief <20><><EFBFBD>е<EFBFBD><7A><D6B5><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>̶<EFBFBD>ֵdz <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD>ߴ<EFBFBD><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void IncreasePointZ(double dz);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>бߴ<D0B1><DFB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> m_nTEdgeVec*/
int CreateAllEdges();
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>αߵ<CEB1><DFB5><EFBFBD>Ŀ*/
int NumberofEdges() { return (int)m_nTEdgeVec.size(); }
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>α<EFBFBD><CEB1><EFBFBD><EFBFBD><EFBFBD>*/
vector<int>& GetEdges() { return m_nTEdgeVec; }
//ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>Ϊ<EFBFBD><CEAA>Чֵ<D0A7><D6B5> ww 2019-3-14
void DeleteInvalidTriangles(void);
//<2F><EFBFBD><E0BDBB><EFBFBD><EFBFBD>
public:
/** @brief m_TriangleList<73><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>п<EFBFBD>ָ<EFBFBD><D6B8>,<2C><><EFBFBD>ؿ<EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
int DeleteAllNullTriangles();
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB> */
void Offset(double dx, double dy);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD>û<EFBFBD><C3BB>ѡ<EFBFBD><D1A1>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>-1 */
int FindPointIndex(CPoint2D& pt, double dError = 1e-3);
CPoint3D* GetPoint(int nIndex) { return m_PointVec[nIndex]; }
/** @brief <20><><EFBFBD>ð<EFBFBD><C3B0><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD>ذ<EFBFBD><D8B0><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>θ<EFBFBD><CEB8><EFBFBD>*/
int GetTrianglesIncludePoint(int nIndex, vector<CTriangle*>& outSet);
bool IsInRangeZ(double z0);
long SetValueZ(double a, int nModeSel);
void ScaleZ(double dScale);
int CrossCurve2D(CMyCurve& border, CPointList& listCross);
/** <20><>CGrid<69>еĶ<D0B5><C4B6><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD><C3B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ+ƽ<><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void Smooth(double smooth_coef = 1.0);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
protected:
/** @brief <20>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ζ<EFBFBD><CEB6><EFBFBD>,<2C><><EFBFBD>ظö<D8B8><C3B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ţ<EFBFBD><C5A3>Լ<EFBFBD><D4BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
bool GetMinVertex(int& nVertex,int& nTri);
/** @brief <20><><EFBFBD><EFBFBD>֪<EFBFBD>߶κͳ<CEBA>ʼ<EFBFBD><CABC><EFBFBD>õ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD>պϻ<D5BA>,<2C><><EFBFBD><EFBFBD>destClosureVec<65><63>*/
bool GetClosure(int nFristPt,list<CTEdge*>& sourEdgeLst, vector<int>& destClosureVec);
bool GetZValue(vector<CTriangle*>& tg, double x, double y ,double& z);
/** @brief <20><><EFBFBD>ð<EFBFBD><C3B0><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD>ذ<EFBFBD><D8B0><EFBFBD><EFBFBD>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>θ<EFBFBD><CEB8><EFBFBD>*/
int GetTrianglesIncludePoint(int nIndex, vector<CTriangle*>& inSet, vector<CTriangle*>& outSet);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC>߶<EFBFBD><DFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD> */
bool CrossPoint(CPoint3D& pt1, CPoint3D& pt2, CPoint3D& cspt, vector<CTriangle*>& tg);
private:
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>ߺŴ<DFBA><C5B4><EFBFBD>m_pointattributevec<65><63>*/
int CreateByLine();
/** &brief <20><><EFBFBD>ߺ<EFBFBD>Ϊlno<6E>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
/*int CreateInPolygon(int lno = 0);*/
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>, bno eno<6E><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD><CEB2><EFBFBD>ݵ<EFBFBD><DDB5><EFBFBD><EFBFBD><EFBFBD>*/
int AddSubNet(int bno, int eno, int createMode );
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>lno<6E><6F><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD>ϵ*/
int SetNeighbor(int btr, int etr,int lno);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD><E4BDA8><EFBFBD><EFBFBD><EFBFBD>ڹ<EFBFBD>ϵ*/
int SetNeighbor(int ntr1, int ntr2);
/** @brief <20>г<EFBFBD><D0B3><EFBFBD><EFBFBD><EFBFBD>,CutModeΪ<65>г<EFBFBD><D0B3><EFBFBD>ʽ<EFBFBD><CABD><30><CEAA><EFBFBD>У<EFBFBD><31><CEAA><EFBFBD><EFBFBD>*/
BOOL CutNet(CMyCurve& border,int CutMode);
/** @brief <20>жϵ<D0B6><CFB5>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ڰ<EFBFBD><DAB0><EFBFBD><EFBFBD><EFBFBD>*/
bool IsPtOnOutline(int ptNo);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>ָ<EFBFBD><D6B8>NULL */
bool NullOneTriangle(int triNo);
/** @brief <20>ж<EFBFBD><D0B6>߶<EFBFBD><DFB6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><EFBFBD>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD>ܴ<EFBFBD><DCB4><EFBFBD>*/
bool IsSegmentOutNetBody(CPoint3D& pt1, CPoint3D& pt2);
/** @brief <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD> */
bool IsTriOutNetBody(CTriangle& tri);
/** @brief ɾ<><C9BE>ɢ<EFBFBD><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void DeletePointList();
/** @brief ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void DeleteTriangleList();
/** @brief <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ཻ */
bool IsNetBodySeparated(CTriangulation& tNet);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>
private:
/** @brief<65><66><EFBFBD>ߺž<DFBA><C5BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void SimplifyByLineNo();
/** @brief<65><66><EFBFBD>ߺž<DFBA><C5BE>򲿷<EFBFBD><F2B2BFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
void SimplifyByLineNo(int btr, int etr);
/** @brief <20><><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>²<EFBFBD><C2B2><EFBFBD>*/
bool RebuildSameLineTriangles();
/** @brief <20><><EFBFBD>¹<EFBFBD><C2B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>ߣ<EFBFBD>npt1,npt2Ϊ<32><CEAA><EFBFBD>ڱ<EFBFBD> bVerifyNewEdgeInnerΪ<72>Ƿ<EFBFBD><C7B7><EFBFBD>֤<EFBFBD>±<EFBFBD><C2B1><EFBFBD><EFBFBD>ı<EFBFBD><C4B1><EFBFBD><EFBFBD>ڲ<EFBFBD>*/
bool RebuildTwoTriangles(int ntr1, int ntr2, int npt1, int npt2, bool bVerifyNewEdgeInner = true);
/** @brief <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>ߺ<EFBFBD><DFBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
bool IsLinearNeighbor(const int& npt1, const int& npt2);
/** @brief <20><><EFBFBD>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>Ų<EFBFBD>ѯmap*/
bool CreateLineDataMap();
/** @brief ɾ<><C9BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>Ų<EFBFBD>ѯmap*/
void DeleteLineDataMap();
//<2F><>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>
public:
/** @brief ɢ<><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
vector<CPoint3D*> m_PointVec;
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD>*/
int m_NumofPointAttributes;
/** @brief ɢ<><C9A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
vector<int> m_PointAttributeVec;
/** @brief <20><><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
vector<CTriangle*> m_TriangleVec;
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EABCAB><EFBFBD><EFBFBD>Сֵ */
CPoint3D m_ptMax;
CPoint3D m_ptMin;
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>ϵ<EFBFBD><CFB5><EFBFBD><EFBFBD>ݵ<EFBFBD>,<2C><>β<EFBFBD><CEB2><EFBFBD><EFBFBD> */
vector<int> m_nOutlinePoints;
void CreateGridSort();//<2F><><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//˽<>б<EFBFBD><D0B1><EFBFBD>
private:
CGridSortIndex m_gridSort; ///< <20><>Ϊ<EFBFBD>˼<EFBFBD><CBBC>ٻ<EFBFBD><D9BB><EFBFBD><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
vector<int> m_nTEdgeVec; ///< <20><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>б߶˵㣬<CBB5><E3A3AC><EFBFBD><EFBFBD>0<EFBFBD><30>1<EFBFBD><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>
list<int> m_SameLineTriNoLst; ///< <20>洢3<E6B4A2><33><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߺ<EFBFBD><DFBA><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
LNOMAP m_lmp; ///< <20><>¼ÿ<C2BC><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: key <20>ߺ<EFBFBD>, value <20><><EFBFBD><EFBFBD>[2]
};
/** @brief <20><><EFBFBD>߶ν<DFB6><CEBD>м<EFBFBD><D0BC>ܣ<EFBFBD><DCA3><EFBFBD><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵĵĵ㼯<C4B5><E3BCAF><EFBFBD><EFBFBD>CPoint3D<33><44><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
int Infill(vector<CPoint3D* >& newPtVec,CPoint3D& pt1, CPoint3D& pt2,double step);
}; //namespace NTriangle
using namespace NVoronoi;