📄 mgcpolynomialcurve3.cpp
字号:
// Magic Software, Inc.
// http://www.magic-software.com
// Copyright (c) 2000, All Rights Reserved
//
// Source code from Magic Software is supplied under the terms of a license
// agreement and may not be copied or disclosed except in accordance with the
// terms of that agreement. The various license agreements may be found at
// the Magic Software web site. This file is subject to the license
//
// FREE SOURCE CODE
// http://www.magic-software.com/License/free.pdf
#include "MgcPolynomialCurve3.h"
//----------------------------------------------------------------------------
MgcPolynomialCurve3::MgcPolynomialCurve3 (MgcPolynomial* pkXPoly,
MgcPolynomial* pkYPoly, MgcPolynomial* pkZPoly)
:
MgcSingleCurve3(0.0,1.0)
{
assert( pkXPoly && pkYPoly && pkZPoly );
assert( pkXPoly->GetDegree() == pkYPoly->GetDegree() );
assert( pkXPoly->GetDegree() == pkZPoly->GetDegree() );
m_pkXPoly = pkXPoly;
m_pkYPoly = pkYPoly;
m_pkZPoly = pkZPoly;
m_kXDer1 = m_pkXPoly->GetDerivative();
m_kYDer1 = m_pkYPoly->GetDerivative();
m_kZDer1 = m_pkZPoly->GetDerivative();
m_kXDer2 = m_kXDer1.GetDerivative();
m_kYDer2 = m_kYDer1.GetDerivative();
m_kZDer2 = m_kZDer1.GetDerivative();
m_kXDer3 = m_kXDer2.GetDerivative();
m_kYDer3 = m_kYDer2.GetDerivative();
m_kZDer3 = m_kZDer2.GetDerivative();
}
//----------------------------------------------------------------------------
MgcPolynomialCurve3::~MgcPolynomialCurve3 ()
{
delete m_pkXPoly;
delete m_pkYPoly;
delete m_pkZPoly;
}
//----------------------------------------------------------------------------
MgcVector3 MgcPolynomialCurve3::GetPosition (MgcReal fTime) const
{
MgcVector3 kResult((*m_pkXPoly)(fTime),(*m_pkYPoly)(fTime),
(*m_pkZPoly)(fTime));
return kResult;
}
//----------------------------------------------------------------------------
MgcVector3 MgcPolynomialCurve3::GetFirstDerivative (MgcReal fTime) const
{
MgcVector3 kResult(m_kXDer1(fTime),m_kYDer1(fTime),m_kZDer1(fTime));
return kResult;
}
//----------------------------------------------------------------------------
MgcVector3 MgcPolynomialCurve3::GetSecondDerivative (MgcReal fTime) const
{
MgcVector3 kResult(m_kXDer2(fTime),m_kYDer2(fTime),m_kZDer2(fTime));
return kResult;
}
//----------------------------------------------------------------------------
MgcVector3 MgcPolynomialCurve3::GetThirdDerivative (MgcReal fTime) const
{
MgcVector3 kResult(m_kXDer3(fTime),m_kYDer3(fTime),m_kZDer3(fTime));
return kResult;
}
//----------------------------------------------------------------------------
MgcReal MgcPolynomialCurve3::GetVariation (MgcReal fT0, MgcReal fT1,
const MgcVector3* pkP0, const MgcVector3* pkP1) const
{
MgcVector3 kP0, kP1;
if ( !pkP0 )
{
kP0 = GetPosition(fT0);
pkP0 = &kP0;
}
if ( !pkP1 )
{
kP1 = GetPosition(fT1);
pkP1 = &kP1;
}
// construct line segment A + t*B
MgcReal fInvDT = 1.0/(fT1 - fT0);
MgcVector3 kB = fInvDT*(*pkP1 - *pkP0);
MgcVector3 kA = *pkP0 - fT0*kB;
MgcPolynomial kLx(1), kLy(1), kLz(1);
kLx[0] = kA.x;
kLx[1] = kB.x;
kLy[0] = kA.y;
kLy[1] = kB.y;
kLz[0] = kA.z;
kLz[1] = kB.z;
// compute |X(t) - L(t)|^2
MgcPolynomial kDx = *m_pkXPoly - kLx;
MgcPolynomial kDy = *m_pkYPoly - kLy;
MgcPolynomial kDz = *m_pkZPoly - kLz;
MgcPolynomial kNormSqr = kDx*kDx + kDy*kDy + kDz*kDz;
// compute indefinite integral of |X(t)-L(t)|^2
MgcPolynomial kIntegral(kNormSqr.GetDegree()+1);
kIntegral[0] = 0.0;
for (int i = 1; i <= kIntegral.GetDegree(); i++)
kIntegral[i] = kNormSqr[i-1]/i;
// return definite Integral(t0,t1,|X(t)-L(t)|^2)
MgcReal fResult = kIntegral(fT1) - kIntegral(fT0);
return fResult;
}
//----------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -