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.

188 lines
7.3 KiB
C

1 month ago
//////////////////////////////////////////////////////////////////////////////
//<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_)