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

📄 mgcfastfunction.cpp

📁 3D Game Engine Design Source Code非常棒
💻 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

// The approximation formulas are from
//
//   Handbook of Mathematical Functions
//   Edited by M. Abramowitz and I.A. Stegun.
//   Dover Publications, Inc.
//   New York, NY
//   Ninth printing, December 1972

// For the inverse tangent calls, all approximations are valid for |t| <= 1.
// To compute ATAN(t) for t > 1, use ATAN(t) = PI/2 - ATAN(1/t).  For t < -1,
// use ATAN(t) = -PI/2 - ATAN(1/t).

// Speedups were measured on a Pentium II 400 Mhz with a release build of the
// code.  Comparisons are to the calls sin, cos, tan, and atan in the standard
// math library.

#include "MgcFastFunction.h"

//----------------------------------------------------------------------------
MgcReal MgcFastFunction::Sin0 (MgcReal fT)
{
    // assert:  0 <= fT <= PI/2
    // maximum absolute error = 1.6415e-04
    // speedup = 1.91

    MgcReal fTSqr = fT*fT;
    MgcReal fResult = 7.61e-03;
    fResult *= fTSqr;
    fResult -= 1.6605e-01;
    fResult *= fTSqr;
    fResult += 1.0;
    fResult *= fT;
    return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::Sin1 (MgcReal fT)
{
    // assert:  0 <= fT <= PI/2
    // maximum absolute error = 2.3279e-09
    // speedup = 1.40

    MgcReal fTSqr = fT*fT;
    MgcReal fResult = -2.39e-08;
    fResult *= fTSqr;
    fResult += 2.7526e-06;
    fResult *= fTSqr;
    fResult -= 1.98409e-04;
    fResult *= fTSqr;
    fResult += 8.3333315e-03;
    fResult *= fTSqr;
    fResult -= 1.666666664e-01;
    fResult *= fTSqr;
    fResult += 1.0;
    fResult *= fT;
    return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::Cos0 (MgcReal fT)
{
    // assert:  0 <= fT <= PI/2
    // maximum absolute error = 1.1880e-03
    // speedup = 2.14

    MgcReal fTSqr = fT*fT;
    MgcReal fResult = 3.705e-02;
    fResult *= fTSqr;
    fResult -= 4.967e-01;
    fResult *= fTSqr;
    fResult += 1.0;
    return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::Cos1 (MgcReal fT)
{
    // assert:  0 <= fT <= PI/2
    // maximum absolute error = 2.3082e-09
    // speedup = 1.47

    MgcReal fTSqr = fT*fT;
    MgcReal fResult = -2.605e-07;
    fResult *= fTSqr;
    fResult += 2.47609e-05;
    fResult *= fTSqr;
    fResult -= 1.3888397e-03;
    fResult *= fTSqr;
    fResult += 4.16666418e-02;
    fResult *= fTSqr;
    fResult -= 4.999999963e-01;
    fResult *= fTSqr;
    fResult += 1.0;
    return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::Tan0 (MgcReal fT)
{
    // assert:  0 <= fT <= PI/4
    // maximum absolute error = 8.0613e-04
    // speedup = 2.51

    MgcReal fTSqr = fT*fT;
    MgcReal fResult = 2.033e-01;
    fResult *= fTSqr;
    fResult += 3.1755e-01;
    fResult *= fTSqr;
    fResult += 1.0;
    fResult *= fT;
    return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::Tan1 (MgcReal fT)
{
    // assert:  0 <= fT <= PI/4
    // maximum absolute error = 1.8897e-08
    // speedup = 1.71

    MgcReal fTSqr = fT*fT;
    MgcReal fResult = 9.5168091e-03;
    fResult *= fTSqr;
    fResult += 2.900525e-03;
    fResult *= fTSqr;
    fResult += 2.45650893e-02;
    fResult *= fTSqr;
    fResult += 5.33740603e-02;
    fResult *= fTSqr;
    fResult += 1.333923995e-01;
    fResult *= fTSqr;
    fResult += 3.333314036e-01;
    fResult *= fTSqr;
    fResult += 1.0;
    fResult *= fT;
    return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::InvTan0 (MgcReal fT)
{
    // assert:  |fT| <= 1
    // maximum absolute error = 4.8830e-03
    // speedup = 2.14

    MgcReal fTSqr = fT*fT;
    return fT/(1.0 + 0.28*fTSqr);
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::InvTan1 (MgcReal fT)
{
    // assert:  |fT| <= 1
    // maximum absolute error = 1.1492e-05
    // speedup = 2.16

    MgcReal fTSqr = fT*fT;
    MgcReal fResult = 0.0208351;
    fResult *= fTSqr;
    fResult -= 0.085133;
    fResult *= fTSqr;
    fResult += 0.180141;
    fResult *= fTSqr;
    fResult -= 0.3302995;
    fResult *= fTSqr;
    fResult += 0.999866;
    fResult *= fT;
    return fResult;
}
//----------------------------------------------------------------------------
MgcReal MgcFastFunction::InvTan2 (MgcReal fT)
{
    // assert:  |fT| <= 1
    // maximum absolute error = 1.3593e-08
    // speedup = 1.50

    MgcReal fTSqr = fT*fT;
    MgcReal fResult = 0.0028662257;
    fResult *= fTSqr;
    fResult -= 0.0161657367;
    fResult *= fTSqr;
    fResult += 0.0429096138;
    fResult *= fTSqr;
    fResult -= 0.0752896400;
    fResult *= fTSqr;
    fResult += 0.1065626393;
    fResult *= fTSqr;
    fResult -= 0.1420889944;
    fResult *= fTSqr;
    fResult += 0.1999355085;
    fResult *= fTSqr;
    fResult -= 0.3333314528;
    fResult *= fTSqr;
    fResult += 1.0;
    fResult *= fT;
    return fResult;
}
//----------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -