|
|
|
|
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
//<2F>ļ<EFBFBD> Curve.h
|
|
|
|
|
|
//<2F><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>:
|
|
|
|
|
|
// <09><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д: 2005-12-07
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
// Curve.h: interface for the CCurve class.
|
|
|
|
|
|
//
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
|
|
|
|
|
|
#if !defined(AFX_CURVE_H__427CDE34_A3CE_4E56_8CE6_7162AB7707DC__INCLUDED_)
|
|
|
|
|
|
#define AFX_CURVE_H__427CDE34_A3CE_4E56_8CE6_7162AB7707DC__INCLUDED_
|
|
|
|
|
|
|
|
|
|
|
|
#if _MSC_VER > 1000
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
#endif // _MSC_VER > 1000
|
|
|
|
|
|
|
|
|
|
|
|
#include "afxtempl.h"
|
|
|
|
|
|
#include "Vector.h"
|
|
|
|
|
|
#include "Point2D.h"
|
|
|
|
|
|
|
|
|
|
|
|
#include "CrossPoint.h"
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
#define PLINE_NODRAW 0x00000001 //'E'
|
|
|
|
|
|
#define PLINE_W 0x00000002 //'W'
|
|
|
|
|
|
#define PLINE_VIRTUAL 0x00000004 //'V'
|
|
|
|
|
|
#define PLINE_DESIGN 0x00000008 //'D'
|
|
|
|
|
|
#define PLINE_MIDLE 0x00000010 //'M'
|
|
|
|
|
|
//
|
|
|
|
|
|
#define PLINE_SOLID 0x00000020 //'S'
|
|
|
|
|
|
#define PLINE_CLOSE 0x00000040 //'C'
|
|
|
|
|
|
#define PLINE_BEZIER 0x00000080 //'B'
|
|
|
|
|
|
#define PLINE_SPLINE 0x00000100 //'P' //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⻬
|
|
|
|
|
|
#define PLINE_OFFSET 0x00000200 //'O'
|
|
|
|
|
|
#define PLINE_TRANSPARENT 0x00000400 //'T' //<><CDB8>
|
|
|
|
|
|
#define PLINE_WAVE 0x00000800 //'A' //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
#define PLINE_TRANSPARENT_VALUE 0x00001000 //'H' // 'H' <><CDB8><EFBFBD><EFBFBD>
|
|
|
|
|
|
#define PLINE_WAVE_SOLID (PLINE_WAVE|PLINE_SOLID) //AS //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD>
|
|
|
|
|
|
#define PLINE_BS (PLINE_BEZIER|PLINE_SOLID) //'B'*256+'S'
|
|
|
|
|
|
#define PLINE_BC (PLINE_BEZIER|PLINE_CLOSE) //'B'*256+'C'
|
|
|
|
|
|
#define PLINE_SPLINES (PLINE_SPLINE|PLINE_SOLID) //'P'*256+'S' //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⻬+<2B><><EFBFBD><EFBFBD>+<2B>պ<EFBFBD>
|
|
|
|
|
|
#define PLINE_SPLINEC (PLINE_SPLINE|PLINE_CLOSE) //'P'*256+'C' //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>⻬+<2B>պ<EFBFBD>
|
|
|
|
|
|
#define PLINE_OFFSET_SOLID (PLINE_OFFSET|PLINE_SOLID) //'O'*256+'S'
|
|
|
|
|
|
#define PLINE_OFFSET_SOLID_B (PLINE_OFFSET|PLINE_SOLID|PLINE_BEZIER) //'O'*256+'S'+'B'
|
|
|
|
|
|
#define PLINE_OFFSET_B (PLINE_OFFSET|PLINE_BEZIER) //'O'*256+'B'
|
|
|
|
|
|
#define PLINE_TS (PLINE_TRANSPARENT|PLINE_SOLID) //'T'*256+'S' //<2F><><EFBFBD><EFBFBD><EFBFBD><CDB8>
|
|
|
|
|
|
#define PLINE_HS (PLINE_TRANSPARENT_VALUE|PLINE_SOLID) //'H'*256+'S' //<2F><><EFBFBD><EFBFBD><EFBFBD><CDB8><EFBFBD><EFBFBD>
|
|
|
|
|
|
#define PLINE_TBS (PLINE_TRANSPARENT|PLINE_BS) //'T'*256+'B'+'S' //B<><42><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>
|
|
|
|
|
|
#define PLINE_T_SPLINES (PLINE_TRANSPARENT|PLINE_SPLINES) //'T'*256+'P'+'S' //S<><53><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><CDB8>
|
|
|
|
|
|
#define PLINE_TB (PLINE_TRANSPARENT|PLINE_BEZIER) //'T'*256+'B' //ƽ<><C6BD><EFBFBD><CDB8>
|
|
|
|
|
|
#define PLINE_TC (PLINE_TRANSPARENT|PLINE_CLOSE) //'T'*256+'C' //<2F>պ<EFBFBD><EFBFBD><CDB8>
|
|
|
|
|
|
#define PLINE_T_WAVE_S (PLINE_TRANSPARENT|PLINE_WAVE_SOLID) //TAS //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+<2B><><EFBFBD><EFBFBD>+<><CDB8>
|
|
|
|
|
|
|
|
|
|
|
|
namespace NBase
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
#define CCrossList CList<CCrossPoint,CCrossPoint>
|
|
|
|
|
|
typedef CList<POSITION, POSITION> CPositionList;
|
|
|
|
|
|
|
|
|
|
|
|
class AFX_EXT_CLASS CCurve : public CVector
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
CCurve();
|
|
|
|
|
|
CCurve(int num);
|
|
|
|
|
|
virtual ~CCurve();
|
|
|
|
|
|
|
|
|
|
|
|
int Create(int num);
|
|
|
|
|
|
int CreateCurveFromRect(CRect8* pRect);
|
|
|
|
|
|
int CreateCurveFromRect(CRect8* pRect, int iBevel);
|
|
|
|
|
|
//szRountd.cxΪԲ<CEAA>Ǵ<EFBFBD><C7B4>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD>szRountd.cyΪ<79><CEAA><EFBFBD><EFBFBD>
|
|
|
|
|
|
int CreateCurveFromRoundRect(CRect8* pRect, CSize8 szRountd);
|
|
|
|
|
|
//<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(CPoint2D centerPoint, CSize8 szRadius, double angleStep,
|
|
|
|
|
|
double arc1=0.0, double arc2=360.0, int type=0);
|
|
|
|
|
|
virtual void Clear(void);
|
|
|
|
|
|
|
|
|
|
|
|
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(CPointList &dp, int nnPoint, BOOL IsAutoLocation=TRUE);
|
|
|
|
|
|
|
|
|
|
|
|
int Read(CString name, long offset);
|
|
|
|
|
|
int Read(CFile &fr,double m_z);
|
|
|
|
|
|
void Write(CFile &fw,double l1,double l2);
|
|
|
|
|
|
void Write(CFile &fw);
|
|
|
|
|
|
void Write(int i, CFile &fw, int nn, int m_digit);
|
|
|
|
|
|
void Write(FILE* &fw);
|
|
|
|
|
|
void WriteNode(CFile& fw, int index);
|
|
|
|
|
|
|
|
|
|
|
|
BOOL IsClosed(); //<2F>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>β<EFBFBD>պ<EFBFBD>
|
|
|
|
|
|
void SetToClose();
|
|
|
|
|
|
BOOL IsScope(); // <20>Ƿ<EFBFBD><C7B7><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><F2A3ACB7><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
|
|
|
|
|
|
int Cross(CCurve &c2, CCrossList &xy);
|
|
|
|
|
|
int Trim(CCurve &m_curve,CFile &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(CCurve& 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(CRect8& range);
|
|
|
|
|
|
|
|
|
|
|
|
int CrossLine(double *linex, double *liney, CCrossList &m_cross);
|
|
|
|
|
|
void Reversal();
|
|
|
|
|
|
void GetLocation();
|
|
|
|
|
|
void GetLocation3D();
|
|
|
|
|
|
BOOL Extend(double extendLength, int sel);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,sel=0<><30><EFBFBD><EFBFBD>ͷ,sel=1<><31><EFBFBD><EFBFBD>β
|
|
|
|
|
|
void Expand(double distance); // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
void EncryptNode(int nMode, double step, BOOL bInteger); // <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
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(CPointList &dp, BOOL bReverse=FALSE, BOOL bAddHead=FALSE);
|
|
|
|
|
|
BOOL GetPoint(int nIndex, dfPoint& dp);
|
|
|
|
|
|
BOOL SetPoint(int nIndex, dfPoint& dp);
|
|
|
|
|
|
int GetCurve (double l1,double l2,CPointList &dp,int bDoubleHeadTail=1,BOOL bNoLineValue=FALSE );
|
|
|
|
|
|
int GetCurveOther(double l1, double l2, CPointList &dp, int bDoubleHeadTail=1, BOOL bNoLineValue=FALSE);
|
|
|
|
|
|
int GetCoordinate(double m_location,double &x,double &y,double &z);
|
|
|
|
|
|
int GetCoordinate(double m_location, CPoint3D& pt);
|
|
|
|
|
|
void GetRange(double& xmin, double& ymin, double& xmax, double& ymax);
|
|
|
|
|
|
|
|
|
|
|
|
void operator+=(double t);
|
|
|
|
|
|
void operator=(CCurve& t);
|
|
|
|
|
|
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>*/
|
|
|
|
|
|
double PointDistance(double x0, double y0, double& l0);
|
|
|
|
|
|
|
|
|
|
|
|
int SetName(LPCTSTR lpString);
|
|
|
|
|
|
CString GetName(void);
|
|
|
|
|
|
|
|
|
|
|
|
int GetBXY(double *pX,double *pY,int isClose);
|
|
|
|
|
|
void CurveToBezier(CPointList &bp,double sd,int isClose);
|
|
|
|
|
|
void CurveToSpline(CPointList &dp,double sd,int isClose, BOOL bRemoveRepeat=TRUE);
|
|
|
|
|
|
int CurveToWave(CPointList &bp, double T, double A, double dnum); //T=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,A=<3D><><EFBFBD><EFBFBD>,dnum=һ<><D2BB><EFBFBD><EFBFBD><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
double CompareCurve(CCurve& curve, double error);
|
|
|
|
|
|
|
|
|
|
|
|
int nPoint; //ÿ<><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>x y z l <20><>
|
|
|
|
|
|
int m_type;
|
|
|
|
|
|
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>
|
|
|
|
|
|
double *y,*z,*l;
|
|
|
|
|
|
char *name;
|
|
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
void _ClearDC(CPtrList &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(CPtrList &dc1);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F>ϲ<EFBFBD>ͳ<EFBFBD>Ʋ<EFBFBD><C6B2><EFBFBD>
|
|
|
|
|
|
public:
|
|
|
|
|
|
/** @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><C3B5><EFBFBD><EFBFBD><EFBFBD>Z<EFBFBD>߶Ȳ<DFB6>*/
|
|
|
|
|
|
bool GetClosureDZ(double& maxDZ, double& minDZ, double& aveDZ);
|
|
|
|
|
|
|
|
|
|
|
|
//<2F><><EFBFBD>߾<EFBFBD><DFBE><EFBFBD>3D
|
|
|
|
|
|
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(CCurve& curve);
|
|
|
|
|
|
};
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
AFX_INLINE CString CCurve::GetName(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(name!=NULL)return CString(name);
|
|
|
|
|
|
return _T("");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
extern "C" AFX_EXT_API void WINAPI ReduceCurveRedundant(CCurve& m_input, CCurve& m_output, double error);
|
|
|
|
|
|
extern "C" AFX_EXT_API void WINAPI ReduceCurveRedundant3D(CCurve& m_input, CCurve& m_output, double error, int IsZ);
|
|
|
|
|
|
|
|
|
|
|
|
#endif // !defined(AFX_CURVE_H__427CDE34_A3CE_4E56_8CE6_7162AB7707DC__INCLUDED_)
|