503 lines
18 KiB
C
503 lines
18 KiB
C
|
/********************************************************************
|
|||
|
<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>,ij<><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_
|