Browse Source

Fixed BezierCurve:render to avoid adding collinear points in some situations. Resolves issue #1501.

Alex Szpakowski 6 years ago
parent
commit
fc8ede263e
1 changed files with 6 additions and 3 deletions
  1. 6 3
      src/modules/math/BezierCurve.cpp

+ 6 - 3
src/modules/math/BezierCurve.cpp

@@ -69,11 +69,14 @@ void subdivide(vector<love::Vector2> &points, int k)
 	subdivide(right, k-1);
 
 	// merge (right is in reversed order)
-	points.resize(left.size() + right.size() - 1);
-	for (size_t i = 0; i < left.size(); ++i)
+	// By this point the 'left' array has a point at the end that's collinear
+	// with other points. It's still needed for the subdivide calls above but we
+	// can get rid of it here.
+	points.resize(left.size() + right.size() - 2);
+	for (size_t i = 0; i < left.size() - 1; ++i)
 		points[i] = left[i];
 	for (size_t i = 1; i < right.size(); ++i)
-		points[i-1 + left.size()] = right[right.size() - i - 1];
+		points[i-1 + left.size() - 1] = right[right.size() - i - 1];
 }
 
 }