⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mgcpolynomialcurve2.cpp

📁 《3D游戏引擎设计》的源码
💻 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 "MgcPolynomialCurve2.h"

//----------------------------------------------------------------------------
MgcPolynomialCurve2::MgcPolynomialCurve2 (MgcPolynomial* pkXPoly,
    MgcPolynomial* pkYPoly)
    :
    MgcSingleCurve2(0.0,1.0)
{
    assert( pkXPoly && pkYPoly );
    assert( pkXPoly->GetDegree() == pkYPoly->GetDegree() );

    m_pkXPoly = pkXPoly;
    m_pkYPoly = pkYPoly;
    m_kXDer1 = m_pkXPoly->GetDerivative();
    m_kYDer1 = m_pkYPoly->GetDerivative();
    m_kXDer2 = m_kXDer1.GetDerivative();
    m_kYDer2 = m_kYDer1.GetDerivative();
    m_kXDer3 = m_kXDer2.GetDerivative();
    m_kYDer3 = m_kYDer2.GetDerivative();
}
//----------------------------------------------------------------------------
MgcPolynomialCurve2::~MgcPolynomialCurve2 ()
{
    delete m_pkXPoly;
    delete m_pkYPoly;
}
//----------------------------------------------------------------------------
MgcVector2 MgcPolynomialCurve2::GetPosition (MgcReal fTime) const
{
    MgcVector2 kResult((*m_pkXPoly)(fTime),(*m_pkYPoly)(fTime));
    return kResult;
}
//----------------------------------------------------------------------------
MgcVector2 MgcPolynomialCurve2::GetFirstDerivative (MgcReal fTime) const
{
    MgcVector2 kResult(m_kXDer1(fTime),m_kYDer1(fTime));
    return kResult;
}
//----------------------------------------------------------------------------
MgcVector2 MgcPolynomialCurve2::GetSecondDerivative (MgcReal fTime) const
{
    MgcVector2 kResult(m_kXDer2(fTime),m_kYDer2(fTime));
    return kResult;
}
//----------------------------------------------------------------------------
MgcVector2 MgcPolynomialCurve2::GetThirdDerivative (MgcReal fTime) const
{
    MgcVector2 kResult(m_kXDer3(fTime),m_kYDer3(fTime));
    return kResult;
}
//----------------------------------------------------------------------------
MgcReal MgcPolynomialCurve2::GetVariation (MgcReal fT0, MgcReal fT1,
    const MgcVector2* pkP0, const MgcVector2* pkP1) const
{
    MgcVector2 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);
    MgcVector2 kB = fInvDT*(*pkP1 - *pkP0);
    MgcVector2 kA = *pkP0 - fT0*kB;
    MgcPolynomial kLx(1), kLy(1);
    kLx[0] = kA.x;
    kLx[1] = kB.x;
    kLy[0] = kA.y;
    kLy[1] = kB.y;

    // compute |X(t) - L(t)|^2
    MgcPolynomial kDx = *m_pkXPoly - kLx;
    MgcPolynomial kDy = *m_pkYPoly - kLy;
    MgcPolynomial kNormSqr = kDx*kDx + kDy*kDy;

    // 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;

    // compute 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 + -