Search by

alto / bezier

simonandre

Precision PHP toolkit for evaluating, splitting, and measuring quadratic, cubic, quintic and N-order Bezier curves

Package info

github.com/altophp/bezier

Homepage

Documentation

pkg:composer/alto/bezier

Fund package maintenance!

smnandre

Statistics

Installs: 0

Dependents: 0

Suggesters: 0

Stars: 1

Open Issues: 0

v1.0.0 2026-01-04 09:27 UTC

This package is auto-updated.

Last update: 2026-09-22 02:34:51 UTC


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-speed pointAtDistance(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, while pointAtDistance($distance, $samples) maps real distances back to coordinates.
  • Intersections: $curveA->intersections($curveB, tolerance: 0.25, maxDepth: 18) delivers intersection points along with their t parameters 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, and points($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.