or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

Files

docs

booleans.mdcolors.mdcurves.mdexpansions-modifiers.mdextrusions.mdgeometries.mdhulls.mdindex.mdmaths.mdmeasurements.mdprimitives.mdtext-utils.mdtransforms.md
tile.json

curves.mddocs/

0

# Curves

1

2

The curves module provides Bézier curve functionality for mathematical paths, animation easing functions, and parametric curve operations. It supports arbitrary dimensional control points and degrees with efficient arc length parameterization.

3

4

## Capabilities

5

6

### Bézier Curve Creation

7

8

Create Bézier curves with arbitrary number of control points and dimensions.

9

10

```javascript { .api }

11

/**

12

* Create a Bézier curve object with precomputed coefficients

13

* @param {Array} points - Control points array (minimum 2 points)

14

* - For 1D: [n1, n2, n3, ...] or [[n1], [n2], [n3], ...]

15

* - For 2D+: [[x1,y1], [x2,y2], [x3,y3], ...]

16

* @returns {Object} Bezier curve object with mathematical coefficients

17

*/

18

function create(points: Array<number> | Array<Array<number>>): Bezier;

19

20

/**

21

* Calculate position along the curve at parameter t

22

* @param {Number} t - Parameter value between 0 and 1 (inclusive)

23

* @param {Object} bezier - Bezier curve object from create()

24

* @returns {Number|Array} Position value(s) at parameter t

25

*/

26

function valueAt(t: number, bezier: Bezier): Array<number> | number;

27

28

/**

29

* Calculate the first derivative (tangent/slope) at parameter t

30

* @param {Number} t - Parameter value between 0 and 1 (inclusive)

31

* @param {Object} bezier - Bezier curve object from create()

32

* @returns {Number|Array} Tangent value(s) at parameter t

33

*/

34

function tangentAt(t: number, bezier: Bezier): Array<number> | number;

35

```

36

37

**Usage Examples:**

38

39

```javascript

40

const { curves } = require('@jscad/modeling');

41

const { bezier } = curves;

42

43

// Linear 1D curve for scaling

44

const scaleEasing = bezier.create([1, 2]);

45

const scaleFactor = bezier.valueAt(0.5, scaleEasing); // 1.5

46

47

// Quadratic 2D curve for animation paths

48

const animPath = bezier.create([[0, 0], [50, 100], [100, 0]]);

49

const position = bezier.valueAt(0.5, animPath); // [50, 50]

50

const direction = bezier.tangentAt(0.5, animPath); // [50, -100]

51

52

// Cubic 3D curve for complex paths

53

const spatialPath = bezier.create([

54

[0, 0, 0], // start point

55

[0, 10, 5], // control point 1

56

[10, 0, -5], // control point 2

57

[10, 10, 0] // end point

58

]);

59

```

60

61

### Arc Length Operations

62

63

Measure and parameterize curves by arc length for equal spacing and distance-based operations.

64

65

```javascript { .api }

66

/**

67

* Calculate cumulative arc lengths along the curve

68

* @param {Number} segments - Number of segments for approximation accuracy

69

* @param {Object} bezier - Bezier curve object from create()

70

* @returns {Array} Array of cumulative arc lengths (length = segments + 1)

71

*/

72

function lengths(segments: number, bezier: Bezier): Array<number>;

73

74

/**

75

* Calculate total arc length of the curve

76

* @param {Number} segments - Number of segments for approximation accuracy

77

* @param {Object} bezier - Bezier curve object from create()

78

* @returns {Number} Approximate total arc length

79

*/

80

function length(segments: number, bezier: Bezier): number;

81

82

/**

83

* Convert arc length distance to parameter t value

84

* @param {Object} options - Configuration object

85

* @param {Number} [options.distance=0] - Arc length distance along curve

86

* @param {Number} [options.segments=100] - Accuracy segments for approximation

87

* @param {Object} bezier - Bezier curve object from create()

88

* @returns {Number} Parameter t value (0-1) corresponding to arc length

89

*/

90

function arcLengthToT(options: {

91

distance?: number,

92

segments?: number

93

}, bezier: Bezier): number;

94

```

95

96

**Usage Examples:**

97

98

```javascript

99

const { curves } = require('@jscad/modeling');

100

const { bezier } = curves;

101

102

const curve = bezier.create([[0, 0], [10, 5], [20, 0]]);

103

104

// Measure curve length

105

const totalLength = bezier.length(100, curve); // High accuracy with 100 segments

106

107

// Create equally spaced points along curve

108

const segments = 10;

109

const increment = totalLength / segments;

110

const equalPoints = [];

111

112

for (let i = 0; i <= segments; i++) {

113

const distance = i * increment;

114

const t = bezier.arcLengthToT({ distance, segments: 100 }, curve);

115

const point = bezier.valueAt(t, curve);

116

equalPoints.push(point);

117

}

118

119

// Get cumulative lengths for analysis

120

const cumLengths = bezier.lengths(50, curve);

121

const halfwayLength = cumLengths[25]; // Length at middle segment

122

```

123

124

## Type Definitions

125

126

```javascript { .api }

127

// Bézier curve object structure

128

type Bezier = {

129

points: Array<number> | Array<Array<number>>; // Control points

130

pointType: string; // Point type identifier

131

dimensions: number; // Number of dimensions

132

permutations: Array<number>; // Binomial coefficients

133

tangentPermutations: Array<number>; // Tangent coefficients

134

};

135

136

// Point type identifiers

137

type PointTypes =

138

| 'float_single' // 1D curves: [n1, n2, n3, ...]

139

| 'float_1' // 1D curves: [[n1], [n2], [n3], ...]

140

| 'float_2' // 2D curves: [[x,y], [x,y], ...]

141

| 'float_3' // 3D curves: [[x,y,z], [x,y,z], ...]

142

| 'float_n'; // n-dimensional curves

143

144

// Arc length parameterization options

145

type ArcLengthToTOptions = {

146

distance?: number; // Arc length distance (default: 0)

147

segments?: number; // Accuracy segments (default: 100)

148

};

149

```

150

151

## Mathematical Foundation

152

153

The module implements the standard Bézier curve formula:

154

155

**Position**: `B(t) = Σ(C(n,i) * (1-t)^(n-i) * t^i * P_i)` where:

156

- `C(n,i)` = binomial coefficient `n!/(i!(n-i)!)`

157

- `n` = curve degree (number of control points - 1)

158

- `P_i` = control point i

159

- `t` = parameter (0 to 1)

160

161

**Tangent**: First derivative reduces degree by 1, using control point differences `n * (P_{i+1} - P_i)`

162

163

**Arc Length**: Euclidean distance approximation between evenly spaced parameter samples, with binary search for inverse parameterization.