From 3d743714d169d028bd94032b74b54c715d993432 Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sat, 13 Jun 2009 19:26:22 +0100 Subject: [PATCH] Approximate the length of a Bezier curve --- include/BezierCurve.hpp | 27 +++++++++++++++++++++++++-- src/Points.cpp | 2 +- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/include/BezierCurve.hpp b/include/BezierCurve.hpp index c46e57f..004f48f 100644 --- a/include/BezierCurve.hpp +++ b/include/BezierCurve.hpp @@ -25,6 +25,30 @@ template struct BezierCurve { Vector p[4]; + T length; // A very rough approximation to the length + + BezierCurve(Vector p1, Vector p2, Vector p3, Vector p4) + { + p[0] = p1; + p[1] = p2; + p[2] = p3; + p[3] = p4; + + // Approximate the length + Vector cur = operator()(0.0), prev; + + length = 0.0; + + const T step = 0.01; + for (T t = 0.1; t <= 1.0; t += step) { + prev = cur; + cur = operator()(t); + + const Vector diff = cur - prev; + + length += sqrt(diff.x*diff.x + diff.y*diff.y + diff.z*diff.z); + } + } Vector operator()(T t) const { @@ -79,8 +103,7 @@ template BezierCurve makeBezierCurve(Vector p1, Vector p2, Vector p3, Vector p4) { - BezierCurve b = { { p1, p2, p3, p4 } }; - return b; + return BezierCurve(p1, p2, p3, p4); } #endif diff --git a/src/Points.cpp b/src/Points.cpp index a328585..6b9bda1 100644 --- a/src/Points.cpp +++ b/src/Points.cpp @@ -116,7 +116,7 @@ void Points::render() const double Points::segmentLength(const track::TravelToken& aToken) const { if (aToken.position == displacedEndpoint()) - return 4.0; // No idea how to calculate the /actual/ value + return myCurve.length; else return 3.0; } -- 2.39.2