Skip to content

@ue-too/curve / BCurve

Class: BCurve

Defined in: packages/curve/src/b-curve.ts:134

Bezier curve class supporting quadratic (3 points) and cubic (4 points) curves.

Remarks

BCurve provides a comprehensive implementation of Bezier curves with:

  • Curve evaluation at any parameter t (0 to 1)
  • Arc-length calculation with caching for performance
  • Curve splitting and subdivision
  • Geometric queries (projection, intersection, extrema)
  • Advanced operations (offset, arc fitting, curvature)

Performance Optimizations

  • Optimized formulas for quadratic and cubic curves
  • Arc-length caching to avoid recomputation
  • Lazy computation of lookup tables (LUT)
  • Gauss-Legendre quadrature for arc-length calculation

Coordinate System

  • Parameter t ranges from 0 (start) to 1 (end)
  • Points use {x, y} coordinates
  • Supports 2D curves (z-coordinate optional but not used)

Example

Create and evaluate a cubic Bezier curve

typescript
const curve = new BCurve([
  { x: 0, y: 0 },     // Start point
  { x: 33, y: 100 },  // Control point 1
  { x: 66, y: 100 },  // Control point 2
  { x: 100, y: 0 }    // End point
]);

// Evaluate at different positions
const start = curve.get(0);    // { x: 0, y: 0 }
const mid = curve.get(0.5);    // Midpoint
const end = curve.get(1);      // { x: 100, y: 0 }

// Get curve length
console.log('Length:', curve.fullLength);

// Get derivative (tangent vector)
const tangent = curve.derivative(0.5);

Constructors

Constructor

new BCurve(controlPoints): BCurve

Defined in: packages/curve/src/b-curve.ts:170

Parameters

controlPoints

Point[]

Returns

BCurve

Accessors

AABB

Get Signature

get AABB(): object

Defined in: packages/curve/src/b-curve.ts:1454

Returns

object

max

max: Point

min

min: Point


fullLength

Get Signature

get fullLength(): number

Defined in: packages/curve/src/b-curve.ts:422

Returns

number

Methods

advanceAtTWithLength()

advanceAtTWithLength(tVal, length): AdvanceAtTWithLengthRes

Defined in: packages/curve/src/b-curve.ts:1203

Parameters

tVal

number

length

number

Returns

AdvanceAtTWithLengthRes


advanceByDistance()

advanceByDistance(startT, distance): AdvanceAtTWithLengthRes

Defined in: packages/curve/src/b-curve.ts:1291

Parameters

startT

number

distance

number

Returns

AdvanceAtTWithLengthRes


compute()

compute(tVal): Point

Defined in: packages/curve/src/b-curve.ts:326

Parameters

tVal

number

Returns

Point


curvature()

curvature(tVal): number

Defined in: packages/curve/src/b-curve.ts:922

Parameters

tVal

number

Returns

number


derivative()

derivative(tVal): Point

Defined in: packages/curve/src/b-curve.ts:454

Parameters

tVal

number

Returns

Point


derivativeByPercentage()

derivativeByPercentage(percentage): Point

Defined in: packages/curve/src/b-curve.ts:235

Gets the derivative (tangent vector) at a given percentage of the curve length.

Parameters

percentage

number

Percentage of the curve length (0 to 1), where 0 is the start and 1 is the end

Returns

Point

The derivative vector at the specified percentage along the curve

Remarks

This method calculates the derivative at a point specified by percentage of arc length, not by the parameter t. This is useful when you want to sample the curve uniformly by distance rather than by parameter value.

Example

typescript
const curve = new BCurve([...]);
const tangent = curve.derivativeByPercentage(0.5); // Derivative at midpoint
const normalized = PointCal.unitVector(tangent); // Normalize for direction

derivativeNormalized()

derivativeNormalized(tVal): Point

Defined in: packages/curve/src/b-curve.ts:458

Parameters

tVal

number

Returns

Point


determinant3by3()

determinant3by3(matrix): number

Defined in: packages/curve/src/b-curve.ts:909

Parameters

matrix

number[][]

Returns

number


findArcs()

findArcs(errorThreshold): object[]

Defined in: packages/curve/src/b-curve.ts:732

Parameters

errorThreshold

number

Returns

object[]


findArcStartingAt()

findArcStartingAt(errorThreshold, low): { arc?: { center: Point; endPoint: Point; endT: number; radius: number; startPoint: Point; startT: number; }; good: boolean; } | null

Defined in: packages/curve/src/b-curve.ts:757

Parameters

errorThreshold

number

low

number

Returns

{ arc?: { center: Point; endPoint: Point; endT: number; radius: number; startPoint: Point; startT: number; }; good: boolean; } | null


findClosest()

findClosest(x, y, LUT, circleRadius, distanceEpsilon, pd2?, pd1?): number

Defined in: packages/curve/src/b-curve.ts:1400

Parameters

x

number

y

number

LUT

object[]

circleRadius

number

distanceEpsilon

number = 5

pd2?

number

pd1?

number

Returns

number


fitArc()

fitArc(startPoint, endPoint, midPoint): object

Defined in: packages/curve/src/b-curve.ts:836

Parameters

startPoint

Point

endPoint

Point

midPoint

Point

Returns

object

center?

optional center: Point

endPoint?

optional endPoint: Point

exists

exists: boolean

radius?

optional radius: number

startPoint?

optional startPoint: Point


get()

get(tVal): Point

Defined in: packages/curve/src/b-curve.ts:342

Parameters

tVal

number

Returns

Point


getArcLengthLUT()

getArcLengthLUT(steps): object

Defined in: packages/curve/src/b-curve.ts:464

Parameters

steps

number = 50

Returns

object

arcLengthLUT

arcLengthLUT: object[]

controlPoints

controlPoints: Point[]


getCacheStats()

getCacheStats(): object

Defined in: packages/curve/src/b-curve.ts:148

Gets cache statistics for performance monitoring

Returns

object

Object containing cache size and hit rate information

hitRate

hitRate: number

size

size: number


getCircleIntersections()

getCircleIntersections(circleCenter, circleRadius): object[]

Defined in: packages/curve/src/b-curve.ts:1146

Parameters

circleCenter

Point

circleRadius

number

Returns

object[]


getCoefficientOfTTerms()

getCoefficientOfTTerms(): Point[]

Defined in: packages/curve/src/b-curve.ts:946

Returns

Point[]


getCoefficientOfTTermsWithControlPoints()

getCoefficientOfTTermsWithControlPoints(controlPoints): Point[]

Defined in: packages/curve/src/b-curve.ts:956

Parameters

controlPoints

Point[]

Returns

Point[]


getControlPoints()

getControlPoints(): Point[]

Defined in: packages/curve/src/b-curve.ts:296

Returns

Point[]


getControlPointsAlignedWithXAxis()

getControlPointsAlignedWithXAxis(): object[]

Defined in: packages/curve/src/b-curve.ts:998

Returns

object[]


getCurveIntersections()

getCurveIntersections(curve, deduplicationTolerance?): object[]

Defined in: packages/curve/src/b-curve.ts:1443

Parameters

curve

BCurve

deduplicationTolerance?

number

Returns

object[]


getDerivativeCoefficients()

getDerivativeCoefficients(): Point[]

Defined in: packages/curve/src/b-curve.ts:950

Returns

Point[]


getDerivativeControlPoints()

getDerivativeControlPoints(controlPoints): Point[]

Defined in: packages/curve/src/b-curve.ts:272

Parameters

controlPoints

Point[]

Returns

Point[]


getExtrema()

getExtrema(): object

Defined in: packages/curve/src/b-curve.ts:1017

Returns

object

x

x: number[]

y

y: number[]


getLineIntersections()

getLineIntersections(line): number[]

Defined in: packages/curve/src/b-curve.ts:1101

Parameters

line

Line

Returns

number[]


getLUT()

getLUT(steps): Point[]

Defined in: packages/curve/src/b-curve.ts:389

Parameters

steps

number = 100

Returns

Point[]


getLUTWithTVal()

getLUTWithTVal(steps?): object[]

Defined in: packages/curve/src/b-curve.ts:404

Parameters

steps?

number

Returns

object[]


getPointbyPercentage()

getPointbyPercentage(percentage): Point

Defined in: packages/curve/src/b-curve.ts:181

Parameters

percentage

number

Returns

Point


getProjection()

getProjection(point): object

Defined in: packages/curve/src/b-curve.ts:661

Parameters

point

Point

Returns

object

projection

projection: Point = preliminaryProjectionPoint

tVal

tVal: number = preliminaryProjectionTVal


getSelfIntersections()

getSelfIntersections(): object[]

Defined in: packages/curve/src/b-curve.ts:1132

Returns

object[]


lengthAtT()

lengthAtT(tVal): number

Defined in: packages/curve/src/b-curve.ts:430

Parameters

tVal

number

Returns

number


normal()

normal(tVal): object

Defined in: packages/curve/src/b-curve.ts:1476

Parameters

tVal

number

Returns

object

direction

direction: Point

tVal

tVal: number


preWarmCache()

preWarmCache(steps): void

Defined in: packages/curve/src/b-curve.ts:159

Pre-warms the cache with commonly used t values for better performance

Parameters

steps

number = 100

Number of steps to pre-cache (default: 100)

Returns

void


refineBinary()

refineBinary(curve, x, y, LUT, i, targetDistance, epsilon): { distance: number; point: Point; tVal: number; } | undefined

Defined in: packages/curve/src/b-curve.ts:1339

Parameters

curve

BCurve

x

number

y

number

LUT

object[]

i

number

targetDistance

number = 0

epsilon

number = 0.01

Returns

{ distance: number; point: Point; tVal: number; } | undefined


secondDerivative()

secondDerivative(tVal): Point

Defined in: packages/curve/src/b-curve.ts:939

Parameters

tVal

number

Returns

Point


setControlPointAtIndex()

setControlPointAtIndex(index, newPoint): boolean

Defined in: packages/curve/src/b-curve.ts:311

Parameters

index

number

newPoint

Point

Returns

boolean


setControlPoints()

setControlPoints(controlPoints): void

Defined in: packages/curve/src/b-curve.ts:300

Parameters

controlPoints

Point[]

Returns

void


split()

split(tVal): [Point[], Point[]]

Defined in: packages/curve/src/b-curve.ts:502

Parameters

tVal

number

Returns

[Point[], Point[]]


splitAndTakeMidCurve()

splitAndTakeMidCurve(tVal, tVal2): BCurve

Defined in: packages/curve/src/b-curve.ts:653

Parameters

tVal

number

tVal2

number

Returns

BCurve


splitIn3Curves()

splitIn3Curves(tVal, tVal2): [BCurve, BCurve, BCurve]

Defined in: packages/curve/src/b-curve.ts:633

Parameters

tVal

number

tVal2

number

Returns

[BCurve, BCurve, BCurve]


splitIn3WithControlPoints()

splitIn3WithControlPoints(tVal, tVal2): [Point[], Point[], Point[]]

Defined in: packages/curve/src/b-curve.ts:613

Parameters

tVal

number

tVal2

number

Returns

[Point[], Point[], Point[]]


splitIntoCurves()

splitIntoCurves(tVal): [BCurve, BCurve]

Defined in: packages/curve/src/b-curve.ts:497

Parameters

tVal

number

Returns

[BCurve, BCurve]


translateRotateControlPoints()

translateRotateControlPoints(translation, rotationAngle): Point[]

Defined in: packages/curve/src/b-curve.ts:1087

Parameters

translation

Point

rotationAngle

number

Returns

Point[]