@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
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
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
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
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:458
Parameters
tVal
number
Returns
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
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:342
Parameters
tVal
number
Returns
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
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
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
getProjection()
getProjection(
point):object
Defined in: packages/curve/src/b-curve.ts:661
Parameters
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
setControlPointAtIndex()
setControlPointAtIndex(
index,newPoint):boolean
Defined in: packages/curve/src/b-curve.ts:311
Parameters
index
number
newPoint
Returns
boolean
setControlPoints()
setControlPoints(
controlPoints):void
Defined in: packages/curve/src/b-curve.ts:300
Parameters
controlPoints
Point[]
Returns
void
split()
Defined in: packages/curve/src/b-curve.ts:502
Parameters
tVal
number
Returns
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
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
rotationAngle
number
Returns
Point[]