PlotterHMI/datafile/dxf/dxflib/PDSMath/PDSNurbs.h

503 lines
18 KiB
C
Raw Normal View History

/********************************************************************
<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:2017<EFBFBD><EFBFBD>3<EFBFBD><EFBFBD>17<EFBFBD><EFBFBD>
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>:PDSNurbs.h
ԭʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>:<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
<EFBFBD><EFBFBD> <EFBFBD><EFBFBD>:<EFBFBD>Ǿ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<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_NURBS_H_
#define _PDS_NURBS_H_
#include <math.h>
#include <afxwin.h>
#include <afxtempl.h>
const double PDS_NURBS_ZERO = 0.000001; // С<>ڸ<EFBFBD><DAB8><EFBFBD><EFBFBD>ֵ<EFBFBD>ֵ<EFBFBD><D6B5>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>0
//ȫ<>ֺ<EFBFBD><D6BA><EFBFBD>
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>˫<EFBFBD><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>
BOOL PDSNurbs_IsEqual(double d1, double d2);
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>˫<EFBFBD><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ񲻵<C7B7>
BOOL PDSNurbs_NotEqual(double d1, double d2);
//<2F>жϸ<D0B6><CFB8><EFBFBD><EFBFBD><EFBFBD>˫<EFBFBD><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD>0
BOOL PDSNurbs_EqualZero(double d);
//<2F>жϸ<D0B6><CFB8><EFBFBD><EFBFBD><EFBFBD>˫<EFBFBD><CBAB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>Ϊ0
BOOL PDSNurbs_NotEqualZero(double d);
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD>ʹ<EFBFBD>õĵ<C3B5>
class CPDSNurbsPoint : public CObject
{
public:
double x;
double y;
double z;
double weight; /* Ȩ<><C8A8><><C4AC>ֵ:1
// <20><><EFBFBD><EFBFBD>:(1,1,1,1)<29><>ͬ<EFBFBD><CDAC>(4,4,4,4),<2C><>Ϊijһ<C4B3><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD>ص<EFBFBD>ʱ<EFBFBD><CAB1>,һ<><D2BB>Ҫ<EFBFBD><D2AA>xyz<79><7A><EFBFBD><EFBFBD>ȫ<EFBFBD><C8AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>weight<68><74><EFBFBD>ܱ<EFBFBD>֤λ<D6A4>ò<EFBFBD><C3B2><EFBFBD> */
double knot; // <20>õ<EFBFBD><C3B5><EFBFBD>Ӧ<EFBFBD>Ľڵ<C4BD><DAB5><EFBFBD>ֵ,Ĭ<><C4AC>ֵ:0
int type; // <20><><EFBFBD><EFBFBD>,=1 ת<>۵<EFBFBD>,=0 <20><><EFBFBD>ߵ<EFBFBD><><C4AC>ֵ:0,[20180322 syf]<5D><><EFBFBD>Ӹñ<D3B8><C3B1><EFBFBD>
// <20><>this<69><73>ʾ<EFBFBD><CABE><EFBFBD>Ƶ<EFBFBD>ʱ,<2C><><EFBFBD>øñ<C3B8><C3B1><EFBFBD>,<2C><>ô<EFBFBD>ڷ<EFBFBD><DAB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵĿ<DFB5><C4BF>Ƶ<EFBFBD><C6B5><EFBFBD>ʱ,<2C><>ת<EFBFBD>۵<EFBFBD><DBB5><EFBFBD><EFBFBD>Ͽ<EFBFBD>,<2C>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ⱥ<EFBFBD>operator==<3D><><EFBFBD>ж<EFBFBD>
public:
CPDSNurbsPoint(void);
CPDSNurbsPoint(CPDSNurbsPoint& rhs);
CPDSNurbsPoint(CPoint ptPoint);
CPDSNurbsPoint(double x, double y, double z = 0.0, double weight = 1.0);
virtual ~CPDSNurbsPoint(void);
CPDSNurbsPoint& operator=(CPDSNurbsPoint& rhs);
CPDSNurbsPoint operator+(CPDSNurbsPoint& rhs);
CPDSNurbsPoint operator-(CPDSNurbsPoint& rhs);
void operator+=(CPDSNurbsPoint& rhs);
BOOL operator==(CPDSNurbsPoint& rhs);
void Initial(void);
//<2F><>this<69><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ת<EFBFBD><D7AA>ΪCPoint<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPoint GetPoint(void);
//<2F><><EFBFBD><EFBFBD>this<69><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void SetPoint(CPoint ptPoint);
//<2F><><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
void Multiple(double dParam);
//<2F><><EFBFBD>Ը<EFBFBD><D4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
void Divide(double dParam);
//<2F><>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ȩ<EFBFBD><C8A8>,<2C>õ<EFBFBD><C3B5><EFBFBD><E6B7B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void DivideWeight(void);
};
//<2F><><EFBFBD><EFBFBD><EFBFBD>͵ĵ<CDB5><C4B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
class CPDSNurbsPointList : public CList<CPDSNurbsPoint,CPDSNurbsPoint>
{
public: //<2F><>չ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
public: //<2F><>չ<EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>
CPDSNurbsPointList& operator=(CPDSNurbsPointList& rhs); //<2F><>ֵ
CPDSNurbsPoint& 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
//<2F>ر<EFBFBD>˵<EFBFBD><CBB5>:
// (1)this<69><73>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>z=0,weight=1
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(CPDSNurbsPoint ptNurbsPoint, BOOL bAddTail = TRUE);
void AddWithoutDuplicate(CPDSNurbsPointList& listNurbsPoint, BOOL bAddTail = TRUE);
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD>Ľڵ<C4BD><DAB5><EFBFBD>ֵ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
int FindKnotIndex(double dKnot);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
double GetLength(void);
//<2F><>this<69><73>ת
void Reverse(void);
};
//<2F>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>NURBS<42><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵(3<><33>),<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>Ӧ<EFBFBD>õ<EFBFBD><C3B5>ڿ<EFBFBD><DABF>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>+4
class CPDSNurbsKnotList : public CList<double,double>
{
public: //<2F><>չ<EFBFBD>ı<EFBFBD><C4B1><EFBFBD>
public: //<2F><>չ<EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>
CPDSNurbsKnotList& operator=(CPDSNurbsKnotList& rhs); //<2F><>ֵ
double& operator[](int iIndex); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>Խ<EFBFBD><D4BD>
//<2F><><EFBFBD><EFBFBD>listKnot<6F><74><EFBFBD><EFBFBD>this
void SetKnot(CList<double,double>& listKnot);
//<2F><>this<69><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>listKnot
void GetKnot(CList<double,double>& listKnot);
//<2F><><EFBFBD><EFBFBD><EFBFBD>µĽڵ<C4BD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵĽڵ㲻<DAB5><E3B2BB><EFBFBD><EFBFBD>ͬ
POSITION AddWithoutDuplicate(double dKnot, BOOL bAddTail = TRUE);
//<2F><><EFBFBD>Ҹ<EFBFBD><D2B8><EFBFBD><EFBFBD>Ľڵ<C4BD><DAB5><EFBFBD>this<69>е<EFBFBD><D0B5>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD>
int FindRepeatTime(double dKnot);
};
//<2F><><EFBFBD><EFBFBD>
class CPDSMatrix : public CObject
{
protected:
double** m_dMatrix; // <20><>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>,Ϊthis˽<73><CBBD>,<2C><>ͬ<EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD>֮<EFBFBD><EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD>m_dMatrix
int m_iRowCount; // <20><><EFBFBD><EFBFBD>
int m_iColumnCount; // <20><><EFBFBD><EFBFBD>
public:
CPDSMatrix(void);
CPDSMatrix(CPDSMatrix& rhs);
virtual ~CPDSMatrix(void);
CPDSMatrix& operator=(CPDSMatrix& rhs);
CPDSMatrix operator*(CPDSMatrix& rhs); // this<69><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>rhs<68><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><>ʼ<EFBFBD><CABC>,<2C><><EFBFBD><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7>ڴ<EFBFBD>
void Initial(void);
//<2F><><EFBFBD>þ<EFBFBD><C3BE><EFBFBD><EFBFBD>Ĵ<EFBFBD>С
//<2F>ر<EFBFBD>˵<EFBFBD><CBB5>:
// <20><>ʹ<EFBFBD>þ<EFBFBD><C3BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮ǰ,һ<><D2BB>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ô<EFBFBD>С
void SetSize(int iRowCount, int iColumnCount);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void GetMatrix(double**& dMatrix, int& iRowCount, int& iColumnCount);
//<2F><>ȡ<EFBFBD><C8A1>ά<EFBFBD><CEAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
double** GetArray(void);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ر<EFBFBD>˵<EFBFBD><CBB5>:
// (1)this<69><73><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD>
// (2)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><DDB3>ȱ任<C8B1><E4BBBB><EFBFBD><EFBFBD>
CPDSMatrix GetInverseMatrix(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
void OutputDebugInfo(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݼ<EFBFBD><DDBC><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// dArray1 <20><><EFBFBD><EFBFBD>1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1><EFBFBD><EFBFBD><EFBFBD>
// dArray2 <20><><EFBFBD><EFBFBD>2,<2C><><EFBFBD>е<EFBFBD><D0B5><EFBFBD><EFBFBD>ݱ<EFBFBD><DDB1>ӵ<EFBFBD>dArray1,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݲ<EFBFBD><DDB2>ı<EFBFBD>
// iCount <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
// dProp <20><><EFBFBD><EFBFBD>ֵ,dArray2[]*dProp<6F><70><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>dArray1
void AddRow(double* dArray1, double* dArray2, int iCount, double dProp = 1.0);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>ÿһ<C3BF><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8><EFBFBD>IJ<EFBFBD><C4B2><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// dArray <20><><EFBFBD><EFBFBD>
// iCount <20><><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD><C4B3><EFBFBD>
// dParam <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿһ<C3BF>Ҫ<EEB6BC><D2AA><EFBFBD>Ը<EFBFBD>ֵ
void DivideRow(double* dArray, int iCount, double dParam);
};
//NURBS<42><53><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F>ر<EFBFBD>˵<EFBFBD><CBB5>:
// (1)<29><>ָ3<D6B8>ηǾ<CEB7><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (2)ʲô<CAB2><C3B4><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>?
// ָ<><D6B8><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD>ĵ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>ǵ<EFBFBD>ϵͳ<CFB5>г<EFBFBD>֮Ϊ"<22><><EFBFBD>Ƶ<EFBFBD>",ʵ<><CAB5><EFBFBD>Ϲ<CFB9><E6B7B6><EFBFBD>Ķ<EFBFBD><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
// <20><>ֵ<EFBFBD><D6B5>Ҳ<EFBFBD><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϵ<EFBFBD>
// Ӣ<><D3A2><EFBFBD><EFBFBD>:data point
// (3)ʲô<CAB2>ǿ<EFBFBD><C7BF>Ƶ<EFBFBD>?
// <20><><EFBFBD>ڼ<EFBFBD><DABC><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD>ĵ<EFBFBD>,<2C><><EFBFBD>ְ<EFBFBD>ʦ<EFBFBD><CAA6><EFBFBD><EFBFBD><EFBFBD>ij<EFBFBD>֮Ϊ"<22>ֱ<EFBFBD>",<2C><><EFBFBD><EFBFBD>ֻ<EFBFBD><EFBFBD><E1BEAD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>,<2C><><EFBFBD><EFBFBD><E1BEAD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ǷǾ<C7B7><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9>,<2C><><EFBFBD>߲<EFBFBD><DFB2><EFBFBD><E1B3AC><EFBFBD><EFBFBD><EFBFBD>ķ<EFBFBD>Χ
// Ӣ<><D3A2><EFBFBD><EFBFBD>:control point
// (4)NURBS<42><53><EFBFBD>ߵķ<DFB5><C4B7><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5>ƹ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>
// (5)ʲô<CAB2>ǽڵ<C7BD>?
// һ<><EFBFBD><E9B5A5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ʶÿһ<C3BF><D2BB>control point<6E><74><EFBFBD><EFBFBD><EFBFBD>÷<EFBFBD>Χ,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵,ѡ<><D1A1><EFBFBD><EFBFBD>ͬ<EFBFBD>Ľڵ<C4BD>,<2C><><EFBFBD>յ<EFBFBD>Ч<EFBFBD><D0A7><EFBFBD><EFBFBD>ͬ
// (6)<29>ڵ<EFBFBD><DAB5>ж<EFBFBD><D0B6>ٸ<EFBFBD>?
// <20><><EFBFBD><EFBFBD>degree=3<><33>˵,<2C>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>θ<EFBFBD><CEB8><EFBFBD>+degree+1=<3D><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>θ<EFBFBD><CEB8><EFBFBD>+4
// <20><><EFBFBD><EFBFBD>ǰdegree+1=4<><34><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><>ص<EFBFBD><D8B5><EFBFBD>0),ĩβdegree+1=4<><34><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><>ص<EFBFBD><D8B5><EFBFBD>1)
// <20><><EFBFBD><EFBFBD>:{A,A,A,A,B,C,D,E,E,E,E}<7D><><EFBFBD><EFBFBD>7<EFBFBD><37>control point<6E><74><EFBFBD>γɵĽڵ<C4BD>,ÿһ<C3BF><D2BB>{A,B,C,D,E}<7D><><EFBFBD><EFBFBD>Ӧ<EFBFBD><D3A6>һ<EFBFBD><D2BB>data point,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>data point<6E><74><EFBFBD><EFBFBD>Ļ<EFBFBD>Ͽ<EFBFBD><CFBF>Կ<EFBFBD><D4BF><EFBFBD><EFBFBD>ĵ<EFBFBD>
// <20><><EFBFBD><EFBFBD>{A,B,C,D,E}<7D><><EFBFBD>ɵȲ<C9B5><C8B2><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>߽<EFBFBD><DFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǿ<EFBFBD><C7BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD>
// (7)<29><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>,<2C><>ôֻ<C3B4>ܼ<EFBFBD><DCBC><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (8)<29><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>,<2C><>ôֻ<C3B4>ܵõ<DCB5>һ<EFBFBD><D2BB><EFBFBD>߶<EFBFBD>
class CPDSNurbsCurve : public CObject
{
public:
//<2F><>4<EFBFBD><34><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0>һ<EFBFBD><D2BB>,<2C><><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD>,NURBS<42><53><EFBFBD>ߵļ<DFB5><C4BC><EFBFBD><E3BAAF><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʹ<EFBFBD>ó<EFBFBD>Ա<EFBFBD><D4B1><EFBFBD><EFBFBD>
CPDSNurbsPointList m_listCtrlPoint; // <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD><><D2B2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>յ<EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD>ͷβ<CDB7><CEB2>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>м<EFBFBD><D0BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPDSNurbsKnotList m_listKnot; // <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD>ȵ<EFBFBD><C8B5><EFBFBD>m_listCtrlPoint.GetCount()+4
CPDSNurbsPointList m_listDataPoint; // <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9>
CPDSNurbsPointList m_listRealPoint; // ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>,<2C><>ֵ<EFBFBD><D6B5><EFBFBD>ĵ<EFBFBD>
public:
CPDSNurbsCurve(void);
CPDSNurbsCurve(CPDSNurbsCurve& rhs);
virtual ~CPDSNurbsCurve(void);
CPDSNurbsCurve& operator=(CPDSNurbsCurve& rhs);
void Initial(void);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3BFAA><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listDataPoint <20><>ֵ<EFBFBD><D6B5>
// dMaxError <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// bTangentH =true ͷ<><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,=false ͷ<><CDB7>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ptTangentPointH ͷ<><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD><DFB7><EFBFBD><><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>GetPrev<65>ķ<EFBFBD><C4B7><EFBFBD>
// bTangentT =true β<><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,=false β<><CEB2>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ptTangentPointT β<><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD><DFB7><EFBFBD><><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>GetNext<78>ķ<EFBFBD><C4B7><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listOutputPoint ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// =true <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>,=false <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
BOOL Calculate_DataPoint_Open(CList<CPoint,CPoint>& listDataPoint, double dMaxError, CList<CPoint,CPoint>& listOutputPoint, BOOL bTangentH = FALSE, CPoint ptTangentPointH = CPoint(0,0), BOOL bTangentT = FALSE, CPoint ptTangentPointT = CPoint(0,0));
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>պ<EFBFBD><D5BA><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listDataPoint <20><>ֵ<EFBFBD><D6B5><><CEB2><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD>ͷ<EFBFBD><CDB7><><D2B2><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>
// dMaxError <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listOutputPoint ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>,<2C><><EFBFBD><EFBFBD>ʱβ<CAB1><CEB2><EFBFBD><EFBFBD>ͷ<EFBFBD><CDB7><EFBFBD>غ<EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// =true <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>,=false <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
BOOL Calculate_DataPoint_Close(CList<CPoint,CPoint>& listDataPoint, double dMaxError, CList<CPoint,CPoint>& listOutputPoint);
//<2F><><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listOldPoint <20>ɵ<EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>
// listDataPoint <20><>ֵ<EFBFBD><D6B5>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ϊ<EFBFBD><CEAA>,<2C><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EBBEAD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9>
// dSplineError <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// dMaxError <20><><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>listOldPoint<6E><74><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// bTangentH =true ͷ<><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,=false ͷ<><CDB7>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ptTangentPointH ͷ<><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD><DFB7><EFBFBD><><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>GetPrev<65>ķ<EFBFBD><C4B7><EFBFBD>
// bTangentT =true β<><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,=false β<><CEB2>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ptTangentPointT β<><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD><DFB7><EFBFBD><><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>GetNext<78>ķ<EFBFBD><C4B7><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listDataPoint <20><>ֵ<EFBFBD><D6B5>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>Ϊ<EFBFBD><CEAA>,<2C><>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD><EBBEAD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9>
//<2F><><EFBFBD><EFBFBD>ֵ:
// =true <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>,=false <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
BOOL ReCalculate_DataPoint(
CList<CPoint,CPoint>& listOldPoint, CList<CPoint,CPoint>& listDataPoint, double dSplineError, double dMaxError,
BOOL bTangentH = FALSE, CPoint ptTangentPointH = CPoint(0,0), BOOL bTangentT = FALSE, CPoint ptTangentPointT = CPoint(0,0));
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>
//<2F>ر<EFBFBD>˵<EFBFBD><CBB5>:
// (1)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD><EFBFBD>m_listCtrlPoint<6E><74>m_listKnot,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// (2)<29><><EFBFBD><EFBFBD>ʱҪ<CAB1><D2AA>֤listKnot.GetCount()=listCtrlPoint.GetCount()+4,<2C><><EFBFBD><EFBFBD>NURBS<42><53><EFBFBD>ߵ<EFBFBD>Ҫ<EFBFBD><D2AA>,<2C><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA>֤<EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷ<EFBFBD><C8B7>:<3A><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľ<EFBFBD><C4BD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ǵ<EFBFBD><C7B4><EFBFBD><EFBFBD><EFBFBD>
// (3)<29><>DXF<58><46><EFBFBD>ļ<EFBFBD><C4BC>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD>NURBS<42><53><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>ֱ<EFBFBD>ӵ<EFBFBD><D3B5>ñ<EFBFBD><C3B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listCtrlPoint <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>
// listKnot <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
// dMaxError <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listDataPoint <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>,<2C><>:<3A><><EFBFBD>߾<EFBFBD><DFBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9>
// listRealPoint ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// =true <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>,=false <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
BOOL Calculate_CtrlPoint(CPDSNurbsPointList& listCtrlPoint, CPDSNurbsKnotList& listKnot, double dMaxError, CPDSNurbsPointList& listDataPoint, CPDSNurbsPointList& listRealPoint);
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listCtrlPoint <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>
// listKnot <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listDataPoint <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>,<2C><>:<3A><><EFBFBD>߾<EFBFBD><DFBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9>
//<2F><><EFBFBD><EFBFBD>ֵ:
// =true <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>,=false <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
BOOL Calculate_CtrlPoint(CPDSNurbsPointList& listCtrlPoint, CPDSNurbsKnotList& listKnot, CPDSNurbsPointList& listDataPoint);
protected:
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>(<28><><EFBFBD><EFBFBD><E3BFAA><EFBFBD><EFBFBD>)
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listDataPoint <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD><DFBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9>
// bTangentH =true ͷ<><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,=false ͷ<><CDB7>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ptTangentPointH ͷ<><CDB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD><DFB7><EFBFBD><><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>GetPrev<65>ķ<EFBFBD><C4B7><EFBFBD>
// bTangentT =true β<><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,=false β<><CEB2>û<EFBFBD><C3BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ptTangentPointT β<><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߷<EFBFBD><DFB7><EFBFBD><><D6B8><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>GetNext<78>ķ<EFBFBD><C4B7><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listCtrlPoint <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>,<2C><><EFBFBD><EFBFBD>NURBS<42><53><EFBFBD>ߵĿ<DFB5><C4BF>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><EFBFBD><E4B3A4>=listDataPoint.GetCount()+2
// listKnot <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
void CalculateCtrlPoint_Open(CPDSNurbsPointList& listDataPoint, BOOL bTangentH, CPDSNurbsPoint ptTangentPointH, BOOL bTangentT, CPDSNurbsPoint ptTangentPointT, CPDSNurbsPointList& listCtrlPoint, CPDSNurbsKnotList& listKnot);
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>(<28>պ<EFBFBD><D5BA><EFBFBD>)
//<2F>ر<EFBFBD>˵<EFBFBD><CBB5>:
// (1)listInputPoint<6E><74>β<EFBFBD><CEB2><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD>ͷ<EFBFBD><CDB7><><D2B2><EFBFBD>Բ<EFBFBD><D4B2><EFBFBD><EFBFBD><EFBFBD>
// (2)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>listCtrlPointͷβ<CDB7><CEB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><>ʾ<EFBFBD>ٴλص<CEBB>ͷ<EFBFBD><CDB7><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listInputPoint <20><>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><><D6B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߾<EFBFBD><DFBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Щ<EFBFBD><D0A9>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listCtrlPoint <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>,<2C><><EFBFBD><EFBFBD>NURBS<42><53><EFBFBD>ߵĿ<DFB5><C4BF>ƶ<EFBFBD><C6B6><EFBFBD><EFBFBD>λ<EFBFBD><CEBB><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// listKnot <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
void CalculateCtrlPoint_Close(CPDSNurbsPointList& listInputPoint, CPDSNurbsPointList& listCtrlPoint, CPDSNurbsKnotList& listKnot);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD>߶εij<CEB5><C4B3><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listCtrlPoint <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>
// iIndex <20>ε<EFBFBD><CEB5><EFBFBD><EFBFBD><EFBFBD>ֵ,ָ<><D6B8><EFBFBD><EFBFBD>(listCtrlPoint[iIndex], [iIndex+1])<29><><EFBFBD>γɵ<CEB3><C9B5>߶<EFBFBD>,<2C><><EFBFBD><EFBFBD>:<3A><>0<EFBFBD><30>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>([0],[1])
//<2F><><EFBFBD><EFBFBD>ֵ:
// <20><><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵԽ<D6B5><D4BD><EFBFBD>򷵻<EFBFBD>0
double GetSegmentLength(CPDSNurbsPointList& listCtrlPoint, int iIndex);
//<2F><><EFBFBD>Ҹ<EFBFBD><D2B8><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
//<2F>ر<EFBFBD>˵<EFBFBD><CBB5>:
// (1)<29><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ľڵ<C4BD>λ<EFBFBD><CEBB>[listKnot[i],listKnot[i+1]),<2C><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD>i
// (2)ע<><D7A2><EFBFBD><EFBFBD><EFBFBD>Ե<EFBFBD><D4B5><EFBFBD>listKnot[i],һ<><D2BB>Ҫ<EFBFBD>ϸ<EFBFBD>С<EFBFBD><D0A1>[i+1]
// (3)<29><>NURBS<42><53><EFBFBD>ߵĶ<DFB5><C4B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֪<EFBFBD><D6AA>,<2C><><EFBFBD><EFBFBD>{A,A,A,A...}ǰ<>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD>,<2C><><EFBFBD>Ըú<D4B8><C3BA><EFBFBD><EFBFBD>ķ<EFBFBD><C4B7><EFBFBD>ֵ<EFBFBD><D6B5>3<EFBFBD><33>ʼ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listKnot <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// dKnot <20>ڵ<EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// <20><><EFBFBD><EFBFBD>ֵ,<2C><>0<EFBFBD><30>ʼ,<2C><>Ϊ-1<><31><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
int FindKnotIndex(CPDSNurbsKnotList& listKnot, double dKnot);
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD>Ľڵ<C4BD><DAB5><EFBFBD>ֵ,<2C><><EFBFBD><EFBFBD>B<EFBFBD><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
//<2F>ر<EFBFBD>˵<EFBFBD><CBB5>:
// (1)<29><><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD>ݹ麯<DDB9><E9BAAF>,<2C><>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD>iDegree-1<><31><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><DDBD>м<EFBFBD><D0BC><EFBFBD>
// (2)<29>ڼ<EFBFBD><DABC><EFBFBD><EFBFBD>Ĺ<EFBFBD><C4B9><EFBFBD><EFBFBD>п<EFBFBD><D0BF>ܳ<EFBFBD><DCB3>ַ<EFBFBD>ĸΪ0/0<><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C>˴<EFBFBD><CBB4><EFBFBD><EFBFBD>Ƕ<EFBFBD><C7B6><EFBFBD>0/0=0
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listKnot <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
// dKnot <20><><EFBFBD><EFBFBD><EFBFBD>Ľڵ<C4BD><DAB5><EFBFBD>ֵ
// iIndex dKnot<6F><74><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>ֵ
// iDegree NURBS<42><53><EFBFBD>ߵĴ<DFB5><C4B4><EFBFBD>,һ<><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>3,<2C><><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ƶ<EFBFBD>,<2C><>ôֻ<C3B4><D6BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>2<EFBFBD><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// B<><42><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
double CalculateKnot(CPDSNurbsKnotList& listKnot, double dKnot, int iIndex, int iDegree);
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD>Ľڵ<C4BD><DAB5><EFBFBD>ֵ,<2C><><EFBFBD><EFBFBD>NURBS<42><53><EFBFBD><EFBFBD><EFBFBD>ϵĵ<CFB5><C4B5><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listCtrlPoint <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>
// listKnot <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
// dKnot <20><><EFBFBD><EFBFBD><EFBFBD>Ľڵ<C4BD><DAB5><EFBFBD>ֵ
// iDegree <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵĴ<DFB5><C4B4><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ĵ<EFBFBD>λ<EFBFBD><CEBB>
CPDSNurbsPoint CalculateNurbsPoint(CPDSNurbsPointList& listCtrlPoint, CPDSNurbsKnotList& listKnot, double dKnot, int iDegree);
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>Ҹ<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listCtrlPoint <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>
// listKnot <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
// ptPrevNurbsPoint ǰһ<C7B0><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// dPrevKnot ǰһ<C7B0><D2BB><EFBFBD><EFBFBD><EFBFBD>Ľڵ<C4BD>
// ptNextNurbsPoint <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// dNextKnot <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>Ľڵ<C4BD>
// iDegree <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵĴ<DFB5><C4B4><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// <20>Ҹ<EFBFBD>
double CalculateChordHeight(
CPDSNurbsPointList& listCtrlPoint, CPDSNurbsKnotList& listKnot,
CPDSNurbsPoint ptPrevNurbsPoint, double dPrevKnot,
CPDSNurbsPoint ptNextNurbsPoint, double dNextKnot, int iDegree);
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȷֺ<C8B7><D6BA>Ľڵ<C4BD>
//<2F>ر<EFBFBD>˵<EFBFBD><CBB5>:
// (1)<29><>dPrevKnot=dNextKnot,<2C><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// dPrevKnot ǰһ<C7B0><D2BB><EFBFBD>ڵ<EFBFBD>
// dNextKnot <20><>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
// iCount <20><><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ĵ<EFBFBD><C4B5><EFBFBD><EFBFBD><EFBFBD>,<2C><>=2,<2C><>ʾ<EFBFBD><CABE>2<EFBFBD><32><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ{dPrevKnot,<2C>ڵ<EFBFBD>1,<2C>ڵ<EFBFBD>2,dNextKnot}
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listDivideKnot <20>ָ<EFBFBD><D6B8><EFBFBD><EFBFBD>Ľڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>dPrevKnot<6F><74>dNextKnot
void CalculateDivideKnot(double dPrevKnot, double dNextKnot, int iCount, CPDSNurbsKnotList& listDivideKnot);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD>֮<EFBFBD><D6AE><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>
//<2F>ر<EFBFBD>˵<EFBFBD><CBB5>:
// (1)<29><>dPrevKnot=dNextKnot,<2C><>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֻ<EFBFBD><D6BB>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listCtrlPoint <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>
// listKnot <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
// dPrevKnot ǰһ<C7B0><D2BB><EFBFBD>ڵ<EFBFBD>
// dNextKnot <20><>һ<EFBFBD><D2BB><EFBFBD>ڵ<EFBFBD>
// iDegree <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵĴ<DFB5><C4B4><EFBFBD>
// dMaxError <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,<2C><>:ÿ<><C3BF><EFBFBD>߶ε<DFB6><CEB5>Ҹ߲<D2B8><DFB2>ܳ<EFBFBD><DCB3><EFBFBD><EFBFBD><EFBFBD>ֵ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listOutputPoint ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>,<2C><><EFBFBD><EFBFBD>dPrevKnot<6F><74>dNextKnot<6F><74>Ӧ<EFBFBD>ĵ<EFBFBD>
void CalculateNurbsPoint_BetweenTwoKnot(
CPDSNurbsPointList& listCtrlPoint, CPDSNurbsKnotList& listKnot, double dPrevKnot, double dNextKnot,
int iDegree, double dMaxError, CPDSNurbsPointList& listOutputPoint);
//<2F><><EFBFBD>ݵȷֺ<C8B7><D6BA>Ľڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listCtrlPoint <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>
// listKnot <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
// listDivideKnot <20>ȷֺ<C8B7><D6BA>Ľڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
// iDegree <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ߵĴ<DFB5><C4B4><EFBFBD>
// dMaxError <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,<2C><>:ÿ<><C3BF><EFBFBD>߶ε<DFB6><CEB5>Ҹ߲<D2B8><DFB2>ܳ<EFBFBD><DCB3><EFBFBD><EFBFBD><EFBFBD>ֵ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listOutputPoint ʵ<>ʵ<EFBFBD><CAB5><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>,<2C><><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ<EFBFBD><CEAA>
void CalculateNurbsPoint_UseDivideKnot(
CPDSNurbsPointList& listCtrlPoint, CPDSNurbsKnotList& listKnot, CPDSNurbsKnotList& listDivideKnot,
int iDegree, double dMaxError, CPDSNurbsPointList& listOutputPoint);
//<2F><><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// ptPrevNurbsPoint ǰһ<C7B0><D2BB><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>weightȥ<74><C8A5>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ptNextNurbsPoint <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>weightȥ<74><C8A5>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// <20>е<EFBFBD>,<2C><><EFBFBD><EFBFBD>weight=1
CPDSNurbsPoint GetMiddleNurbsPoint(CPDSNurbsPoint ptPrevNurbsPoint, CPDSNurbsPoint ptNextNurbsPoint);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>֮<EFBFBD><D6AE><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// ptPrevNurbsPoint ǰһ<C7B0><D2BB><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>weightȥ<74><C8A5>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// ptNextNurbsPoint <20><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD>weightȥ<74><C8A5>֮<EFBFBD><D6AE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// <20><><EFBFBD><EFBFBD>
double TwoNurbsPointLength(CPDSNurbsPoint ptPrevNurbsPoint, CPDSNurbsPoint ptNextNurbsPoint);
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>߶<EFBFBD><DFB6>ϵIJ<CFB5><C4B2><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD>
CPDSNurbsPoint ParamToNurbsPoint(CPDSNurbsPoint ptPrevNurbsPoint, CPDSNurbsPoint ptNextNurbsPoint, double dParam);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listPoint <20><><EFBFBD><EFBFBD>
// ptSelPoint <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// dMinDistance <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// <20><><EFBFBD><EFBFBD>ֵ,<2C><>0<EFBFBD><30>ʼ
int FindNearestIndex(CList<CPoint,CPoint>& listPoint, CPoint ptSelPoint, double& dMinDistance);
//<2F><><EFBFBD>ۼ<EFBFBD><DBBC>ҳ<EFBFBD><D2B3>ķ<EFBFBD>ʽ<EFBFBD><CABD><EFBFBD>ɽڵ<C9BD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listDataPoint <20><>ֵ<EFBFBD><D6B5>,<2C><><EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listUniqueKnot <20><><EFBFBD>ظ<EFBFBD><D8B8>Ľڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
// listKnot <20>ظ<EFBFBD><D8B8>Ľڵ<C4BD><DAB5><EFBFBD><EFBFBD><EFBFBD>
void GenerateKnot_ChordLength(CPDSNurbsPointList& listDataPoint, CPDSNurbsKnotList& listUniqueKnot, CPDSNurbsKnotList& listKnot);
//<2F><><EFBFBD><EFBFBD><E3B4B9><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8><EFBFBD>ϵIJ<CFB5><C4B2><EFBFBD>ֵ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// ptNurbsPointS ʸ<><CAB8>S
// ptNurbsPointE ʸ<><CAB8>E
// ptNurbsPoint1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʸ<EFBFBD><CAB8><EFBFBD>ϵIJ<CFB5><C4B2><EFBFBD>,<2C><><EFBFBD><EFBFBD>SE<53><45><EFBFBD>غ<EFBFBD><D8BA><EFBFBD>ֱ<EFBFBD>ӷ<EFBFBD><D3B7><EFBFBD>0
double GetNurbsPointVerticalParam(CPDSNurbsPoint ptNurbsPointS, CPDSNurbsPoint ptNurbsPointE, CPDSNurbsPoint ptNurbsPoint1);
//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><E3B5BD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// ptNurbsPoint1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// listNurbsPoint <20><><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// <20><><EFBFBD><EFBFBD>
double DistanceOfNurbsPointPloyline(CPDSNurbsPoint ptNurbsPoint1, CPDSNurbsPointList& listNurbsPoint);
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD><D0B5>ĸ<EFBFBD><C4B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// ptNurbsPoint1 <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// listNurbsPoint <20><><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// dDistance <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CPDSNurbsPoint FindNearestNurbsPoint(CPDSNurbsPoint ptNurbsPoint1, CPDSNurbsPointList& listNurbsPoint, double& dDistance);
//<2F>ж<EFBFBD><D0B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD>Ƿ<EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listOldPoint <20>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD>
// listNewPoint <20>µ<EFBFBD><C2B5><EFBFBD><EFBFBD><EFBFBD>
// dMaxError <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
//<2F><><EFBFBD><EFBFBD>ֵ:
// =true <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ÿ<EFBFBD><C3BF><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE>С<EBB6BC>ڻ<EFBFBD><DABB>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,=false ij<><C4B3><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
BOOL DistanceSmallerThanError(CList<CPoint,CPoint>& listOldPoint, CList<CPoint,CPoint>& listNewPoint, double dMaxError);
//<2F><><EFBFBD>ݸ<EFBFBD><DDB8><EFBFBD><EFBFBD>Ŀ<EFBFBD><C4BF>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD>,<2C><><EFBFBD><EFBFBD>ʵ<EFBFBD>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>:
// listCtrlPoint <20><><EFBFBD>Ƶ<EFBFBD><C6B5><EFBFBD>
// listKnot <20>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD>
// iSelIndex <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,<2C><>0<EFBFBD><30>ʼ,<2C>Ӹ<EFBFBD><D3B8><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5>ʼ,<2C><>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>μ<EFBFBD><CEBC><EFBFBD>,<2C><><EFBFBD>Ƚ<EFBFBD>ƫ<EFBFBD><C6AB>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƫ<EFBFBD><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// dSplineError <20><><EFBFBD><EFBFBD>NURBS<42><53><EFBFBD>ߵ<EFBFBD><DFB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// dMaxError ʵ<>ʵ<EFBFBD><CAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɵ<EFBFBD><C9B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
// listOldPoint <20>ɵ<EFBFBD><C9B5><EFBFBD>
//<2F><><EFBFBD><EFBFBD>ֵ:
// =true <20><><EFBFBD><EFBFBD><EFBFBD>ɹ<EFBFBD>,ÿ<><C3BF><EFBFBD>С<E3B6BC>ڵ<EFBFBD><DAB5><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ,=false <20><><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7><><C4B3><EFBFBD><EFBFBD><EFBFBD>ľ<EFBFBD><C4BE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
BOOL Calculate_CtrlPoint_SmallerThanError(CPDSNurbsPointList& listCtrlPoint, CPDSNurbsKnotList& listKnot, int iSelIndex, double dSplineError, double dMaxError, CList<CPoint,CPoint>& listOldPoint);
};
#endif // _PDS_NURBS_H_