|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//<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);
|
|
|
|
|
|
|