@ue-too/curve / index / 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
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:171
Parameters
controlPoints
Point[]
Returns
BCurve
Accessors
AABB
Get Signature
get AABB():
object
Defined in: packages/curve/src/b-curve.ts:1469
Returns
object
max
max:
Point
min
min:
Point
fullLength
Get Signature
get fullLength():
number
Defined in: packages/curve/src/b-curve.ts:423
Returns
number
Methods
advanceAtTWithLength()
advanceAtTWithLength(
tVal,length):AdvanceAtTWithLengthRes
Defined in: packages/curve/src/b-curve.ts:1218
Parameters
tVal
number
length
number
Returns
AdvanceAtTWithLengthRes
advanceByDistance()
advanceByDistance(
startT,distance):AdvanceAtTWithLengthRes
Defined in: packages/curve/src/b-curve.ts:1306
Parameters
startT
number
distance
number
Returns
AdvanceAtTWithLengthRes
compute()
compute(
tVal):Point
Defined in: packages/curve/src/b-curve.ts:327
Parameters
tVal
number
Returns
curvature()
curvature(
tVal):number
Defined in: packages/curve/src/b-curve.ts:937
Parameters
tVal
number
Returns
number
derivative()
derivative(
tVal):Point
Defined in: packages/curve/src/b-curve.ts:459
Parameters
tVal
number
Returns
derivativeByPercentage()
derivativeByPercentage(
percentage):Point
Defined in: packages/curve/src/b-curve.ts:236
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
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
const curve = new BCurve([...]);
const tangent = curve.derivativeByPercentage(0.5); // Derivative at midpoint
const normalized = PointCal.unitVector(tangent); // Normalize for directionderivativeNormalized()
derivativeNormalized(
tVal):Point
Defined in: packages/curve/src/b-curve.ts:463
Parameters
tVal
number
Returns
determinant3by3()
determinant3by3(
matrix):number
Defined in: packages/curve/src/b-curve.ts:924
Parameters
matrix
number[][]
Returns
number
findArcs()
findArcs(
errorThreshold):object[]
Defined in: packages/curve/src/b-curve.ts:737
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:772
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:1415
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:851
Parameters
startPoint
endPoint
midPoint
Returns
object
center?
optionalcenter:Point
endPoint?
optionalendPoint:Point
exists
exists:
boolean
radius?
optionalradius:number
startPoint?
optionalstartPoint:Point
get()
get(
tVal):Point
Defined in: packages/curve/src/b-curve.ts:343
Parameters
tVal
number
Returns
getArcLengthLUT()
getArcLengthLUT(
steps):object
Defined in: packages/curve/src/b-curve.ts:469
Parameters
steps
number = 50
Returns
object
arcLengthLUT
arcLengthLUT:
object[]
controlPoints
controlPoints:
Point[]
getArcs()
getArcs(
errorThreshold):object[]
Defined in: packages/curve/src/b-curve.ts:768
Get a sequence of circular arcs that approximate the curve.
Parameters
errorThreshold
number
Maximum allowed radial error when fitting an arc.
Returns
object[]
A list of arcs that cover the curve from (t=0) to (t=1).
getCacheStats()
getCacheStats():
object
Defined in: packages/curve/src/b-curve.ts:149
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:1161
Parameters
circleCenter
circleRadius
number
Returns
object[]
getCoefficientOfTTerms()
getCoefficientOfTTerms():
Point[]
Defined in: packages/curve/src/b-curve.ts:961
Returns
Point[]
getCoefficientOfTTermsWithControlPoints()
getCoefficientOfTTermsWithControlPoints(
controlPoints):Point[]
Defined in: packages/curve/src/b-curve.ts:971
Parameters
controlPoints
Point[]
Returns
Point[]
getControlPoints()
getControlPoints():
Point[]
Defined in: packages/curve/src/b-curve.ts:297
Returns
Point[]
getControlPointsAlignedWithXAxis()
getControlPointsAlignedWithXAxis():
object[]
Defined in: packages/curve/src/b-curve.ts:1013
Returns
object[]
getCurveIntersections()
getCurveIntersections(
curve,deduplicationTolerance?):object[]
Defined in: packages/curve/src/b-curve.ts:1458
Parameters
curve
BCurve
deduplicationTolerance?
number
Returns
object[]
getDerivativeCoefficients()
getDerivativeCoefficients():
Point[]
Defined in: packages/curve/src/b-curve.ts:965
Returns
Point[]
getDerivativeControlPoints()
getDerivativeControlPoints(
controlPoints):Point[]
Defined in: packages/curve/src/b-curve.ts:273
Parameters
controlPoints
Point[]
Returns
Point[]
getExtrema()
getExtrema():
object
Defined in: packages/curve/src/b-curve.ts:1032
Returns
object
x
x:
number[]
y
y:
number[]
getLineIntersections()
getLineIntersections(
line):number[]
Defined in: packages/curve/src/b-curve.ts:1116
Parameters
line
Returns
number[]
getLUT()
getLUT(
steps):Point[]
Defined in: packages/curve/src/b-curve.ts:390
Parameters
steps
number = 100
Returns
Point[]
getLUTWithTVal()
getLUTWithTVal(
steps?):object[]
Defined in: packages/curve/src/b-curve.ts:405
Parameters
steps?
number
Returns
object[]
getPointbyPercentage()
getPointbyPercentage(
percentage):Point
Defined in: packages/curve/src/b-curve.ts:182
Parameters
percentage
number
Returns
getProjection()
getProjection(
point):object
Defined in: packages/curve/src/b-curve.ts:666
Parameters
point
Returns
object
projection
projection:
Point=preliminaryProjectionPoint
tVal
tVal:
number=preliminaryProjectionTVal
getSelfIntersections()
getSelfIntersections():
object[]
Defined in: packages/curve/src/b-curve.ts:1147
Returns
object[]
lengthAtT()
lengthAtT(
tVal):number
Defined in: packages/curve/src/b-curve.ts:431
Parameters
tVal
number
Returns
number
normal()
normal(
tVal):object
Defined in: packages/curve/src/b-curve.ts:1491
Parameters
tVal
number
Returns
object
direction
direction:
Point
tVal
tVal:
number
preWarmCache()
preWarmCache(
steps):void
Defined in: packages/curve/src/b-curve.ts:160
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:1354
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:954
Parameters
tVal
number
Returns
setControlPointAtIndex()
setControlPointAtIndex(
index,newPoint):boolean
Defined in: packages/curve/src/b-curve.ts:312
Parameters
index
number
newPoint
Returns
boolean
setControlPoints()
setControlPoints(
controlPoints):void
Defined in: packages/curve/src/b-curve.ts:301
Parameters
controlPoints
Point[]
Returns
void
split()
Defined in: packages/curve/src/b-curve.ts:507
Parameters
tVal
number
Returns
splitAndTakeMidCurve()
splitAndTakeMidCurve(
tVal,tVal2):BCurve
Defined in: packages/curve/src/b-curve.ts:658
Parameters
tVal
number
tVal2
number
Returns
BCurve
splitIn3Curves()
splitIn3Curves(
tVal,tVal2): [BCurve,BCurve,BCurve]
Defined in: packages/curve/src/b-curve.ts:638
Parameters
tVal
number
tVal2
number
Returns
[BCurve, BCurve, BCurve]
splitIn3WithControlPoints()
splitIn3WithControlPoints(
tVal,tVal2): [Point[],Point[],Point[]]
Defined in: packages/curve/src/b-curve.ts:618
Parameters
tVal
number
tVal2
number
Returns
splitIntoCurves()
splitIntoCurves(
tVal): [BCurve,BCurve]
Defined in: packages/curve/src/b-curve.ts:502
Parameters
tVal
number
Returns
[BCurve, BCurve]
translateRotateControlPoints()
translateRotateControlPoints(
translation,rotationAngle):Point[]
Defined in: packages/curve/src/b-curve.ts:1102
Parameters
translation
rotationAngle
number
Returns
Point[]