139 lines
4.8 KiB
C
139 lines
4.8 KiB
C
|
/********************************************************************
|
|||
|
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2017<EFBFBD><EFBFBD>9<EFBFBD><EFBFBD>11<EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>:PDSBezier.h
|
|||
|
ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Bezier<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
<EFBFBD>ļ<EFBFBD>¼:
|
|||
|
<EFBFBD>汾<EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD> <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
*********************************************************************/
|
|||
|
#ifndef _PDS_BEZIER_H_
|
|||
|
#define _PDS_BEZIER_H_
|
|||
|
|
|||
|
#include <afxwin.h>
|
|||
|
#include <afxtempl.h>
|
|||
|
#include "PDSMath.h"
|
|||
|
|
|||
|
//Bezier<65><72>
|
|||
|
class CPDSBezierPoint : public CObject
|
|||
|
{
|
|||
|
public:
|
|||
|
CDBLPoint m_ptPoint; // <20><>,Bezier<65><72><EFBFBD>߱<EFBFBD><DFB1><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>
|
|||
|
CDBLPoint m_ptPrev; // ǰ<><C7B0><EFBFBD>ߵ<EFBFBD>
|
|||
|
CDBLPoint m_ptNext; // <20><><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD>
|
|||
|
|
|||
|
double m_dParam; // <20>õ<EFBFBD><C3B5><EFBFBD>Ӧ<EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>ֵ,<2C>ڼ<EFBFBD><DABC><EFBFBD>Bezier<65><72><EFBFBD>ߵ<EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,Ĭ<><C4AC>ֵ:0
|
|||
|
|
|||
|
public:
|
|||
|
CPDSBezierPoint(void);
|
|||
|
CPDSBezierPoint(CDBLPoint ptPoint, CDBLPoint ptPrev, CDBLPoint ptNext, double dParam = 0.0);
|
|||
|
CPDSBezierPoint(CPoint ptPoint, CPoint ptPrev, CPoint ptNext, double dParam = 0.0);
|
|||
|
CPDSBezierPoint(CPDSBezierPoint& rhs);
|
|||
|
virtual ~CPDSBezierPoint(void);
|
|||
|
CPDSBezierPoint& operator=(CPDSBezierPoint& rhs);
|
|||
|
BOOL operator==(CPDSBezierPoint& rhs); // <20><><EFBFBD>Ƚ<EFBFBD>m_ptPoint<6E>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
BOOL operator!=(CPDSBezierPoint& rhs); // <20><><EFBFBD>Ƚ<EFBFBD>m_ptPoint<6E>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
|
|||
|
void Initial(void);
|
|||
|
|
|||
|
//ʹ<><CAB9>ptPoint,ptPrev,ptNext<78><74><EFBFBD><EFBFBD>this
|
|||
|
void SetPoint(CPoint ptPoint, CPoint ptPrev, CPoint ptNext);
|
|||
|
|
|||
|
//<2F><>ȡptPoint,ptPrev,ptNext
|
|||
|
void GetPoint(CPoint& ptPoint, CPoint& ptPrev, CPoint& ptNext);
|
|||
|
};
|
|||
|
|
|||
|
//Bezier<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
class CPDSBezierPointList : public CList<CPDSBezierPoint,CPDSBezierPoint>
|
|||
|
{
|
|||
|
public: //<2F><>չ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
|
|||
|
public: //<2F><>չ<EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>
|
|||
|
|
|||
|
CPDSBezierPointList& operator=(CPDSBezierPointList& rhs); //<2F><>ֵ
|
|||
|
CPDSBezierPoint& operator[](int iIndex); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>listPoint<6E><74><EFBFBD><EFBFBD>this
|
|||
|
void SetPoint(CList<CPoint,CPoint>& listPoint);
|
|||
|
|
|||
|
//<2F><>this<69><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>listPoint
|
|||
|
void GetPoint(CList<CPoint,CPoint>& listPoint);
|
|||
|
|
|||
|
POSITION AddWithoutDuplicate(CPDSBezierPoint ptBezierPoint, BOOL bAddTail = TRUE);
|
|||
|
|
|||
|
void AddWithoutDuplicate(CPDSBezierPointList& listBezierPoint, BOOL bAddTail = TRUE);
|
|||
|
|
|||
|
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>ֵ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
int FindParamIndex(double dParam);
|
|||
|
|
|||
|
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
|||
|
double GetLength(void);
|
|||
|
|
|||
|
//<2F><>this<69><73>ת
|
|||
|
void Reverse(void);
|
|||
|
};
|
|||
|
|
|||
|
//Bezier<65><72><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
class CPDSBezierCurve : public CObject
|
|||
|
{
|
|||
|
public:
|
|||
|
//<2F><>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>һ<EFBFBD><D2BB>,<2C><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>,Bezier<65><72><EFBFBD>ߵļ<DFB5><C4BC>㺯<EFBFBD><E3BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ó<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>
|
|||
|
CPDSBezierPointList m_listCtrlPoint; // <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>,ǰ<><C7B0><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
CPDSBezierPointList m_listRealPoint; // ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>,<2C><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD>ֵ
|
|||
|
int m_iBezierDegree; // Bezier<65><72><EFBFBD>ߵĴ<DFB5><C4B4><EFBFBD>,<2C><><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,Ĭ<><C4AC>ֵ:3
|
|||
|
|
|||
|
public:
|
|||
|
CPDSBezierCurve(void);
|
|||
|
CPDSBezierCurve(CPDSBezierCurve& rhs);
|
|||
|
virtual ~CPDSBezierCurve(void);
|
|||
|
CPDSBezierCurve& operator=(CPDSBezierCurve& rhs);
|
|||
|
|
|||
|
void Initial(void);
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD>Bezier<65><72><EFBFBD><EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|||
|
// listCtrlPoint <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>,ǰһ<C7B0><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>next<78><74><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>prev<65><76><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>
|
|||
|
// bClose =true <20>պ<EFBFBD><D5BA><EFBFBD>,GetTail()<29><>GetHead()֮<><D6AE><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>,=false <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// iBezierDegree Bezier<65><72><EFBFBD>ߵĴ<DFB5><C4B4><EFBFBD>,=2<><32><EFBFBD><EFBFBD>=3
|
|||
|
// dMaxError <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|||
|
// listRealPoint ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>
|
|||
|
static void CalculateBezierCurve(CPDSBezierPointList& listCtrlPoint, BOOL bClose, int iBezierDegree, double dMaxError, CPDSBezierPointList& listRealPoint);
|
|||
|
|
|||
|
protected:
|
|||
|
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>Bezier<65><72><EFBFBD><EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|||
|
// ptPrevBezierPoint ǰһ<C7B0><D2BB>Bezier<65><72>,<2C><><EFBFBD><EFBFBD>next<78><74><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// ptNextBezierPoint <20><>һ<EFBFBD><D2BB>Bezier<65><72>,<2C><><EFBFBD><EFBFBD>prev<65><76><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// iBezierDegree Bezier<65><72><EFBFBD>ߵĴ<DFB5><C4B4><EFBFBD>,=2<><32><EFBFBD><EFBFBD>=3
|
|||
|
// dMaxError <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|||
|
// listRealPoint ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>
|
|||
|
static void CalculateBezierBetweenTwoPoint(CPDSBezierPoint ptPrevBezierPoint, CPDSBezierPoint ptNextBezierPoint, int iBezierDegree, double dMaxError, CPDSBezierPointList& listRealPoint);
|
|||
|
|
|||
|
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>Bezier<65><72>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|||
|
// ptPrevBezierPoint ǰһ<C7B0><D2BB>Bezier<65><72>,<2C><><EFBFBD><EFBFBD>next<78><74><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// ptNextBezierPoint <20><>һ<EFBFBD><D2BB>Bezier<65><72>,<2C><><EFBFBD><EFBFBD>prev<65><76><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// iBezierDegree Bezier<65><72><EFBFBD>ߵĴ<DFB5><C4B4><EFBFBD>,=2<><32><EFBFBD><EFBFBD>=3
|
|||
|
// dParam <20><><EFBFBD><EFBFBD>ֵ,0<=dParam<=1
|
|||
|
//<2F><><EFBFBD><EFBFBD>ֵ:
|
|||
|
// Bezier<65><72>
|
|||
|
static CPDSBezierPoint CalculateBezierPoint(CPDSBezierPoint ptPrevBezierPoint, CPDSBezierPoint ptNextBezierPoint, int iBezierDegree, double dParam);
|
|||
|
|
|||
|
//<2F><><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD>е<EFBFBD><D0B5>IJ<EFBFBD><C4B2><EFBFBD>
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|||
|
// ptPrevBezierPoint ǰһ<C7B0><D2BB>Bezier<65><72>,<2C><><EFBFBD><EFBFBD>next<78><74><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|||
|
// ptNextBezierPoint <20><>һ<EFBFBD><D2BB>Bezier<65><72>,<2C><><EFBFBD><EFBFBD>prev<65><76><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㹹<EFBFBD><E3B9B9><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>Bezier<65><72><EFBFBD><EFBFBD>
|
|||
|
// iBezierDegree Bezier<65><72><EFBFBD>ߵĴ<DFB5><C4B4><EFBFBD>,=2<><32><EFBFBD><EFBFBD>=3
|
|||
|
// ptBezierPoint1 <20>ö<EFBFBD>Bezier<65><72><EFBFBD><EFBFBD><EFBFBD>ϵĵ<CFB5>1
|
|||
|
// ptBezierPoint2 <20>ö<EFBFBD>Bezier<65><72><EFBFBD><EFBFBD><EFBFBD>ϵĵ<CFB5>2
|
|||
|
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
|
|||
|
// dParam1 <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>֮<EFBFBD><D6AE>
|
|||
|
// dParam2 <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>1<EFBFBD><31><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>֮<EFBFBD><D6AE>,<2C><><EFBFBD>Ҵ<EFBFBD><D2B4><EFBFBD>dParam1
|
|||
|
//<2F><><EFBFBD><EFBFBD>ֵ:
|
|||
|
// =2 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,=1 <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>,=0 û<>н<EFBFBD>
|
|||
|
static int CalculateTangentParam(CPDSBezierPoint ptPrevBezierPoint, CPDSBezierPoint ptNextBezierPoint, int iBezierDegree, CPDSBezierPoint ptBezierPoint1, CPDSBezierPoint ptBezierPoint2, double& dParam1, double& dParam2);
|
|||
|
};
|
|||
|
|
|||
|
#endif // _PDS_BEZIER_H_
|