Math::Bezier3pm
Solution of bezier curves
Usage
use Math::Bezier;# create curve passing list of (x, y) control pointsmy $bezier = Math::Bezier->new($x1, $y1, $x2, $y2, ..., $xn, $yn);# or pass reference to list of control pointsmy $bezier = Math::Bezier->new([ $x1, $y1, $x2, $y2, ..., $xn, $yn]);# determine (x, y) at point along curve, range 0 -> 1my ($x, $y) = $bezier->point(0.5);# returns list ref in scalar contextmy $xy = $bezier->point(0.5);# return list of 20 (x, y) points along curvemy @curve = $bezier->curve(20);# returns list ref in scalar contextmy $curve = $bezier->curve(20);
Overview
This module implements the algorithm for the solution of Bezier curves as presented by Robert D. Miller in Graphics Gems V, "Quick and Simple Bezier Curve Drawing".
A new Bezier curve is created using the new() constructor, passing a list of (x, y) control points.
use Math::Bezier;my @control = ( 0, 0, 10, 20, 30, -20, 40, 0 );my $bezier = Math::Bezier->new(@control);
Alternately, a reference to a list of control points may be passed.
my $bezier = Math::Bezier->new(\@control);
The point($theta) method can then be called on the object, passing a value in the range 0 to 1 which represents the distance along the curve. When called in list context, the method returns the x and y coordinates of that point on the Bezier curve.
my ($x, $y) = $bezier->point(0.5);print "x: $x y: $y\n
When called in scalar context, it returns a reference to a list containing the x and y coordinates.
my $point = $bezier->point(0.5);print "x: $point->[0] y: $point->[1]\n";
The curve($n) method can be used to return a set of points sampled along the length of the curve (i.e. in the range 0 <= $theta <= 1). The parameter indicates the number of sample points required, defaulting to 20 if undefined. The method returns a list of ($x1, $y1, $x2, $y2, ..., $xn, $yn) points when called in list context, or a reference to such an array when called in scalar context.
my @points = $bezier->curve(10);while (@points) {my ($x, $y) = splice(@points, 0, 2);print "x: $x y: $y\n";}my $points = $bezier->curve(10);while (@$points) {my ($x, $y) = splice(@$points, 0, 2);print "x: $x y: $y\n";}
Releases
7 releases since Debian 7 (Wheezy); the text changed 3 times.