Add support for Bezier curves of arbitrary degree.

New functions:

bezier = love.math.newBezierCurve(control-points)
degree = bezier:getDegree() -- degree = #control-points - 1
x,y = bezier:getControlPoint(pos) -- pos < 0 => string.sub semantics
bezier:setControlPoint(pos, x, y) -- pos < 0 => string.sub semantics
bezier:insertControlPoint(x,y, [pos = -1])
x,y = bezier:eval(t) -- 0 <= t <= 1
polyline = bezier:render([accuracy = 5]) -- returns a table of points

Example:

function love.load()
	b = love.math.newBezierCurve(10,10, 80,400, 380,400, 470,10)
end

function love.draw()
	if not curve then -- curve rendering is expensive-ish
		curve = b:render()
	end
	love.graphics.line(curve)
end
This commit is contained in:
vrld
2013-05-12 21:57:06 +02:00
parent aa59761177
commit 19eade843c
6 changed files with 60 additions and 0 deletions
+6
View File
@@ -21,6 +21,7 @@
// LOVE
#include "MathModule.h"
#include "common/Vector.h"
#include "BezierCurve.h"
// STL
#include <cmath>
@@ -95,6 +96,11 @@ RandomGenerator *Math::newRandomGenerator()
return new RandomGenerator();
}
BezierCurve *Math::newBezierCurve(const vector<Vector> &points)
{
return new BezierCurve(points);
}
vector<Triangle> Math::triangulate(const vector<vertex> &polygon)
{
if (polygon.size() < 3)