Просмотр исходного кода

simplex_interpolator: use a matrices when n-D arrays are not necessary.

undefined
Sam Hocevar 11 лет назад
Родитель
Сommit
a01778d768
1 измененных файлов: 17 добавлений и 24 удалений
  1. +17
    -24
      src/lol/math/simplex_interpolator.h

+ 17
- 24
src/lol/math/simplex_interpolator.h Просмотреть файл

@@ -15,7 +15,8 @@
namespace lol namespace lol
{ {


template<int N /* Dimension of the space */, typename T = float /* floating type used for interpolation */>
template<int N, /* Dimension of the space */
typename T = float> /* Interpolated type */
class simplex_interpolator class simplex_interpolator
{ {
public: public:
@@ -35,7 +36,7 @@ public:
inline T Interp(vec_t<T, N> position) const inline T Interp(vec_t<T, N> position) const
{ {
// Computing position in simplex referential // Computing position in simplex referential
vec_t<T, N> simplex_position = this->ToSimplexRef(position);
vec_t<T, N> simplex_position = m_base_inverse * position;


// Retrieving the closest floor point and decimals // Retrieving the closest floor point and decimals
vec_t<int, N> floor_point; vec_t<int, N> floor_point;
@@ -53,7 +54,9 @@ public:


protected: protected:


inline T LastInterp(vec_t<int, N> const & floor_point, vec_t<T, N> const & decimal_point, int const & sign) const
inline T LastInterp(vec_t<int, N> const & floor_point,
vec_t<T, N> const & decimal_point,
int const & sign) const
{ {
T result = 0; T result = 0;
T floor_coeff = 0; T floor_coeff = 0;
@@ -118,35 +121,25 @@ protected:
floor_point[i] = this->Mod(floor_point[i], i); floor_point[i] = this->Mod(floor_point[i], i);
} }


inline vec_t<T, N> ToSimplexRef(vec_t<T, N> const & position) const
{
vec_t<T, N> result;

for (int i = 0 ; i < N ; ++i)
for (int j = 0 ; j < N ; ++j)
result[i] += this->m_base_inverse[j][i] * position[j];

return result;
}

inline void InitBase() inline void InitBase()
{ {
this->m_base.SetSize(vec_t<int, 2>{N, N});
this->m_base_inverse.SetSize(vec_t<int, 2>{N, N});

for (int i = 0 ; i < N ; ++i)
for (int i = 0; i < N; ++i)
{ {
for (int j = i ; j < N ; ++j)
for (int j = 0; j < i; ++j)
{
m_base[j][i] = 0;
m_base_inverse[j][i] = 0;
}

for (int j = i; j < N; ++j)
{ {
this->m_base[j][i] = sqrt((i+2)/((float)(2*i+2))) / (j > i ? i+2 : 1);
this->m_base_inverse[j][i] = sqrt((2*j+2) / ((float)(j+2))) * (j > i ? (-1 / (float)(j+1)) : 1);
m_base[j][i] = sqrt((i+2)/((float)(2*i+2))) / (j > i ? i+2 : 1);
m_base_inverse[j][i] = sqrt((2*j+2) / ((float)(j+2))) * (j > i ? (-1 / (float)(j+1)) : 1);
} }
} }
} }


arraynd<2, T> m_base;
arraynd<2, T> m_base_inverse;

mat_t<T, N, N> m_base, m_base_inverse;
arraynd<N, T> m_samples; arraynd<N, T> m_samples;
}; };




Загрузка…
Отмена
Сохранить