pub struct Cubic(pub [Point; 4]);
Expand description
Cubic bezier curve
Polynomial form:
(1 - t) ^ 3 * p0 + 3 * (1 - t) ^ 2 * t * p1 + 3 * (1 - t) * t ^ 2 * p2 + t ^ 3 * p3
Matrix from:
┌ ┐ ┌ ┐
┌ ┐ │ 1 0 0 0 │ │ p0 │
│ 1 t t^2 t^3 │ │ -3 3 0 0 │ │ p1 │
└ ┘ │ 3 -6 3 0 │ │ p2 │
│ -1 3 -3 1 │ │ p3 │
└ ┘ └ ┘
Tuple Fields§
§0: [Point; 4]
Implementations§
Trait Implementations§
source§impl Curve for Cubic
impl Curve for Cubic
source§fn flatness(&self) -> Scalar
fn flatness(&self) -> Scalar
Flatness criteria for the cubic curve
This function actually returns 16 * flatness^2
It is equal to f = max d(t) where d(t) = |c(t) - l(t)|, l(t) = (1 - t) * c0 + t * c3
for c(t) bezier3 curve with c{0..3} control points, in other words maximum distance
from parametric line to bezier3 curve for the same parameter t. It is shown in the article
that:
f^2 <= 1/16 (max{u_x^2, v_x^2} + max{u_y^2, v_y^2})
where:
u = 3 * b1 - 2 * b0 - b3
v = 3 * b2 - b0 - 2 * b3
f == 0
means completely flat so estimating upper bound is sufficient as splitting more
than needed is not a problem for rendering.
source§fn split(&self) -> (Self, Self)
fn split(&self) -> (Self, Self)
Optimized version of split_at(0.5)
source§fn offset(&self, dist: Scalar, out: &mut impl Extend<Segment>)
fn offset(&self, dist: Scalar, out: &mut impl Extend<Segment>)
Offset cubic bezier curve with a list of cubic curves
Offset bezier curve using Tiller-Hanson method. In short, it will just offset line segment corresponding to control points, then find intersection of this lines and treat them as new control points.
source§fn deriv(&self) -> Segment
fn deriv(&self) -> Segment
deriv(t) = [curve'(t)_x, curve'(t)_y]
source§fn split_at(&self, t: Scalar) -> (Self, Self)
fn split_at(&self, t: Scalar) -> (Self, Self)
t
source§fn cut(&self, a: Scalar, b: Scalar) -> Self
fn cut(&self, a: Scalar, b: Scalar) -> Self
a
and ending at value b
source§fn bbox(&self, init: Option<BBox>) -> BBox
fn bbox(&self, init: Option<BBox>) -> BBox
init
bounding box with the bounding box of the curvesource§fn reverse(&self) -> Self
fn reverse(&self) -> Self
source§fn roots(&self) -> CurveRoots
fn roots(&self) -> CurveRoots
curve(t)_y = 0
. Values of the parameter at which curve
crosses y axis.source§fn extremities(&self) -> CurveExtremities
fn extremities(&self) -> CurveExtremities
curve'(t)_x = 0 || curve'(t)_y = 0
source§fn length(&self, t0: Scalar, t1: Scalar) -> Scalar
fn length(&self, t0: Scalar, t1: Scalar) -> Scalar
t0
to t1