mosra / magnum

Lightweight and modular C++11 graphics middleware for games and data visualization
https://magnum.graphics/
Other
4.74k stars 439 forks source link

Conversion from CubicHermite to Bezier is wrong #625

Open MFridlyand opened 1 year ago

MFridlyand commented 1 year ago

Following snippet demontsrates the issue TEST_CASE("Hermite to Bezier") { Magnum::Vector2 t1(0.1f, 0.3f); Magnum::Vector2 p1(1.0f, 1.0f); Magnum::Vector2 t2(0.5f, 0.5f); Magnum::Vector2 p2(2.0f, 7.0f); Magnum::CubicHermite2D a(t1, p1, t1); Magnum::CubicHermite2D b(t2, p2, t2); using CubicBezier2 = Magnum::Math::CubicBezier<2, Magnum::Float>; auto bezier = CubicBezier2::fromCubicHermite(a, b); std::vector params = { 0.0f, 0.1f, 0.2f, 0.3f, 0.4f, 0.5f, 0.6f, 0.7f, 0.8f, 0.9f, 1.0f }; for (auto t : params) { Magnum::Vector2 hermite_value = Magnum::Math::splerp(a, b, t); Magnum::Vector2 bezier_value = bezier.value(t); if (fabs(hermite_value.x() - bezier_value.x()) > 0.1f || fabs(hermite_value.y() - bezier_value.y()) > 0.1f) CHECK(false); // t = 0.1 hermite = [1.03, 1.18] bezier = [0.55, 0.70] } }

Also fromCubicHermite is not enabled for CubicHermite1D