alto / bezier
Precision PHP toolkit for evaluating, splitting, and measuring quadratic, cubic, quintic and N-order Bezier curves
Fund package maintenance!
Requires
- php: >=8.3.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.92
- phpstan/phpstan: ^2.0
- phpunit/phpunit: ^12.5
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
Alto\Bezier is a precision PHP toolkit for evaluating, splitting, and measuring quadratic, cubic, quintic, and N-order Bézier curves using immutable value objects and a numerically stable De Casteljau core.
Features
- Quadratic, cubic, quartic, quintic, and arbitrary N-order curves that all share the same API
- Point evaluation:
pointAt(t)and constant-speedpointAtDistance(distance)helpers - Curve subdivision with
split(t)for tessellation or editing workflows - Differential geometry helpers: derivatives, tangents, normals
- Arc-length calculation and arc-length parameterization with configurable sampling
- Intersection detection between any two curves
- Bounding boxes and evenly spaced point generators for export to SVG, canvas, or WebGL
- Immutable, readonly classes with no external dependencies
Installation
composer require alto/bezier
Usage
Create and inspect a cubic curve
use Alto\Bezier\CubicCurve; use Alto\Bezier\Point; $curve = new CubicCurve( new Point(0, 0), new Point(40, 160), new Point(160, -40), new Point(200, 120) ); $mid = $curve->pointAt(0.5); [$left, $right] = $curve->split(0.4); $heading = $curve->tangent(0.5);
Instantiate quadratic and N-order curves
use Alto\Bezier\QuadraticCurve; use Alto\Bezier\NOrderCurve; use Alto\Bezier\Point; $quadratic = new QuadraticCurve( new Point(0, 0), new Point(50, 120), new Point(120, 0) ); $wave = new NOrderCurve(...array_map( fn(int $i) => new Point($i * 20, sin($i / 2) * 40 + 60), range(0, 7) ));
Exporting control points to SVG
$path = sprintf( 'M %s C %s %s %s', ...array_map(fn(Point $p) => $p->x.' '.$p->y, $curve->toArray()) );
Advanced
- Arc length & constant-speed motion:
length($samples)returns the numerical arc length, whilepointAtDistance($distance, $samples)maps real distances back to coordinates. - Intersections:
$curveA->intersections($curveB, tolerance: 0.25, maxDepth: 18)delivers intersection points along with theirtparameters on each curve. - Numeric tuning: increase sampling (default 100) for long or intricate paths to improve accuracy for arc-length and parameterization routines.
- Bounding boxes and grids:
boundingBox()exposes width/height/corners, andpoints($interval)streams evenly spaced points for tessellation or hit-testing.
Documentation
Contributing
Contributions of all kinds are welcome. Visit the project on GitHub to report a bug, suggest a feature, or open a pull request.
Before submitting code, run:
# Runs PHP CS Fixer, PHPStan, and PHPUnit
composer qa
Changes to public behavior should include tests and documentation.
Support
ALTO Bezier is open source and independently maintained by Simon André. If it is useful to your work, you can support its continued development through GitHub Sponsors.
Sharing the package or starring it on GitHub also helps.
License
ALTO Bezier is released by ALTO PHP under the MIT License.