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.

307 lines
12 KiB
C

1 month ago
//////////////////////////////////////////////////////////////////////////////
//<2F>ļ<EFBFBD> Curve.h
/////////////////////////////////////////////////////////////////////////////
// Curve.h: interface for the CCurve class.
#if (_MSC_VER > 1000)
#pragma once
#endif // _MSC_VER > 1000
#ifndef _MSC_VER
#pragma once
#endif
#ifndef AFX_EXT_CLASS
#define AFX_EXT_CLASS Q_DECL_IMPORT
#endif
#include "Name.h"
#include <vector>
#include <list>
#include "../GBase/Point2D.h"
#include "../GBase/Rect8.h"
#include "../GBase/CrossPoint.h"
#include "../TBase/TObjectList.h"
#include "../GBase/BaseFunction.h"
#include "../GBase/IOFile.h"
#include "../InterfaceElements.h"
using std::vector;
using std::list;
//typedef TList<CCrossPoint> CCrossList;
typedef TList<POSITION> CPositionList;
namespace GObjects
{
class CMyCurve;
//<2F>߶<EFBFBD><DFB6><EFBFBD>
class AFX_EXT_CLASS VSegment
{
public:
VSegment(void);
// m_pt1 <20><>m_pt2<74><32><EFBFBD><EFBFBD>
void Create(const GBase::CPoint2D& pt1, const GBase::CPoint2D& pt2);
bool operator==(const VSegment& other) const;
bool operator<(const VSegment& other) const;
//<2F><><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>
CMyCurve* CreateCurve(void) const;
GBase::CPoint2D GetPt1(void) const;
GBase::CPoint2D GetPt2(void) const;
double GetLength(void) const;
//<2F><>ȡб<C8A1><D0B1>
double GetK(void) const;
//<2F>Ƿ<EFBFBD>ƽ<EFBFBD><C6BD>
bool IsParallel(const VSegment& other) const;
//pt<70>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
bool IsPtOnSegment(const GBase::CPoint2D& pt) const;
//<2F><><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><DFB6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>غϲ<D8BA><CFB2>֣<EFBFBD><D6A3><EFBFBD>β<EFBFBD><CEB2><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>غ<EFBFBD>
bool HasRepeatedSection(const VSegment& other) const;
private:
double GetK(const GBase::CPoint2D& pt1, const GBase::CPoint2D& pt2) const;
GBase::CPoint2D m_pt1;
GBase::CPoint2D m_pt2;
double m_k;
};
class AFX_EXT_CLASS CMyCurve : public CName
{
public:
CMyCurve();
CMyCurve(int num);
CMyCurve(CMyCurve& cur);
virtual ~CMyCurve();
//G_CLONE_ELEMENT(CCurve)
virtual CString GetXmlType() { return _T("Pline"); }
virtual void Clear(void);
virtual GBase::CRect8 GetRect(void); ///< <20><>ȡ<EFBFBD><C8A1><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD>С<EFBFBD><D0A1><EFBFBD>Ӿ<EFBFBD><D3BE><EFBFBD> added ww 2014-9-15
virtual void Offset(double dx, double dy);
virtual void ScaleCoor(double xs, double ys, double dx, double dy);
virtual void Rotate(double xs, double ys, double angle);
virtual BOOL SetPoints(GBase::CPointList &dp, int nnPoint, BOOL IsAutoLocation = TRUE);
virtual BOOL SetPoints(GBase::CPoint2D *pPts, int nnPoint, BOOL IsAutoLocation = TRUE);
public:
int Create(int num);
int CreateCurveFromRect(GBase::CRect8* pRect);
int CreateCurveFromRect(GBase::CRect8* pRect, int iBevel);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD><DFA3><EFBFBD><EFBFBD>ɽǶȲ<C7B6><C8B2><EFBFBD>angleStep,type=0:Arc,1:Chord, 2:Pie
int CreateCurveFromEllipse(GBase::CPoint2D centerPoint, GBase::CSize8 szRadius, double angleStep,
double arc1 = 0.0, double arc2 = 360.0, int type = 0);
int CreateCurveFromEllipse(GBase::CRect8* pRect, double angleStep, double arc1 = 0.0, double arc2 = 360.0, int type = 0);
int Read(CString strPathFile, long offset);
int Read(IOFile& fr, double m_z);
void Write(FILE* &fw);
BOOL IsClosed(double dDistance = 1e-10); //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD>պ<EFBFBD>
void SetToClose();
int Cross(CMyCurve &c2, TList<CCrossPoint> &xy);
//int Trim(CCurve &m_curve,CDFile& fw);
int FindIndex(double xx, double yy, double err);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľڵ<C4BD>
BOOL LocationIsInRange(double l0);
int IsInside(double xm, double ym); //<2F><><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int IsInside(CMyCurve& curve); //<2F>ж<EFBFBD>curve<76>Ƿ<EFBFBD><C7B7>ڵ<EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>1<EFBFBD><31>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD>0<EFBFBD><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2>ֲ<EFBFBD><D6B2>ڷ<EFBFBD><DAB7><EFBFBD>-1
BOOL IsInRange(GBase::CRect8& range);
int CrossLine(double *linex, double *liney, TList<CCrossPoint> &m_cross);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD>߽<EFBFBD><DFBD><EFBFBD>ɹ<EFBFBD><C9B9><EFBFBD><EFBFBD><EFBFBD>1 ʧ<>ܷ<EFBFBD><DCB7><EFBFBD>0 x0,y0Ϊֱ<CEAA><D6B1><EFBFBD><EFBFBD>һ<EFBFBD>㣬 (vx,vy<76><79>Ϊֱ<CEAA><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>vector<dfpoint><3E><> added by ww
int CrossLine(double x0, double y0, double vx, double vy, vector<GBase::dfPoint>& crpoints);
void GetLocation();
void GetLocation3D();
void Reversal();
BOOL Extend(double extendLength, int sel);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,sel=0<><30><EFBFBD><EFBFBD>ͷ,sel=1<><31><EFBFBD><EFBFBD>β
void Smooth53(int ntimes); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ι<CEB9><E2BBAC>ntimes = <20><EFBFBD><E2BBAC><EFBFBD><EFBFBD>
//<2F><><EFBFBD>ܽڵ<DCBD>
void EncryptNode(int nMode, double step, BOOL bInteger);
//<2F>ɸ<EFBFBD><C9B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߣ<EFBFBD>bReserveVertexΪtrue<75><65>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ԭʼ<D4AD><CABC> 2019.3.12
void Infill(double dl, bool bVertexReserved = true);
int RemoveSamePoint(double dMinDistance); //<2F>Ƴ<EFBFBD><C6B3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD>Ľڵ<C4BD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>
int RedundantPoint(double dMinDistance); //<2F><><EFBFBD><EFBFBD><EFBFBD>ڵ㣬<DAB5><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĸ<EFBFBD><C4B8><EFBFBD>
//bReverseΪ<65>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>, bAddHead<61>Ƿ񽫵<C7B7><F1BDABB5><EFBFBD><EFBFBD><EFBFBD>AddHead<61><64><EFBFBD><EFBFBD>б<EFBFBD><D0B1>ԣ<EFBFBD><D4A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>AddTail<69><6C><EFBFBD><EFBFBD>б<EFBFBD>β
void GetPoint(GBase::CPointList &dp, BOOL bReverse = FALSE, BOOL bAddHead = FALSE);
void GetPoint(CPointArr &dp, BOOL bReverse = FALSE, BOOL bAddHead = FALSE);
BOOL GetPoint(int nIndex, GBase::dfPoint& dp);
BOOL SetPoint(int nIndex, GBase::dfPoint& dp);
void SetPoint(int nIndex, double x0, double y0);
void SetPoint(int nIndex, double x0, double y0, double z0);
int GetCurve(double l1, double l2, GBase::CPointList &dp, int bDoubleHeadTail = 1, BOOL bNoLineValue = FALSE);
//ָ<><D6B8><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC><EFBFBD>ţ<EFBFBD><C5A3><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD>ҷ<EFBFBD>ʽGetCurve,<2C><><EFBFBD>ҽ<EFBFBD><D2BD><EFBFBD><EFBFBD>󷵻<EFBFBD>l2֮ǰ<D6AE><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʾ<EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>z<EFBFBD><7A>ֵ added by ww 2015-6-25
int GetCurve(int& startindex /* = 0*/, double l1, double l2, GBase::CPointList &dp, int bDoubleHeadTail = 1, BOOL bNoLineValue = FALSE, BOOL bIgnoreZ = FALSE);
int GetCurveOther(double l1, double l2, GBase::CPointList &dp, int bDoubleHeadTail = 1, BOOL bNoLineValue = FALSE);
int GetCoordinate(double m_location, double &x, double &y, double &z);
int GetCoordinate(double m_location, GBase::CPoint3D& pt);
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>׮<EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>location<6F><6E>Ӧ<EFBFBD>ĵ㣬<C4B5>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>׮<EFBFBD><D7AE>λ<EFBFBD>õ<EFBFBD>ǰһ<C7B0><D2BB><EFBFBD><EFBFBD><E3B4A6> Ĭ<>ϼ<EFBFBD><CFBC><EFBFBD>zֵ added by ww 2015-9-29
int GetCoordinate(int& nIndex, double location, GBase::CPoint3D& pt, bool bCalcZ = true);
//<2F><>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>׮<EFBFBD>ŵ<EFBFBD><C5B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˳<EFBFBD><CBB3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>location<6F><6E>Ӧ<EFBFBD>ĵ㣬<C4B5>ҵ<EFBFBD><D2B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŷ<EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD>׮<EFBFBD><D7AE>λ<EFBFBD>õ<EFBFBD>ǰһ<C7B0><D2BB><EFBFBD><EFBFBD><E3B4A6> Ĭ<>ϼ<EFBFBD><CFBC><EFBFBD>zֵ added by ww 2015-10-12
int GetCoordinate(int& nIndex, double location, double& xx, double& yy);
double GetAngle(double dLocation, GBase::CPoint3D* pCoor = NULL); //<2F><><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>׮<EFBFBD>Ŵ<EFBFBD><C5B4>ĽǶ<C4BD>
void GetRange(double& xmin, double& ymin, double& xmax, double& ymax, double* pzmin = 0, double* pzmax = 0, double invalidZ = 1e10);
double operator [](int i);
CMyCurve& operator =(const CMyCurve& t);
int GetCount() { return num; }
double Length(void);
double Area(void);
double xend(void);
double yend(void);
double lend(void);
/** @brief <20><EFBFBD><E3B5BD><EFBFBD>ߵľ<DFB5><C4BE>룬l0Ϊ<30><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>׮<EFBFBD><D7AE>, bAutoExtend<6E><64>ʾ<EFBFBD><CABE>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>ʱ<EFBFBD>Ƿ<EFBFBD><C7B7>ӳ<EFBFBD><D3B3><EFBFBD>β*/
double PointDistance(double x0, double y0, double& l0, bool bAutoExtend = true);
virtual int SetName(LPCTSTR lpString);
virtual CString GetName(void);
//<2F>жϲ<D0B6><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>dError<6F><72>Χ<EFBFBD><CEA7><EFBFBD>Ƿ<EFBFBD>Ϊֱ<CEAA><D6B1> ww 2015-5-11
bool IsStraightLine(double dError = 1e-6);
enum EClipType { ctIntersection = 0, ctUnion = 1, ctDifference = 2, ctXor = 3 };
//<2F><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>и<EFBFBD><D0B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ؽ<EFBFBD><D8BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int ClipPolygon(CMyCurve& subject, vector<CMyCurve*>& resultPgns, EClipType eType);
public:
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static DWORD GetCurveType(CString str);
static CString GetCurveTypeString(DWORD type);
public:
int m_type;
int num;
double *x, *y, *z, *l;
int nPoint; //ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x y z l <20><>
int ReturnPoint; //<2F><><EFBFBD>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> -1<><31>ʾΪ<CABE><CEAA><EFBFBD>ϲ<EFBFBD>
BOOL bAutoLocation;
protected:
void _ClearDC(TPtrList &dc);
int _CrossVC(double xm, int num, double *x, double *y, double *ycross);
int _CrossVSort(double xm, int num, double *x, double *y, double *ycross);
int GetOneValue(TPtrList &dc1);
//<2F>ϲ<EFBFBD>ͳ<EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD> add Wangcw
public:
//һ<>Ե<EFBFBD>
class PointPair
{
public:
PointPair(void) :dist(0.0), pt1(0, 0), pt2(0, 0) {};
bool operator<(const PointPair& other) { return dist < other.dist; }
void GetDist(void) { dist = pt1.Distance(pt2); }
double dist;
GBase::CPoint2D pt1;
GBase::CPoint2D pt2;
};
/** @brief <20>õ<EFBFBD><C3B5>պ<EFBFBD><D5BA><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><ECB3A4>*/
double GetClosureLength();
/** <20>õ<EFBFBD><C3B5>պ<EFBFBD><D5BA><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><ECB3A4>,<2C><>֪<EFBFBD><D6AA><EFBFBD><EFBFBD>*/
double GetClosureLength(double width);
/** <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><DFB6><EFBFBD>x<EFBFBD><78><EFBFBD>нǵ<D0BD>ƽ<EFBFBD><C6BD>ֵ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
double GetAverageAngle();
/** <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>XYƽ<59><C6BD><EFBFBD>Ͽ<EFBFBD><CFBF><EFBFBD>*/
bool GetClosureWidth(double& maxWid, double& minWid, double& aveWid);
/** <20><><EFBFBD><EFBFBD>֪<EFBFBD><D6AA><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>µõ<C2B5><C3B5><EFBFBD><EFBFBD><EFBFBD>XYƽ<59><C6BD><EFBFBD>Ͽ<EFBFBD><CFBF>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD>Ͼࣩ*/
bool GetClosureWidth(std::vector<CMyCurve*>& skeletonCurves, double& maxWid, double& minWid, double& aveWid);
/** ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF>ȱ<EFBFBD><C8B1>ǵ<EFBFBD>, <20><>pt<70>ԵĽṹ<C4BD><E1B9B9><EFBFBD><EFBFBD>dstBdPoints*/
int GetPolygonWidthPoints(std::vector<CMyCurve*>& skeletonCurves, std::list<PointPair>& dstBdPoints);
/** ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ο<EFBFBD><CEBF>ȱ<EFBFBD><C8B1>ǵ<EFBFBD>, <20><>pt<70>ԵĽṹ<C4BD><E1B9B9><EFBFBD><EFBFBD>dstBdPoints*/
int GetPolygonWidthPoints(CMyCurve* skl, std::list<PointPair>& dstBdPoints);
// /** <20><><EFBFBD>߶<EFBFBD><DFB6><EFBFBD>߽<EFBFBD><DFBD>㣬*/
// bool GetLineCrossPoints(double x0, double y0, double k, PointPair& dstPP);
/** <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD>߶Ȳ<DFB6>*/
bool GetClosureDZ(double& maxDZ, double& minDZ, double& aveDZ);
//ȥ<><C8A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָʾ<D6B8><CABE>ͷ
/**@brief <20>õ<EFBFBD><C3B5><EFBFBD>ֱ<EFBFBD>ڱպ<DAB1>Ȧ<EFBFBD><C8A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><E3A3AC><EFBFBD>ظĵ<D8B8><C4B5><EFBFBD><EFBFBD><EFBFBD> ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȥ<EFBFBD><C8A5>ָʾ<D6B8><CABE>ͷ, Ĭ<><C4AC>ɸѡ<C9B8>Ƕ<EFBFBD>30<33><30>*/
int GetPerpendicularPoint(double filterAngle = 30);
//<2F><><EFBFBD>߾<EFBFBD><DFBE><EFBFBD>3D add Wangcw
public:
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>ij<EFBFBD><C4B3>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̾<EFBFBD><CCBE><EFBFBD>*/
double PointDistance3D(double x0, double y0, double z0);
/** @brief <20><><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
double CurveDistance3D(CMyCurve& curve);
/**@brief <20>õ<EFBFBD><C3B5>պ<EFBFBD><D5BA><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD>ĵ<EFBFBD><>ܷ<EFBFBD><DCB7><EFBFBD>false*/
bool GetClosureCenter(GBase::CPoint3D& cpt);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>һ<EFBFBD><D2BB>
bool GetInnerPoint(double& x0, double& y0);
/**@brief <20><><EFBFBD>߶<EFBFBD><DFB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>Ϊ˳ʱ<CBB3>ӷ<EFBFBD><D3B7><EFBFBD>*/
bool IsClockWise(void);
/**@brief <20>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>(<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>)*/
bool IsAdjacent(CMyCurve& other);
/** @brief <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>պ<EFBFBD><D5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ww 2016-10-28*/
CMyCurve* LinkCircle(CMyCurve& circle);
/*isThisClockWise = <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>˳ʱ<CBB3>ӣ<EFBFBD> isOtherClockWise = OTHER<45><52><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>˳ʱ<CBB3><CAB1>, isOtherInside = otherCircle<6C>Ƿ<EFBFBD><C7B7>ڱ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD> */
CMyCurve* LinkCircle(CMyCurve& circle, bool isThisClockwise,
bool isOtherClockwise, bool isOtherInside);
/** @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڽӵıպ<C4B1><D5BA><EFBFBD>*/
CMyCurve* LinkAdjacentCircle(CMyCurve& circle);
/** @brief <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>պ<EFBFBD><D5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> iNodeΪ<65><CEAA><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>㣬tarLΪcircle<6C><65><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>׮<EFBFBD><D7AE>ww 2019-5-8*/
CMyCurve* LinkCircle(CMyCurve& tarCircle, int iNode, double tarL);
/** @brief <20><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> iNodeΪ<65><CEAA><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD>߽<EFBFBD><DFBD>㣬tarLΪcircle<6C><65><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>׮<EFBFBD><D7AE>,
isThisClockWise = <EFBFBD><EFBFBD>ǰ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>˳ʱ<EFBFBD>ӣ<EFBFBD> isOtherClockWise = OTHER<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD>˳ʱ<EFBFBD><EFBFBD>, isOtherInside = otherCircle<EFBFBD>Ƿ<EFBFBD><EFBFBD>ڱ<EFBFBD>
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD>*/
CMyCurve* LinkCircle(CMyCurve& otherCircle, int iNode, double tarL, bool isThisClockwise,
bool isOtherClockwise, bool isOtherInside);
/** @brief <20>õ<EFBFBD><C3B5><EFBFBD><EFBFBD>߼<EFBFBD><DFBC><EFBFBD><EFBFBD>еõ<D0B5><C3B5>뵱ǰ<EBB5B1><C7B0><EFBFBD>߸<EFBFBD><DFB8>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8> <20><><EFBFBD><EFBFBD>ww 2019.5.8*/
CMyCurve* GetNearestCurve(vector<CMyCurve*>& curves,int* iNode = 0, double* tarL = 0,bool bQuickTrace= false);
CMyCurve* GetNearestCurve(std::list<CMyCurve*>& curves,int* iNode = 0, double* tarL = 0, bool bQuickTrace = false);
/** @brief <20><>ȡ<EFBFBD><C8A1><EFBFBD>߸<EFBFBD><DFB8>ڵ㵽tarCurve<76><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ͷ<EFBFBD>Ӧ<EFBFBD><D3A6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> bQuickTrace = true<75><65>ֻ<EFBFBD><D6BB><EFBFBD>ǽ<EFBFBD><C7BD><EFBFBD>*/
double GetMinNodeCurveDist(CMyCurve& tarCurve,int& myNode, double& tarL, bool bQuickTrace = false);
//<2F><>ȡ<EFBFBD><C8A1>λ<EFBFBD>ǣ<EFBFBD>X<EFBFBD><58><EFBFBD><EFBFBD>Ϊ0<CEAA>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD>(-180,180]
double GetAzimuthDegree(void);
//<2F><>ȡ<EFBFBD><C8A1>λ<EFBFBD>ǣ<EFBFBD>y<EFBFBD><79><EFBFBD><EFBFBD>Ϊ0<CEAA>ȣ<EFBFBD>x<EFBFBD><78><EFBFBD><EFBFBD>Ϊ90<39>ȣ<EFBFBD><C8A3><EFBFBD><EFBFBD><EFBFBD> [0,360)
double GetAzimuthDegree2(void);
public:
//static functions
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD>εı߽磬<DFBD>ⲿ<EFBFBD>ڽӷ<DABD><D3B7>ش<EFBFBD><D8B4>߽磬<DFBD>ڲ<EFBFBD><DAB2>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڿյİ<D5B5><C4B0>α߽<CEB1> <20><><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD>
static int CreateUnitedBoundaries(vector<CMyCurve*>& pgns, vector<CMyCurve*>& borders);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>ε<EFBFBD><CEB5>߶μ<DFB6>
static void GetBoundarySegs(vector<CMyCurve*>& scrPgns, list<VSegment>& dstSegs);
static CMyCurve* CreateBoundary(list<VSegment>& scrSegs);
//<2F><><EFBFBD>߶μ<DFB6>ȥ<EFBFBD><C8A5>ͬ<EFBFBD><CDAC><EFBFBD>֣<EFBFBD><D6A3>õ<EFBFBD><C3B5><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD>ֵ<EFBFBD><D6B5>߶θ<DFB6><CEB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E0BDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><E0BDBB> <20><><EFBFBD><EFBFBD>0
static int SubtractSegment(VSegment& v1, VSegment& v2, vector<VSegment>& dstSegs);
protected:
GBase::CBaseFunction pf;
};
};
using namespace GObjects;
extern "C" AFX_EXT_API bool WINAPI IsRepeated(const GBase::CPoint2D& pt1, const GBase::CPoint2D& pt2, double prec = 1e-4);
//<2F>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>б<EFBFBD>
typedef TObjectList<CMyCurve> CCurveList;
extern "C" AFX_EXT_API void WINAPI Pline2Curve(CPolyline& pl, CMyCurve& cur);
//<2F><><EFBFBD><EFBFBD>polyline<6E><65>curve vec
extern "C" AFX_EXT_API void WINAPI CopyPlines2Curves(vector<CPolyline*>& scr, vector<CMyCurve*>& dst);
extern "C" AFX_EXT_API void WINAPI Curve2Pline(CMyCurve& cur, CPolyline& pl);
//<2F><><EFBFBD><EFBFBD>curvevec<65><63>polylinevec
extern "C" AFX_EXT_API void WINAPI CopyCurves2Plines(vector<CMyCurve*>& scr, vector<CPolyline*>& dst);