Browse Source

simplex_interpolator: still refactoring

undefined
Guillaume Bittoun Sam Hocevar <sam@hocevar.net> 11 years ago
parent
commit
b2671811b9
1 changed files with 12 additions and 8 deletions
  1. +12
    -8
      src/lol/math/simplex_interpolator.h

+ 12
- 8
src/lol/math/simplex_interpolator.h View File

@@ -43,7 +43,6 @@ public:
this->ExtractFloorDecimal(simplex_position, floor_point, decimal_point); this->ExtractFloorDecimal(simplex_position, floor_point, decimal_point);


// Retrieving simplex samples to use // Retrieving simplex samples to use
vec_t<int, N> reference;
int sign; int sign;


this->GetReference(floor_point, decimal_point, reference, sign); this->GetReference(floor_point, decimal_point, reference, sign);
@@ -53,22 +52,28 @@ public:


protected: protected:


inline T LastInterp(vec_t<int, N> const & floor_point, vec_t<T, N> const & decimal_point, vec_t<int, N> const & reference, int const & sign)
inline T LastInterp(vec_t<int, N> const & floor_point, vec_t<T, N> const & decimal_point, int const & sign)
{ {
T result = 0; T result = 0;
T divider = 0;


for (int i = 0 ; i < N ; ++i) for (int i = 0 ; i < N ; ++i)
{ {
vec_t<int, N> samples_index = floor_point; vec_t<int, N> samples_index = floor_point;
samples_index[i] = this->mod(samples_index[i] + sign, i); samples_index[i] = this->mod(samples_index[i] + sign, i);


result += (1 - decimal_point[i]) * this->samples[samples_index];
result += decimal_point[i] * this->samples[samples_index];
divider += decimal_point[i];
} }


T floor_coeff = 0;
for (int i = 0 ; i < N ; ++i) for (int i = 0 ; i < N ; ++i)
result += samples[floor_point] * decimal_point[i];
floor_coeff += (1 - decimal_point[i]);


return result / N;
result += (2 * sqrt(floor_coeff) / sqrt(N)) * this->samples[floor_point];
divider += (2 * sqrt(floor_coeff) / sqrt(N));

return result / divider;
} }


inline int Mod(int value, int index) inline int Mod(int value, int index)
@@ -76,7 +81,7 @@ protected:
samples_index[index] %= this->samples.GetSize()[index]; samples_index[index] %= this->samples.GetSize()[index];
} }


inline void GetReference(vec_t<T, N> & floor_point, vec_t<T, N> & decimal_point, vec_t<int, N> & reference, int & sign)
inline void GetReference(vec_t<T, N> & floor_point, vec_t<T, N> & decimal_point, int & sign)
{ {
// Choosing the reference point which determines in which simplex we are working // Choosing the reference point which determines in which simplex we are working
// ie. (0, 0, 0, …) and upper or (this->diagonal) and lower // ie. (0, 0, 0, …) and upper or (this->diagonal) and lower
@@ -89,12 +94,10 @@ protected:


if (cumul < (sqrt(N) / 2)) if (cumul < (sqrt(N) / 2))
{ {
reference = zeros;
sign = 1; sign = 1;
} }
else else
{ {
reference = ones;
sign = -1; sign = -1;


decimal_point = 1 - decimal_point; decimal_point = 1 - decimal_point;
@@ -112,6 +115,7 @@ protected:
for (int i = 0 ; i < N ; ++i) for (int i = 0 ; i < N ; ++i)
decimal_point[i] = simplex_position[i] - floor_point[i]; decimal_point[i] = simplex_position[i] - floor_point[i];


// Never exceed the size of the samples and loop on it
for (int i = 0 ; i < N ; ++i) for (int i = 0 ; i < N ; ++i)
floor_point[i] = this->Mod(floor_point[i], i); floor_point[i] = this->Mod(floor_point[i], i);
} }


Loading…
Cancel
Save