Browse Source

simplex_interpolator: first (non-working) draft for complete interpolator process

undefined
Guillaume Bittoun Sam Hocevar <sam@hocevar.net> 11 years ago
parent
commit
5dbff4b35c
2 changed files with 35 additions and 30 deletions
  1. +30
    -20
      src/lol/math/simplex_interpolator.h
  2. +5
    -10
      src/t/math/simplex_interpolator.cpp

+ 30
- 20
src/lol/math/simplex_interpolator.h View File

@@ -22,25 +22,19 @@ class simplex_interpolator
public: public:


simplex_interpolator() : simplex_interpolator() :
m_samples()
m_gradients()
{ {
this->InitBase(); this->InitBase();
} }


simplex_interpolator(arraynd<N, T> const & samples) :
m_samples(samples)
inline void SetGradients(arraynd<N, vec_t<float, N> > const & gradients)
{ {
this->InitBase();
this->m_gradients = gradients;
} }


inline void SetSamples(arraynd<N, T> const & samples)
inline arraynd<N, vec_t<float, N> > const & GetGradients() const
{ {
this->m_samples = samples;
}

inline arraynd<N, T> const & GetSamples() const
{
return this->m_samples;
return this->m_gradients;
} }


// Single interpolation // Single interpolation
@@ -55,22 +49,38 @@ public:


this->ExtractFloorDecimal(simplex_position, floor_point, decimal_point); this->ExtractFloorDecimal(simplex_position, floor_point, decimal_point);


vec_t<float, N> index_order = this->GetIndexOrder(decimal_point);

// Resetting decimal point in regular orthonormal coordinates // Resetting decimal point in regular orthonormal coordinates
decimal_point = m_base * decimal_point; decimal_point = m_base * decimal_point;


vec_t<float, N> index_order = this->GetIndexOrder(decimal_point);

return this->LastInterp(floor_point, decimal_point, sign);
return this->LastInterp(floor_point, decimal_point, index_order);
} }


protected: protected:


inline T LastInterp(vec_t<int, N> const & floor_point, inline T LastInterp(vec_t<int, N> const & floor_point,
vec_t<float, N> const & decimal_point, vec_t<float, N> const & decimal_point,
int const & sign) const
vec_t<float, N> index_order) const
{ {
// There is still a lot of work to do…
return T();
vec_t<float, N> point_of_interest;
float result = 0;

for (int i = 0 ; i < N ; ++i)
{
float dist = 0.5 - sqlength(decimal_point - point_of_interest);
vec_t<float, N> gradient = this->m_gradients[floor_point];

if (dist > 0)
{
result += dist * dist * dist * dist * dot(gradient, decimal_point - point_of_interest);
}

point_of_interest[index_order[i]] += 1;
floor_point[i] = this->Mod(floor_point[i] + 1, index_order[i]);
}

return result;
} }


inline vec_t<int, N> GetIndexOrder(vec_t<float, N> const & decimal_point) inline vec_t<int, N> GetIndexOrder(vec_t<float, N> const & decimal_point)
@@ -98,7 +108,7 @@ protected:


inline int Mod(int value, int index) const inline int Mod(int value, int index) const
{ {
int const dim = this->m_samples.GetSize()[index];
int const dim = this->m_gradients.GetSize()[index];
int const ret = value % dim; int const ret = value % dim;
return ret >= 0 ? ret : ret + dim; return ret >= 0 ? ret : ret + dim;
} }
@@ -113,7 +123,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
// Never exceed the size of the gradients 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);
} }
@@ -151,7 +161,7 @@ protected:
} }


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


} }

+ 5
- 10
src/t/math/simplex_interpolator.cpp View File

@@ -29,11 +29,6 @@ public:
{ {
} }


test_interpolator(arraynd<N, T> const & samples) :
simplex_interpolator<N, T>(samples)
{
}

void DumpMatrix() void DumpMatrix()
{ {
std::cout << std::endl; std::cout << std::endl;
@@ -101,11 +96,11 @@ lolunit_declare_fixture(SimplexInterpolatorTest)


void TearDown() {} void TearDown() {}


lolunit_declare_test(CompoundVariable)
{
test_interpolator<2, real> b({{ real(0) }});
test_interpolator<2, vec2> c({{ vec2(0) }});
}
// lolunit_declare_test(CompoundVariable)
// {
// test_interpolator<2, real> b({{ real(0) }});
// test_interpolator<2, vec2> c({{ vec2(0) }});
// }


template<int N> template<int N>
void check_base_matrix() void check_base_matrix()


Loading…
Cancel
Save