diff --git a/src/lol/math/simplex_interpolator.h b/src/lol/math/simplex_interpolator.h index 955a494d..41a3f139 100644 --- a/src/lol/math/simplex_interpolator.h +++ b/src/lol/math/simplex_interpolator.h @@ -83,7 +83,8 @@ protected: inline int Mod(int value, int index) const { int const dim = this->m_samples.GetSize()[index]; - return value % dim + (value >= 0 ? 0 : dim); + int const ret = value % dim; + return ret >= 0 ? ret : ret + dim; } inline void GetReference(vec_t & floor_point, vec_t & decimal_point, int & sign) const diff --git a/src/t/math/simplex_interpolator.cpp b/src/t/math/simplex_interpolator.cpp index 7f1aa350..c97cee0c 100644 --- a/src/t/math/simplex_interpolator.cpp +++ b/src/t/math/simplex_interpolator.cpp @@ -23,6 +23,31 @@ lolunit_declare_fixture(SimplexInterpolatorTest) void TearDown() {} + lolunit_declare_test(GridPoints2D1x1) + { + simplex_interpolator<2> s({{1.f}}); + float val; + + val = s.Interp(GridPoint2D(-1, -1)); + lolunit_assert_doubles_equal(1.f, val, 1e-5f); + val = s.Interp(GridPoint2D(0, -1)); + lolunit_assert_doubles_equal(1.f, val, 1e-5f); + val = s.Interp(GridPoint2D(1, -1)); + lolunit_assert_doubles_equal(1.f, val, 1e-5f); + val = s.Interp(GridPoint2D(-1, 0)); + lolunit_assert_doubles_equal(1.f, val, 1e-5f); + val = s.Interp(GridPoint2D(0, 0)); + lolunit_assert_doubles_equal(1.f, val, 1e-5f); + val = s.Interp(GridPoint2D(1, 0)); + lolunit_assert_doubles_equal(1.f, val, 1e-5f); + val = s.Interp(GridPoint2D(-1, 1)); + lolunit_assert_doubles_equal(1.f, val, 1e-5f); + val = s.Interp(GridPoint2D(0, 1)); + lolunit_assert_doubles_equal(1.f, val, 1e-5f); + val = s.Interp(GridPoint2D(1, 1)); + lolunit_assert_doubles_equal(1.f, val, 1e-5f); + } + lolunit_declare_test(GridPoints2D2x2) { simplex_interpolator<2> s({{1.f, 1.f}, {1.f, 2.f}});