Skip to content

@ue-too/curve / index / BCurve

類別: BCurve

定義於: packages/curve/src/b-curve.ts:134

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

備註

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)

範例

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);

建構函式

建構函式

new BCurve(controlPoints): BCurve

定義於: packages/curve/src/b-curve.ts:171

參數

controlPoints

Point[]

回傳

BCurve

存取器

AABB

Getter 簽章

get AABB(): object

定義於: packages/curve/src/b-curve.ts:1469

回傳

object

max

max: Point

min

min: Point


fullLength

Getter 簽章

get fullLength(): number

定義於: packages/curve/src/b-curve.ts:423

回傳

number

方法

advanceAtTWithLength()

advanceAtTWithLength(tVal, length): AdvanceAtTWithLengthRes

定義於: packages/curve/src/b-curve.ts:1218

參數

tVal

number

length

number

回傳

AdvanceAtTWithLengthRes


advanceByDistance()

advanceByDistance(startT, distance): AdvanceAtTWithLengthRes

定義於: packages/curve/src/b-curve.ts:1306

參數

startT

number

distance

number

回傳

AdvanceAtTWithLengthRes


compute()

compute(tVal): Point

定義於: packages/curve/src/b-curve.ts:327

參數

tVal

number

回傳

Point


curvature()

curvature(tVal): number

定義於: packages/curve/src/b-curve.ts:937

參數

tVal

number

回傳

number


derivative()

derivative(tVal): Point

定義於: packages/curve/src/b-curve.ts:459

參數

tVal

number

回傳

Point


derivativeByPercentage()

derivativeByPercentage(percentage): Point

定義於: packages/curve/src/b-curve.ts:236

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

參數

percentage

number

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

回傳

Point

The derivative vector at the specified percentage along the curve

備註

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.

範例

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

定義於: packages/curve/src/b-curve.ts:463

參數

tVal

number

回傳

Point


determinant3by3()

determinant3by3(matrix): number

定義於: packages/curve/src/b-curve.ts:924

參數

matrix

number[][]

回傳

number


findArcs()

findArcs(errorThreshold): object[]

定義於: packages/curve/src/b-curve.ts:737

參數

errorThreshold

number

回傳

object[]


findArcStartingAt()

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

定義於: packages/curve/src/b-curve.ts:772

參數

errorThreshold

number

low

number

回傳

{ 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

定義於: packages/curve/src/b-curve.ts:1415

參數

x

number

y

number

LUT

object[]

circleRadius

number

distanceEpsilon

number = 5

pd2?

number

pd1?

number

回傳

number


fitArc()

fitArc(startPoint, endPoint, midPoint): object

定義於: packages/curve/src/b-curve.ts:851

參數

startPoint

Point

endPoint

Point

midPoint

Point

回傳

object

center?

optional center: Point

endPoint?

optional endPoint: Point

exists

exists: boolean

radius?

optional radius: number

startPoint?

optional startPoint: Point


get()

get(tVal): Point

定義於: packages/curve/src/b-curve.ts:343

參數

tVal

number

回傳

Point


getArcLengthLUT()

getArcLengthLUT(steps): object

定義於: packages/curve/src/b-curve.ts:469

參數

steps

number = 50

回傳

object

arcLengthLUT

arcLengthLUT: object[]

controlPoints

controlPoints: Point[]


getArcs()

getArcs(errorThreshold): object[]

定義於: packages/curve/src/b-curve.ts:768

Get a sequence of circular arcs that approximate the curve.

參數

errorThreshold

number

Maximum allowed radial error when fitting an arc.

回傳

object[]

A list of arcs that cover the curve from (t=0) to (t=1).


getCacheStats()

getCacheStats(): object

定義於: packages/curve/src/b-curve.ts:149

Gets cache statistics for performance monitoring

回傳

object

Object containing cache size and hit rate information

hitRate

hitRate: number

size

size: number


getCircleIntersections()

getCircleIntersections(circleCenter, circleRadius): object[]

定義於: packages/curve/src/b-curve.ts:1161

參數

circleCenter

Point

circleRadius

number

回傳

object[]


getCoefficientOfTTerms()

getCoefficientOfTTerms(): Point[]

定義於: packages/curve/src/b-curve.ts:961

回傳

Point[]


getCoefficientOfTTermsWithControlPoints()

getCoefficientOfTTermsWithControlPoints(controlPoints): Point[]

定義於: packages/curve/src/b-curve.ts:971

參數

controlPoints

Point[]

回傳

Point[]


getControlPoints()

getControlPoints(): Point[]

定義於: packages/curve/src/b-curve.ts:297

回傳

Point[]


getControlPointsAlignedWithXAxis()

getControlPointsAlignedWithXAxis(): object[]

定義於: packages/curve/src/b-curve.ts:1013

回傳

object[]


getCurveIntersections()

getCurveIntersections(curve, deduplicationTolerance?): object[]

定義於: packages/curve/src/b-curve.ts:1458

參數

curve

BCurve

deduplicationTolerance?

number

回傳

object[]


getDerivativeCoefficients()

getDerivativeCoefficients(): Point[]

定義於: packages/curve/src/b-curve.ts:965

回傳

Point[]


getDerivativeControlPoints()

getDerivativeControlPoints(controlPoints): Point[]

定義於: packages/curve/src/b-curve.ts:273

參數

controlPoints

Point[]

回傳

Point[]


getExtrema()

getExtrema(): object

定義於: packages/curve/src/b-curve.ts:1032

回傳

object

x

x: number[]

y

y: number[]


getLineIntersections()

getLineIntersections(line): number[]

定義於: packages/curve/src/b-curve.ts:1116

參數

line

Line

回傳

number[]


getLUT()

getLUT(steps): Point[]

定義於: packages/curve/src/b-curve.ts:390

參數

steps

number = 100

回傳

Point[]


getLUTWithTVal()

getLUTWithTVal(steps?): object[]

定義於: packages/curve/src/b-curve.ts:405

參數

steps?

number

回傳

object[]


getPointbyPercentage()

getPointbyPercentage(percentage): Point

定義於: packages/curve/src/b-curve.ts:182

參數

percentage

number

回傳

Point


getProjection()

getProjection(point): object

定義於: packages/curve/src/b-curve.ts:666

參數

point

Point

回傳

object

projection

projection: Point = preliminaryProjectionPoint

tVal

tVal: number = preliminaryProjectionTVal


getSelfIntersections()

getSelfIntersections(): object[]

定義於: packages/curve/src/b-curve.ts:1147

回傳

object[]


lengthAtT()

lengthAtT(tVal): number

定義於: packages/curve/src/b-curve.ts:431

參數

tVal

number

回傳

number


normal()

normal(tVal): object

定義於: packages/curve/src/b-curve.ts:1491

參數

tVal

number

回傳

object

direction

direction: Point

tVal

tVal: number


preWarmCache()

preWarmCache(steps): void

定義於: packages/curve/src/b-curve.ts:160

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

參數

steps

number = 100

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

回傳

void


refineBinary()

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

定義於: packages/curve/src/b-curve.ts:1354

參數

curve

BCurve

x

number

y

number

LUT

object[]

i

number

targetDistance

number = 0

epsilon

number = 0.01

回傳

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


secondDerivative()

secondDerivative(tVal): Point

定義於: packages/curve/src/b-curve.ts:954

參數

tVal

number

回傳

Point


setControlPointAtIndex()

setControlPointAtIndex(index, newPoint): boolean

定義於: packages/curve/src/b-curve.ts:312

參數

index

number

newPoint

Point

回傳

boolean


setControlPoints()

setControlPoints(controlPoints): void

定義於: packages/curve/src/b-curve.ts:301

參數

controlPoints

Point[]

回傳

void


split()

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

定義於: packages/curve/src/b-curve.ts:507

參數

tVal

number

回傳

[Point[], Point[]]


splitAndTakeMidCurve()

splitAndTakeMidCurve(tVal, tVal2): BCurve

定義於: packages/curve/src/b-curve.ts:658

參數

tVal

number

tVal2

number

回傳

BCurve


splitIn3Curves()

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

定義於: packages/curve/src/b-curve.ts:638

參數

tVal

number

tVal2

number

回傳

[BCurve, BCurve, BCurve]


splitIn3WithControlPoints()

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

定義於: packages/curve/src/b-curve.ts:618

參數

tVal

number

tVal2

number

回傳

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


splitIntoCurves()

splitIntoCurves(tVal): [BCurve, BCurve]

定義於: packages/curve/src/b-curve.ts:502

參數

tVal

number

回傳

[BCurve, BCurve]


translateRotateControlPoints()

translateRotateControlPoints(translation, rotationAngle): Point[]

定義於: packages/curve/src/b-curve.ts:1102

參數

translation

Point

rotationAngle

number

回傳

Point[]