|
|
|
|
|
|
|
|
|
|
|
/************************************************************************
|
|
|
|
|
|
<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>Zֵ<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>zֵ<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>Zֵ<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>Zֵ<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>zֵ<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>0Ϊ<30><CEAA><EFBFBD>У<EFBFBD>1Ϊ<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;
|