123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- #pragma once
- #include <Mathematics/Math.h>
- namespace WwiseGTE
- {
- template <typename Real>
- class ChebyshevRatio
- {
- public:
-
-
- static void Get(Real t, Real cosA, Real& f0, Real& f1)
- {
- if (cosA < (Real)1)
- {
-
- Real A = std::acos(cosA);
- Real invSinA = (Real)1 / std::sin(A);
- f0 = std::sin(((Real)1 - t) * A) * invSinA;
- f1 = std::sin(t * A) * invSinA;
- }
- else
- {
-
- f0 = (Real)1 - t;
- f1 = (Real)t;
- }
- }
-
-
-
-
-
- template <int N>
- static void GetEstimate(Real t, Real y, Real & f0, Real & f1)
- {
- static_assert(1 <= N && N <= 16, "Invalid degree.");
-
-
-
-
- Real const onePlusMu[16] =
- {
- (Real)1.62943436108234530,
- (Real)1.73965850021313961,
- (Real)1.79701067629566813,
- (Real)1.83291820510335812,
- (Real)1.85772477879039977,
- (Real)1.87596835698904785,
- (Real)1.88998444919711206,
- (Real)1.90110745351730037,
- (Real)1.91015881189952352,
- (Real)1.91767344933047190,
- (Real)1.92401541194159076,
- (Real)1.92944142668012797,
- (Real)1.93413793373091059,
- (Real)1.93824371262559758,
- (Real)1.94186426368404708,
- (Real)1.94508125972497303
- };
- Real const a[16] =
- {
- (N != 1 ? (Real)1 : onePlusMu[0]) / ((Real)1 * (Real)3),
- (N != 2 ? (Real)1 : onePlusMu[1]) / ((Real)2 * (Real)5),
- (N != 3 ? (Real)1 : onePlusMu[2]) / ((Real)3 * (Real)7),
- (N != 4 ? (Real)1 : onePlusMu[3]) / ((Real)4 * (Real)9),
- (N != 5 ? (Real)1 : onePlusMu[4]) / ((Real)5 * (Real)11),
- (N != 6 ? (Real)1 : onePlusMu[5]) / ((Real)6 * (Real)13),
- (N != 7 ? (Real)1 : onePlusMu[6]) / ((Real)7 * (Real)15),
- (N != 8 ? (Real)1 : onePlusMu[7]) / ((Real)8 * (Real)17),
- (N != 9 ? (Real)1 : onePlusMu[8]) / ((Real)9 * (Real)19),
- (N != 10 ? (Real)1 : onePlusMu[9]) / ((Real)10 * (Real)21),
- (N != 11 ? (Real)1 : onePlusMu[10]) / ((Real)11 * (Real)23),
- (N != 12 ? (Real)1 : onePlusMu[11]) / ((Real)12 * (Real)25),
- (N != 13 ? (Real)1 : onePlusMu[12]) / ((Real)13 * (Real)27),
- (N != 14 ? (Real)1 : onePlusMu[13]) / ((Real)14 * (Real)29),
- (N != 15 ? (Real)1 : onePlusMu[14]) / ((Real)15 * (Real)31),
- (N != 16 ? (Real)1 : onePlusMu[15]) / ((Real)16 * (Real)33)
- };
- Real const b[16] =
- {
- (N != 1 ? (Real)1 : onePlusMu[0]) * (Real)1 / (Real)3,
- (N != 2 ? (Real)1 : onePlusMu[1]) * (Real)2 / (Real)5,
- (N != 3 ? (Real)1 : onePlusMu[2]) * (Real)3 / (Real)7,
- (N != 4 ? (Real)1 : onePlusMu[3]) * (Real)4 / (Real)9,
- (N != 5 ? (Real)1 : onePlusMu[4]) * (Real)5 / (Real)11,
- (N != 6 ? (Real)1 : onePlusMu[5]) * (Real)6 / (Real)13,
- (N != 7 ? (Real)1 : onePlusMu[6]) * (Real)7 / (Real)15,
- (N != 8 ? (Real)1 : onePlusMu[7]) * (Real)8 / (Real)17,
- (N != 9 ? (Real)1 : onePlusMu[8]) * (Real)9 / (Real)19,
- (N != 10 ? (Real)1 : onePlusMu[9]) * (Real)10 / (Real)21,
- (N != 11 ? (Real)1 : onePlusMu[10]) * (Real)11 / (Real)23,
- (N != 12 ? (Real)1 : onePlusMu[11]) * (Real)12 / (Real)25,
- (N != 13 ? (Real)1 : onePlusMu[12]) * (Real)13 / (Real)27,
- (N != 14 ? (Real)1 : onePlusMu[13]) * (Real)14 / (Real)29,
- (N != 15 ? (Real)1 : onePlusMu[14]) * (Real)15 / (Real)31,
- (N != 16 ? (Real)1 : onePlusMu[15]) * (Real)16 / (Real)33
- };
- Real term0 = (Real)1 - t, term1 = t;
- Real sqr0 = term0 * term0, sqr1 = term1 * term1;
- f0 = term0;
- f1 = term1;
- for (int i = 0; i < N; ++i)
- {
- term0 *= (b[i] - a[i] * sqr0) * y;
- term1 *= (b[i] - a[i] * sqr1) * y;
- f0 += term0;
- f1 += term1;
- }
- }
- };
- }
|