@aura3d/math 4.0.2 → 4.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Box3.d.ts +50 -0
- package/dist/Box3.d.ts.map +1 -1
- package/dist/Box3.js +177 -6
- package/dist/Box3.js.map +1 -1
- package/dist/Capsule.d.ts +25 -0
- package/dist/Capsule.d.ts.map +1 -0
- package/dist/Capsule.js +54 -0
- package/dist/Capsule.js.map +1 -0
- package/dist/Color.d.ts +27 -0
- package/dist/Color.d.ts.map +1 -1
- package/dist/Color.js +87 -0
- package/dist/Color.js.map +1 -1
- package/dist/ConvexHull.d.ts +100 -0
- package/dist/ConvexHull.d.ts.map +1 -0
- package/dist/ConvexHull.js +578 -0
- package/dist/ConvexHull.js.map +1 -0
- package/dist/Curves.d.ts +59 -18
- package/dist/Curves.d.ts.map +1 -1
- package/dist/Curves.js +15 -73
- package/dist/Curves.js.map +1 -1
- package/dist/Cylindrical.d.ts +19 -0
- package/dist/Cylindrical.d.ts.map +1 -0
- package/dist/Cylindrical.js +40 -0
- package/dist/Cylindrical.js.map +1 -0
- package/dist/Euler.d.ts +24 -0
- package/dist/Euler.d.ts.map +1 -1
- package/dist/Euler.js +126 -2
- package/dist/Euler.js.map +1 -1
- package/dist/Frustum.d.ts +18 -0
- package/dist/Frustum.d.ts.map +1 -1
- package/dist/Frustum.js +62 -12
- package/dist/Frustum.js.map +1 -1
- package/dist/Line3.d.ts +38 -0
- package/dist/Line3.d.ts.map +1 -0
- package/dist/Line3.js +122 -0
- package/dist/Line3.js.map +1 -0
- package/dist/MathUtils.d.ts +37 -0
- package/dist/MathUtils.d.ts.map +1 -0
- package/dist/MathUtils.js +105 -0
- package/dist/MathUtils.js.map +1 -0
- package/dist/Matrix3.d.ts +23 -2
- package/dist/Matrix3.d.ts.map +1 -1
- package/dist/Matrix3.js +90 -0
- package/dist/Matrix3.js.map +1 -1
- package/dist/Matrix4.d.ts +3 -0
- package/dist/Matrix4.d.ts.map +1 -1
- package/dist/Matrix4.js +17 -0
- package/dist/Matrix4.js.map +1 -1
- package/dist/OBB.d.ts +44 -0
- package/dist/OBB.d.ts.map +1 -0
- package/dist/OBB.js +214 -0
- package/dist/OBB.js.map +1 -0
- package/dist/Octree.d.ts +72 -0
- package/dist/Octree.d.ts.map +1 -0
- package/dist/Octree.js +385 -0
- package/dist/Octree.js.map +1 -0
- package/dist/Plane.d.ts +42 -0
- package/dist/Plane.d.ts.map +1 -1
- package/dist/Plane.js +79 -3
- package/dist/Plane.js.map +1 -1
- package/dist/Quaternion.d.ts +6 -1
- package/dist/Quaternion.d.ts.map +1 -1
- package/dist/Quaternion.js +28 -3
- package/dist/Quaternion.js.map +1 -1
- package/dist/Ray.d.ts +42 -2
- package/dist/Ray.d.ts.map +1 -1
- package/dist/Ray.js +202 -9
- package/dist/Ray.js.map +1 -1
- package/dist/ShapeUtils.d.ts +28 -0
- package/dist/ShapeUtils.d.ts.map +1 -0
- package/dist/ShapeUtils.js +551 -0
- package/dist/ShapeUtils.js.map +1 -0
- package/dist/Sphere.d.ts +32 -0
- package/dist/Sphere.d.ts.map +1 -1
- package/dist/Sphere.js +122 -4
- package/dist/Sphere.js.map +1 -1
- package/dist/Spherical.d.ts +21 -0
- package/dist/Spherical.d.ts.map +1 -0
- package/dist/Spherical.js +50 -0
- package/dist/Spherical.js.map +1 -0
- package/dist/SphericalHarmonics3.d.ts +35 -0
- package/dist/SphericalHarmonics3.d.ts.map +1 -0
- package/dist/SphericalHarmonics3.js +115 -0
- package/dist/SphericalHarmonics3.js.map +1 -0
- package/dist/Triangle.d.ts +45 -0
- package/dist/Triangle.d.ts.map +1 -0
- package/dist/Triangle.js +160 -0
- package/dist/Triangle.js.map +1 -0
- package/dist/Vector2.d.ts +7 -0
- package/dist/Vector2.d.ts.map +1 -1
- package/dist/Vector2.js +17 -0
- package/dist/Vector2.js.map +1 -1
- package/dist/Vector3.d.ts +16 -0
- package/dist/Vector3.d.ts.map +1 -1
- package/dist/Vector3.js +35 -0
- package/dist/Vector3.js.map +1 -1
- package/dist/curves/ArcCurve.d.ts +7 -0
- package/dist/curves/ArcCurve.d.ts.map +1 -0
- package/dist/curves/ArcCurve.js +9 -0
- package/dist/curves/ArcCurve.js.map +1 -0
- package/dist/curves/CatmullRomCurve3.d.ts +39 -0
- package/dist/curves/CatmullRomCurve3.d.ts.map +1 -0
- package/dist/curves/CatmullRomCurve3.js +176 -0
- package/dist/curves/CatmullRomCurve3.js.map +1 -0
- package/dist/curves/ClampedCatmullRomCurve3.d.ts +26 -0
- package/dist/curves/ClampedCatmullRomCurve3.d.ts.map +1 -0
- package/dist/curves/ClampedCatmullRomCurve3.js +48 -0
- package/dist/curves/ClampedCatmullRomCurve3.js.map +1 -0
- package/dist/curves/CubicBezierCurve.d.ts +14 -0
- package/dist/curves/CubicBezierCurve.d.ts.map +1 -0
- package/dist/curves/CubicBezierCurve.js +25 -0
- package/dist/curves/CubicBezierCurve.js.map +1 -0
- package/dist/curves/CubicBezierCurve3.d.ts +14 -0
- package/dist/curves/CubicBezierCurve3.d.ts.map +1 -0
- package/dist/curves/CubicBezierCurve3.js +25 -0
- package/dist/curves/CubicBezierCurve3.js.map +1 -0
- package/dist/curves/CurveBase.d.ts +49 -0
- package/dist/curves/CurveBase.d.ts.map +1 -0
- package/dist/curves/CurveBase.js +199 -0
- package/dist/curves/CurveBase.js.map +1 -0
- package/dist/curves/CurvePath.d.ts +34 -0
- package/dist/curves/CurvePath.d.ts.map +1 -0
- package/dist/curves/CurvePath.js +135 -0
- package/dist/curves/CurvePath.js.map +1 -0
- package/dist/curves/EllipseCurve.d.ts +18 -0
- package/dist/curves/EllipseCurve.d.ts.map +1 -0
- package/dist/curves/EllipseCurve.js +67 -0
- package/dist/curves/EllipseCurve.js.map +1 -0
- package/dist/curves/Interpolations.d.ts +9 -0
- package/dist/curves/Interpolations.d.ts.map +1 -0
- package/dist/curves/Interpolations.js +21 -0
- package/dist/curves/Interpolations.js.map +1 -0
- package/dist/curves/LineCurve.d.ts +16 -0
- package/dist/curves/LineCurve.d.ts.map +1 -0
- package/dist/curves/LineCurve.js +32 -0
- package/dist/curves/LineCurve.js.map +1 -0
- package/dist/curves/LineCurve3.d.ts +16 -0
- package/dist/curves/LineCurve3.d.ts.map +1 -0
- package/dist/curves/LineCurve3.js +32 -0
- package/dist/curves/LineCurve3.js.map +1 -0
- package/dist/curves/Path.d.ts +23 -0
- package/dist/curves/Path.d.ts.map +1 -0
- package/dist/curves/Path.js +94 -0
- package/dist/curves/Path.js.map +1 -0
- package/dist/curves/QuadraticBezierCurve.d.ts +13 -0
- package/dist/curves/QuadraticBezierCurve.d.ts.map +1 -0
- package/dist/curves/QuadraticBezierCurve.js +23 -0
- package/dist/curves/QuadraticBezierCurve.js.map +1 -0
- package/dist/curves/QuadraticBezierCurve3.d.ts +13 -0
- package/dist/curves/QuadraticBezierCurve3.d.ts.map +1 -0
- package/dist/curves/QuadraticBezierCurve3.js +23 -0
- package/dist/curves/QuadraticBezierCurve3.js.map +1 -0
- package/dist/curves/Shape.d.ts +15 -0
- package/dist/curves/Shape.d.ts.map +1 -0
- package/dist/curves/Shape.js +26 -0
- package/dist/curves/Shape.js.map +1 -0
- package/dist/curves/SplineCurve.d.ts +11 -0
- package/dist/curves/SplineCurve.d.ts.map +1 -0
- package/dist/curves/SplineCurve.js +27 -0
- package/dist/curves/SplineCurve.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { Vector2 } from "../Vector2.js";
|
|
2
|
+
import { Vector3 } from "../Vector3.js";
|
|
3
|
+
import type { Curve, FrenetFrame } from "../Curves.js";
|
|
4
|
+
/**
|
|
5
|
+
* Abstract base implementing the frozen {@link Curve} contract with three.js
|
|
6
|
+
* `Curve` semantics: cached arc-length table (rebuilt once unless
|
|
7
|
+
* {@link updateArcLengths} is called), binary-search `getUtoTmapping`,
|
|
8
|
+
* finite-difference tangents and rotation-minimizing Frenet frames.
|
|
9
|
+
*
|
|
10
|
+
* Aura3D curves keep their control data in readonly fields; `getPoint` is the
|
|
11
|
+
* only abstract method — everything else derives from it exactly like three.
|
|
12
|
+
*/
|
|
13
|
+
export declare abstract class CurveBase<V extends Vector2 | Vector3> implements Curve<V> {
|
|
14
|
+
/** Samples used for the arc-length table (three.js `arcLengthDivisions`). */
|
|
15
|
+
arcLengthDivisions: number;
|
|
16
|
+
/** Set by {@link updateArcLengths}; invalidates the cached length table. */
|
|
17
|
+
needsUpdate: boolean;
|
|
18
|
+
protected cacheArcLengths: number[] | null;
|
|
19
|
+
/** Parametric point at `t` ∈ [0,1] (implementations define clamping). */
|
|
20
|
+
abstract getPoint(t: number): V;
|
|
21
|
+
getPointAt(u: number): V;
|
|
22
|
+
getPoints(divisions?: number): V[];
|
|
23
|
+
getSpacedPoints(divisions?: number): V[];
|
|
24
|
+
getLength(): number;
|
|
25
|
+
/**
|
|
26
|
+
* Cumulative arc lengths sampled at `divisions` uniform `t` values. The
|
|
27
|
+
* table is built once and cached until `divisions` changes or
|
|
28
|
+
* {@link updateArcLengths} is invoked (three.js `Curve.getLengths`).
|
|
29
|
+
*/
|
|
30
|
+
getLengths(divisions?: number): number[];
|
|
31
|
+
updateArcLengths(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Binary search over the cached arc-length table + linear interpolation,
|
|
34
|
+
* mapping normalized arc length `u` to curve parameter `t`
|
|
35
|
+
* (three.js `Curve.getUtoTmapping`).
|
|
36
|
+
*/
|
|
37
|
+
getUtoTmapping(u: number): number;
|
|
38
|
+
/** Finite-difference unit tangent at `t` (three.js `Curve.getTangent`). */
|
|
39
|
+
getTangent(t: number): V;
|
|
40
|
+
getTangentAt(u: number): V;
|
|
41
|
+
/**
|
|
42
|
+
* Rotation-minimizing tangent/normal/binormal frames — three.js
|
|
43
|
+
* `Curve.computeFrenetFrames`. Only defined for `Vector3` curves; returns
|
|
44
|
+
* `null` for `Vector2` curves.
|
|
45
|
+
*/
|
|
46
|
+
computeFrenetFrames(segments: number, closed?: boolean): FrenetFrame | null;
|
|
47
|
+
clone(): this;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=CurveBase.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CurveBase.d.ts","sourceRoot":"","sources":["../../../../../packages/math/src/curves/CurveBase.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAcvD;;;;;;;;GAQG;AACH,8BAAsB,SAAS,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,CAAE,YAAW,KAAK,CAAC,CAAC,CAAC;IAC9E,6EAA6E;IAC7E,kBAAkB,SAAO;IAEzB,4EAA4E;IAC5E,WAAW,UAAQ;IAEnB,SAAS,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAElD,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC;IAE/B,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC;IAKxB,SAAS,CAAC,SAAS,SAAI,GAAG,CAAC,EAAE;IAQ7B,eAAe,CAAC,SAAS,SAAI,GAAG,CAAC,EAAE;IAQnC,SAAS,IAAI,MAAM;IAKnB;;;;OAIG;IACH,UAAU,CAAC,SAAS,GAAE,MAAgC,GAAG,MAAM,EAAE;IAwBjE,gBAAgB,IAAI,IAAI;IAKxB;;;;OAIG;IACH,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM;IAsCjC,2EAA2E;IAC3E,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC;IAWxB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC;IAK1B;;;;OAIG;IACH,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,UAAQ,GAAG,WAAW,GAAG,IAAI;IAiEzE,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
import { Quaternion } from "../Quaternion.js";
|
|
2
|
+
import { Vector2 } from "../Vector2.js";
|
|
3
|
+
import { Vector3 } from "../Vector3.js";
|
|
4
|
+
function subVectors(a, b) {
|
|
5
|
+
return a.subtract(b);
|
|
6
|
+
}
|
|
7
|
+
function distance(a, b) {
|
|
8
|
+
return a.distanceTo(b);
|
|
9
|
+
}
|
|
10
|
+
function clamp01(v, lo = -1, hi = 1) {
|
|
11
|
+
return Math.max(lo, Math.min(hi, v));
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Abstract base implementing the frozen {@link Curve} contract with three.js
|
|
15
|
+
* `Curve` semantics: cached arc-length table (rebuilt once unless
|
|
16
|
+
* {@link updateArcLengths} is called), binary-search `getUtoTmapping`,
|
|
17
|
+
* finite-difference tangents and rotation-minimizing Frenet frames.
|
|
18
|
+
*
|
|
19
|
+
* Aura3D curves keep their control data in readonly fields; `getPoint` is the
|
|
20
|
+
* only abstract method — everything else derives from it exactly like three.
|
|
21
|
+
*/
|
|
22
|
+
export class CurveBase {
|
|
23
|
+
/** Samples used for the arc-length table (three.js `arcLengthDivisions`). */
|
|
24
|
+
arcLengthDivisions = 200;
|
|
25
|
+
/** Set by {@link updateArcLengths}; invalidates the cached length table. */
|
|
26
|
+
needsUpdate = true;
|
|
27
|
+
cacheArcLengths = null;
|
|
28
|
+
getPointAt(u) {
|
|
29
|
+
const t = this.getUtoTmapping(u);
|
|
30
|
+
return this.getPoint(t);
|
|
31
|
+
}
|
|
32
|
+
getPoints(divisions = 5) {
|
|
33
|
+
const points = [];
|
|
34
|
+
for (let d = 0; d <= divisions; d += 1) {
|
|
35
|
+
points.push(this.getPoint(d / divisions));
|
|
36
|
+
}
|
|
37
|
+
return points;
|
|
38
|
+
}
|
|
39
|
+
getSpacedPoints(divisions = 5) {
|
|
40
|
+
const points = [];
|
|
41
|
+
for (let d = 0; d <= divisions; d += 1) {
|
|
42
|
+
points.push(this.getPointAt(d / divisions));
|
|
43
|
+
}
|
|
44
|
+
return points;
|
|
45
|
+
}
|
|
46
|
+
getLength() {
|
|
47
|
+
const lengths = this.getLengths();
|
|
48
|
+
return lengths[lengths.length - 1];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Cumulative arc lengths sampled at `divisions` uniform `t` values. The
|
|
52
|
+
* table is built once and cached until `divisions` changes or
|
|
53
|
+
* {@link updateArcLengths} is invoked (three.js `Curve.getLengths`).
|
|
54
|
+
*/
|
|
55
|
+
getLengths(divisions = this.arcLengthDivisions) {
|
|
56
|
+
if (this.cacheArcLengths !== null &&
|
|
57
|
+
this.cacheArcLengths.length === divisions + 1 &&
|
|
58
|
+
!this.needsUpdate) {
|
|
59
|
+
return this.cacheArcLengths;
|
|
60
|
+
}
|
|
61
|
+
this.needsUpdate = false;
|
|
62
|
+
const cache = [0];
|
|
63
|
+
let last = this.getPoint(0);
|
|
64
|
+
let sum = 0;
|
|
65
|
+
for (let p = 1; p <= divisions; p += 1) {
|
|
66
|
+
const current = this.getPoint(p / divisions);
|
|
67
|
+
sum += distance(current, last);
|
|
68
|
+
cache.push(sum);
|
|
69
|
+
last = current;
|
|
70
|
+
}
|
|
71
|
+
this.cacheArcLengths = cache;
|
|
72
|
+
return cache;
|
|
73
|
+
}
|
|
74
|
+
updateArcLengths() {
|
|
75
|
+
this.needsUpdate = true;
|
|
76
|
+
this.getLengths();
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Binary search over the cached arc-length table + linear interpolation,
|
|
80
|
+
* mapping normalized arc length `u` to curve parameter `t`
|
|
81
|
+
* (three.js `Curve.getUtoTmapping`).
|
|
82
|
+
*/
|
|
83
|
+
getUtoTmapping(u) {
|
|
84
|
+
const arcLengths = this.getLengths();
|
|
85
|
+
let i = 0;
|
|
86
|
+
const il = arcLengths.length;
|
|
87
|
+
const targetArcLength = u * arcLengths[il - 1];
|
|
88
|
+
// binary search
|
|
89
|
+
let low = 0;
|
|
90
|
+
let high = il - 1;
|
|
91
|
+
let comparison;
|
|
92
|
+
while (low <= high) {
|
|
93
|
+
i = Math.floor(low + (high - low) / 2);
|
|
94
|
+
comparison = arcLengths[i] - targetArcLength;
|
|
95
|
+
if (comparison < 0) {
|
|
96
|
+
low = i + 1;
|
|
97
|
+
}
|
|
98
|
+
else if (comparison > 0) {
|
|
99
|
+
high = i - 1;
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
high = i;
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
i = high;
|
|
107
|
+
if (arcLengths[i] === targetArcLength) {
|
|
108
|
+
return i / (il - 1);
|
|
109
|
+
}
|
|
110
|
+
const lengthBefore = arcLengths[i];
|
|
111
|
+
const lengthAfter = arcLengths[i + 1];
|
|
112
|
+
const segmentLength = lengthAfter - lengthBefore;
|
|
113
|
+
const segmentFraction = segmentLength === 0 ? 0 : (targetArcLength - lengthBefore) / segmentLength;
|
|
114
|
+
return (i + segmentFraction) / (il - 1);
|
|
115
|
+
}
|
|
116
|
+
/** Finite-difference unit tangent at `t` (three.js `Curve.getTangent`). */
|
|
117
|
+
getTangent(t) {
|
|
118
|
+
const delta = 0.0001;
|
|
119
|
+
let t1 = t - delta;
|
|
120
|
+
let t2 = t + delta;
|
|
121
|
+
if (t1 < 0)
|
|
122
|
+
t1 = 0;
|
|
123
|
+
if (t2 > 1)
|
|
124
|
+
t2 = 1;
|
|
125
|
+
const pt1 = this.getPoint(t1);
|
|
126
|
+
const pt2 = this.getPoint(t2);
|
|
127
|
+
return subVectors(pt2, pt1).normalize();
|
|
128
|
+
}
|
|
129
|
+
getTangentAt(u) {
|
|
130
|
+
const t = this.getUtoTmapping(u);
|
|
131
|
+
return this.getTangent(t);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Rotation-minimizing tangent/normal/binormal frames — three.js
|
|
135
|
+
* `Curve.computeFrenetFrames`. Only defined for `Vector3` curves; returns
|
|
136
|
+
* `null` for `Vector2` curves.
|
|
137
|
+
*/
|
|
138
|
+
computeFrenetFrames(segments, closed = false) {
|
|
139
|
+
if (!(this.getPoint(0) instanceof Vector3)) {
|
|
140
|
+
return null;
|
|
141
|
+
}
|
|
142
|
+
const tangents = [];
|
|
143
|
+
const normals = [];
|
|
144
|
+
const binormals = [];
|
|
145
|
+
for (let i = 0; i <= segments; i += 1) {
|
|
146
|
+
const u = i / segments;
|
|
147
|
+
tangents[i] = this.getTangentAt(u);
|
|
148
|
+
}
|
|
149
|
+
// Initial normal: pick the smallest-magnitude tangent axis, orthogonalize.
|
|
150
|
+
let normal = new Vector3(0, 0, 0);
|
|
151
|
+
let min = Number.MAX_VALUE;
|
|
152
|
+
const tx = Math.abs(tangents[0].x);
|
|
153
|
+
const ty = Math.abs(tangents[0].y);
|
|
154
|
+
const tz = Math.abs(tangents[0].z);
|
|
155
|
+
if (tx <= min) {
|
|
156
|
+
min = tx;
|
|
157
|
+
normal = new Vector3(1, 0, 0);
|
|
158
|
+
}
|
|
159
|
+
if (ty <= min) {
|
|
160
|
+
min = ty;
|
|
161
|
+
normal = new Vector3(0, 1, 0);
|
|
162
|
+
}
|
|
163
|
+
if (tz <= min) {
|
|
164
|
+
normal = new Vector3(0, 0, 1);
|
|
165
|
+
}
|
|
166
|
+
const vec0 = tangents[0].cross(normal).normalize();
|
|
167
|
+
normals[0] = tangents[0].cross(vec0);
|
|
168
|
+
binormals[0] = tangents[0].cross(normals[0]);
|
|
169
|
+
// Parallel transport the frame along the curve.
|
|
170
|
+
for (let i = 1; i <= segments; i += 1) {
|
|
171
|
+
let n = normals[i - 1];
|
|
172
|
+
const vec = tangents[i - 1].cross(tangents[i]);
|
|
173
|
+
if (vec.length() > Number.EPSILON) {
|
|
174
|
+
const axis = vec.normalize();
|
|
175
|
+
const theta = Math.acos(clamp01(tangents[i - 1].dot(tangents[i])));
|
|
176
|
+
n = n.rotateByQuaternion(Quaternion.fromAxisAngle(axis, theta));
|
|
177
|
+
}
|
|
178
|
+
normals[i] = n;
|
|
179
|
+
binormals[i] = tangents[i].cross(n);
|
|
180
|
+
}
|
|
181
|
+
if (closed === true) {
|
|
182
|
+
let theta = Math.acos(clamp01(normals[0].dot(normals[segments])));
|
|
183
|
+
theta /= segments;
|
|
184
|
+
if (tangents[0].dot(normals[0].cross(normals[segments])) > 0) {
|
|
185
|
+
theta = -theta;
|
|
186
|
+
}
|
|
187
|
+
for (let i = 1; i <= segments; i += 1) {
|
|
188
|
+
const n = normals[i].rotateByQuaternion(Quaternion.fromAxisAngle(tangents[i], theta * i));
|
|
189
|
+
normals[i] = n;
|
|
190
|
+
binormals[i] = tangents[i].cross(n);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return { tangents, normals, binormals };
|
|
194
|
+
}
|
|
195
|
+
clone() {
|
|
196
|
+
throw new Error("CurveBase.clone must be implemented by subclasses.");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=CurveBase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CurveBase.js","sourceRoot":"","sources":["../../../../../packages/math/src/curves/CurveBase.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Vector2 } from "../Vector2.js";
|
|
2
|
+
import { Vector3 } from "../Vector3.js";
|
|
3
|
+
import { CurveBase } from "./CurveBase.js";
|
|
4
|
+
/**
|
|
5
|
+
* Concatenation of curves parameterized over the total arc length —
|
|
6
|
+
* three.js `CurvePath` parity (per-curve length cache, `getCurveLengths`,
|
|
7
|
+
* `autoClose`, `closePath`).
|
|
8
|
+
*/
|
|
9
|
+
export declare class CurvePath<V extends Vector2 | Vector3> extends CurveBase<V> {
|
|
10
|
+
readonly curves: CurveBase<V>[];
|
|
11
|
+
/** When true, `getPoints`/`getSpacedPoints` append the first point. */
|
|
12
|
+
autoClose: boolean;
|
|
13
|
+
/** Per-subcurve cumulative length cache (three.js `cacheLengths`). */
|
|
14
|
+
protected cacheLengths: number[] | null;
|
|
15
|
+
add(curve: CurveBase<V>): void;
|
|
16
|
+
/**
|
|
17
|
+
* Appends a `LineCurve`/`LineCurve3` from the last curve's end back to the
|
|
18
|
+
* first curve's start when they differ.
|
|
19
|
+
*/
|
|
20
|
+
closePath(): this;
|
|
21
|
+
getPoint(t: number): V;
|
|
22
|
+
/**
|
|
23
|
+
* Total path length — overrides the base implementation because in a
|
|
24
|
+
* CurvePath `getPoint` depends on `getLength` (three does the same).
|
|
25
|
+
*/
|
|
26
|
+
getLength(): number;
|
|
27
|
+
updateArcLengths(): void;
|
|
28
|
+
/** Cumulative sub-curve lengths (cached while `curves` is unchanged). */
|
|
29
|
+
getCurveLengths(): number[];
|
|
30
|
+
getSpacedPoints(divisions?: number): V[];
|
|
31
|
+
getPoints(divisions?: number): V[];
|
|
32
|
+
clone(): this;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=CurvePath.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CurvePath.d.ts","sourceRoot":"","sources":["../../../../../packages/math/src/curves/CurvePath.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAW3C;;;;GAIG;AACH,qBAAa,SAAS,CAAC,CAAC,SAAS,OAAO,GAAG,OAAO,CAAE,SAAQ,SAAS,CAAC,CAAC,CAAC;IACtE,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAM;IAErC,uEAAuE;IACvE,SAAS,UAAS;IAElB,sEAAsE;IACtE,SAAS,CAAC,YAAY,EAAE,MAAM,EAAE,GAAG,IAAI,CAAQ;IAE/C,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,IAAI;IAI9B;;;OAGG;IACH,SAAS,IAAI,IAAI;IAajB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,CAAC;IAoBtB;;;OAGG;IACH,SAAS,IAAI,MAAM;IAKV,gBAAgB,IAAI,IAAI;IAMjC,yEAAyE;IACzE,eAAe,IAAI,MAAM,EAAE;IAc3B,eAAe,CAAC,SAAS,SAAK,GAAG,CAAC,EAAE;IAWpC,SAAS,CAAC,SAAS,SAAK,GAAG,CAAC,EAAE;IAyB9B,KAAK,IAAI,IAAI;CAMd"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { Vector2 } from "../Vector2.js";
|
|
2
|
+
import { Vector3 } from "../Vector3.js";
|
|
3
|
+
import { CurveBase } from "./CurveBase.js";
|
|
4
|
+
import { LineCurve } from "./LineCurve.js";
|
|
5
|
+
import { LineCurve3 } from "./LineCurve3.js";
|
|
6
|
+
/** Component equality across the Vector2 | Vector3 union. */
|
|
7
|
+
function vecEquals(a, b) {
|
|
8
|
+
if (a instanceof Vector2 && b instanceof Vector2)
|
|
9
|
+
return a.equals(b);
|
|
10
|
+
if (a instanceof Vector3 && b instanceof Vector3)
|
|
11
|
+
return a.equals(b);
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Concatenation of curves parameterized over the total arc length —
|
|
16
|
+
* three.js `CurvePath` parity (per-curve length cache, `getCurveLengths`,
|
|
17
|
+
* `autoClose`, `closePath`).
|
|
18
|
+
*/
|
|
19
|
+
export class CurvePath extends CurveBase {
|
|
20
|
+
curves = [];
|
|
21
|
+
/** When true, `getPoints`/`getSpacedPoints` append the first point. */
|
|
22
|
+
autoClose = false;
|
|
23
|
+
/** Per-subcurve cumulative length cache (three.js `cacheLengths`). */
|
|
24
|
+
cacheLengths = null;
|
|
25
|
+
add(curve) {
|
|
26
|
+
this.curves.push(curve);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Appends a `LineCurve`/`LineCurve3` from the last curve's end back to the
|
|
30
|
+
* first curve's start when they differ.
|
|
31
|
+
*/
|
|
32
|
+
closePath() {
|
|
33
|
+
const startPoint = this.curves[0].getPoint(0);
|
|
34
|
+
const endPoint = this.curves[this.curves.length - 1].getPoint(1);
|
|
35
|
+
if (!vecEquals(startPoint, endPoint)) {
|
|
36
|
+
if (startPoint instanceof Vector2) {
|
|
37
|
+
this.curves.push(new LineCurve(endPoint, startPoint));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
this.curves.push(new LineCurve3(endPoint, startPoint));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
getPoint(t) {
|
|
46
|
+
if (this.curves.length === 0)
|
|
47
|
+
throw new RangeError("CurvePath is empty.");
|
|
48
|
+
// locate the sub-curve covering arc-length distance d = t * total length
|
|
49
|
+
const d = t * this.getLength();
|
|
50
|
+
const curveLengths = this.getCurveLengths();
|
|
51
|
+
let i = 0;
|
|
52
|
+
while (i < curveLengths.length) {
|
|
53
|
+
if (curveLengths[i] >= d) {
|
|
54
|
+
const diff = curveLengths[i] - d;
|
|
55
|
+
const curve = this.curves[i];
|
|
56
|
+
const segmentLength = curve.getLength();
|
|
57
|
+
const u = segmentLength === 0 ? 0 : 1 - diff / segmentLength;
|
|
58
|
+
return curve.getPointAt(u);
|
|
59
|
+
}
|
|
60
|
+
i += 1;
|
|
61
|
+
}
|
|
62
|
+
// t beyond the end: return the last point (three returns null)
|
|
63
|
+
return this.curves[this.curves.length - 1].getPoint(1);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Total path length — overrides the base implementation because in a
|
|
67
|
+
* CurvePath `getPoint` depends on `getLength` (three does the same).
|
|
68
|
+
*/
|
|
69
|
+
getLength() {
|
|
70
|
+
const lens = this.getCurveLengths();
|
|
71
|
+
return lens[lens.length - 1] ?? 0;
|
|
72
|
+
}
|
|
73
|
+
updateArcLengths() {
|
|
74
|
+
this.needsUpdate = true;
|
|
75
|
+
this.cacheLengths = null;
|
|
76
|
+
this.getCurveLengths();
|
|
77
|
+
}
|
|
78
|
+
/** Cumulative sub-curve lengths (cached while `curves` is unchanged). */
|
|
79
|
+
getCurveLengths() {
|
|
80
|
+
if (this.cacheLengths && this.cacheLengths.length === this.curves.length) {
|
|
81
|
+
return this.cacheLengths;
|
|
82
|
+
}
|
|
83
|
+
const lengths = [];
|
|
84
|
+
let sums = 0;
|
|
85
|
+
for (const curve of this.curves) {
|
|
86
|
+
sums += curve.getLength();
|
|
87
|
+
lengths.push(sums);
|
|
88
|
+
}
|
|
89
|
+
this.cacheLengths = lengths;
|
|
90
|
+
return lengths;
|
|
91
|
+
}
|
|
92
|
+
getSpacedPoints(divisions = 40) {
|
|
93
|
+
const points = [];
|
|
94
|
+
for (let i = 0; i <= divisions; i += 1) {
|
|
95
|
+
points.push(this.getPoint(i / divisions));
|
|
96
|
+
}
|
|
97
|
+
if (this.autoClose) {
|
|
98
|
+
points.push(points[0]);
|
|
99
|
+
}
|
|
100
|
+
return points;
|
|
101
|
+
}
|
|
102
|
+
getPoints(divisions = 12) {
|
|
103
|
+
const points = [];
|
|
104
|
+
let last;
|
|
105
|
+
for (const curve of this.curves) {
|
|
106
|
+
const c = curve;
|
|
107
|
+
const resolution = c.isEllipseCurve
|
|
108
|
+
? divisions * 2
|
|
109
|
+
: c.isLineCurve || c.isLineCurve3
|
|
110
|
+
? 1
|
|
111
|
+
: c.isSplineCurve
|
|
112
|
+
? divisions * (c.points?.length ?? 1)
|
|
113
|
+
: divisions;
|
|
114
|
+
const pts = curve.getPoints(resolution);
|
|
115
|
+
for (const point of pts) {
|
|
116
|
+
if (last && vecEquals(last, point))
|
|
117
|
+
continue; // no consecutive duplicates
|
|
118
|
+
points.push(point);
|
|
119
|
+
last = point;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (this.autoClose && points.length > 1 && !vecEquals(points[points.length - 1], points[0])) {
|
|
123
|
+
points.push(points[0]);
|
|
124
|
+
}
|
|
125
|
+
return points;
|
|
126
|
+
}
|
|
127
|
+
clone() {
|
|
128
|
+
const copy = new CurvePath();
|
|
129
|
+
for (const curve of this.curves)
|
|
130
|
+
copy.add(curve.clone());
|
|
131
|
+
copy.autoClose = this.autoClose;
|
|
132
|
+
return copy;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=CurvePath.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CurvePath.js","sourceRoot":"","sources":["../../../../../packages/math/src/curves/CurvePath.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Vector2 } from "../Vector2.js";
|
|
2
|
+
import { CurveBase } from "./CurveBase.js";
|
|
3
|
+
/** 2D ellipse arc — three.js `EllipseCurve` parity. */
|
|
4
|
+
export declare class EllipseCurve extends CurveBase<Vector2> {
|
|
5
|
+
readonly aX: number;
|
|
6
|
+
readonly aY: number;
|
|
7
|
+
readonly xRadius: number;
|
|
8
|
+
readonly yRadius: number;
|
|
9
|
+
readonly aStartAngle: number;
|
|
10
|
+
readonly aEndAngle: number;
|
|
11
|
+
readonly aClockwise: boolean;
|
|
12
|
+
readonly aRotation: number;
|
|
13
|
+
readonly isEllipseCurve: true;
|
|
14
|
+
constructor(aX?: number, aY?: number, xRadius?: number, yRadius?: number, aStartAngle?: number, aEndAngle?: number, aClockwise?: boolean, aRotation?: number);
|
|
15
|
+
getPoint(t: number): Vector2;
|
|
16
|
+
clone(): this;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=EllipseCurve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EllipseCurve.d.ts","sourceRoot":"","sources":["../../../../../packages/math/src/curves/EllipseCurve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,uDAAuD;AACvD,qBAAa,YAAa,SAAQ,SAAS,CAAC,OAAO,CAAC;IAIhD,QAAQ,CAAC,EAAE;IACX,QAAQ,CAAC,EAAE;IACX,QAAQ,CAAC,OAAO;IAChB,QAAQ,CAAC,OAAO;IAChB,QAAQ,CAAC,WAAW;IACpB,QAAQ,CAAC,SAAS;IAClB,QAAQ,CAAC,UAAU;IACnB,QAAQ,CAAC,SAAS;IAVpB,QAAQ,CAAC,cAAc,EAAG,IAAI,CAAU;gBAG7B,EAAE,SAAI,EACN,EAAE,SAAI,EACN,OAAO,SAAI,EACX,OAAO,SAAI,EACX,WAAW,SAAI,EACf,SAAS,SAAc,EACvB,UAAU,UAAQ,EAClB,SAAS,SAAI;IAKxB,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAyC5B,KAAK,IAAI,IAAI;CAMd"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Vector2 } from "../Vector2.js";
|
|
2
|
+
import { CurveBase } from "./CurveBase.js";
|
|
3
|
+
/** 2D ellipse arc — three.js `EllipseCurve` parity. */
|
|
4
|
+
export class EllipseCurve extends CurveBase {
|
|
5
|
+
aX;
|
|
6
|
+
aY;
|
|
7
|
+
xRadius;
|
|
8
|
+
yRadius;
|
|
9
|
+
aStartAngle;
|
|
10
|
+
aEndAngle;
|
|
11
|
+
aClockwise;
|
|
12
|
+
aRotation;
|
|
13
|
+
isEllipseCurve = true;
|
|
14
|
+
constructor(aX = 0, aY = 0, xRadius = 1, yRadius = 1, aStartAngle = 0, aEndAngle = Math.PI * 2, aClockwise = false, aRotation = 0) {
|
|
15
|
+
super();
|
|
16
|
+
this.aX = aX;
|
|
17
|
+
this.aY = aY;
|
|
18
|
+
this.xRadius = xRadius;
|
|
19
|
+
this.yRadius = yRadius;
|
|
20
|
+
this.aStartAngle = aStartAngle;
|
|
21
|
+
this.aEndAngle = aEndAngle;
|
|
22
|
+
this.aClockwise = aClockwise;
|
|
23
|
+
this.aRotation = aRotation;
|
|
24
|
+
}
|
|
25
|
+
getPoint(t) {
|
|
26
|
+
const twoPi = Math.PI * 2;
|
|
27
|
+
let deltaAngle = this.aEndAngle - this.aStartAngle;
|
|
28
|
+
const samePoints = Math.abs(deltaAngle) < Number.EPSILON;
|
|
29
|
+
// ensures that deltaAngle is 0 .. 2 PI
|
|
30
|
+
while (deltaAngle < 0)
|
|
31
|
+
deltaAngle += twoPi;
|
|
32
|
+
while (deltaAngle > twoPi)
|
|
33
|
+
deltaAngle -= twoPi;
|
|
34
|
+
if (deltaAngle < Number.EPSILON) {
|
|
35
|
+
if (samePoints) {
|
|
36
|
+
deltaAngle = 0;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
deltaAngle = twoPi;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
if (this.aClockwise === true && !samePoints) {
|
|
43
|
+
if (deltaAngle === twoPi) {
|
|
44
|
+
deltaAngle = -twoPi;
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
deltaAngle = deltaAngle - twoPi;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
const angle = this.aStartAngle + t * deltaAngle;
|
|
51
|
+
let x = this.aX + this.xRadius * Math.cos(angle);
|
|
52
|
+
let y = this.aY + this.yRadius * Math.sin(angle);
|
|
53
|
+
if (this.aRotation !== 0) {
|
|
54
|
+
const cos = Math.cos(this.aRotation);
|
|
55
|
+
const sin = Math.sin(this.aRotation);
|
|
56
|
+
const tx = x - this.aX;
|
|
57
|
+
const ty = y - this.aY;
|
|
58
|
+
x = tx * cos - ty * sin + this.aX;
|
|
59
|
+
y = tx * sin + ty * cos + this.aY;
|
|
60
|
+
}
|
|
61
|
+
return new Vector2(x, y);
|
|
62
|
+
}
|
|
63
|
+
clone() {
|
|
64
|
+
return new EllipseCurve(this.aX, this.aY, this.xRadius, this.yRadius, this.aStartAngle, this.aEndAngle, this.aClockwise, this.aRotation);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=EllipseCurve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EllipseCurve.js","sourceRoot":"","sources":["../../../../../packages/math/src/curves/EllipseCurve.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scalar spline/Bézier basis functions shared by the curve classes —
|
|
3
|
+
* three.js `extras/core/Interpolations.js` parity.
|
|
4
|
+
*/
|
|
5
|
+
/** Catmull-Rom spline interpolation (uniform, tension 0.5). */
|
|
6
|
+
export declare function CatmullRom(t: number, p0: number, p1: number, p2: number, p3: number): number;
|
|
7
|
+
export declare function QuadraticBezier(t: number, p0: number, p1: number, p2: number): number;
|
|
8
|
+
export declare function CubicBezier(t: number, p0: number, p1: number, p2: number, p3: number): number;
|
|
9
|
+
//# sourceMappingURL=Interpolations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Interpolations.d.ts","sourceRoot":"","sources":["../../../../../packages/math/src/curves/Interpolations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+DAA+D;AAC/D,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAM5F;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAGrF;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAG7F"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scalar spline/Bézier basis functions shared by the curve classes —
|
|
3
|
+
* three.js `extras/core/Interpolations.js` parity.
|
|
4
|
+
*/
|
|
5
|
+
/** Catmull-Rom spline interpolation (uniform, tension 0.5). */
|
|
6
|
+
export function CatmullRom(t, p0, p1, p2, p3) {
|
|
7
|
+
const v0 = (p2 - p0) * 0.5;
|
|
8
|
+
const v1 = (p3 - p1) * 0.5;
|
|
9
|
+
const t2 = t * t;
|
|
10
|
+
const t3 = t * t2;
|
|
11
|
+
return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;
|
|
12
|
+
}
|
|
13
|
+
export function QuadraticBezier(t, p0, p1, p2) {
|
|
14
|
+
const k = 1 - t;
|
|
15
|
+
return k * k * p0 + 2 * (1 - t) * t * p1 + t * t * p2;
|
|
16
|
+
}
|
|
17
|
+
export function CubicBezier(t, p0, p1, p2, p3) {
|
|
18
|
+
const k = 1 - t;
|
|
19
|
+
return k * k * k * p0 + 3 * k * k * t * p1 + 3 * (1 - t) * t * t * p2 + t * t * t * p3;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=Interpolations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Interpolations.js","sourceRoot":"","sources":["../../../../../packages/math/src/curves/Interpolations.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,+DAA+D;AAC/D,MAAM,UAAU,UAAU,CAAC,CAAS,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;IAClF,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;IAC3B,MAAM,EAAE,GAAG,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,GAAG,CAAC;IAC3B,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;IAClB,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;IAC3E,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,CAAS,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU,EAAE,EAAU;IACnF,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC;AACzF,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { Vector2 } from "../Vector2.js";
|
|
2
|
+
import { CurveBase } from "./CurveBase.js";
|
|
3
|
+
/** 2D line segment — three.js `LineCurve` parity. */
|
|
4
|
+
export declare class LineCurve extends CurveBase<Vector2> {
|
|
5
|
+
readonly v1: Vector2;
|
|
6
|
+
readonly v2: Vector2;
|
|
7
|
+
readonly isLineCurve: true;
|
|
8
|
+
constructor(v1?: Vector2, v2?: Vector2);
|
|
9
|
+
getPoint(t: number): Vector2;
|
|
10
|
+
/** Linear curve: `u` is already arc-length uniform. */
|
|
11
|
+
getPointAt(u: number): Vector2;
|
|
12
|
+
getTangent(_t: number): Vector2;
|
|
13
|
+
getTangentAt(u: number): Vector2;
|
|
14
|
+
clone(): this;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=LineCurve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineCurve.d.ts","sourceRoot":"","sources":["../../../../../packages/math/src/curves/LineCurve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,qDAAqD;AACrD,qBAAa,SAAU,SAAQ,SAAS,CAAC,OAAO,CAAC;IAI7C,QAAQ,CAAC,EAAE,EAAE,OAAO;IACpB,QAAQ,CAAC,EAAE,EAAE,OAAO;IAJtB,QAAQ,CAAC,WAAW,EAAG,IAAI,CAAU;gBAG1B,EAAE,GAAE,OAA2B,EAC/B,EAAE,GAAE,OAA2B;IAK1C,QAAQ,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAK5B,uDAAuD;IACvD,UAAU,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAI9B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO;IAI/B,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO;IAIhC,KAAK,IAAI,IAAI;CAGd"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Vector2 } from "../Vector2.js";
|
|
2
|
+
import { CurveBase } from "./CurveBase.js";
|
|
3
|
+
/** 2D line segment — three.js `LineCurve` parity. */
|
|
4
|
+
export class LineCurve extends CurveBase {
|
|
5
|
+
v1;
|
|
6
|
+
v2;
|
|
7
|
+
isLineCurve = true;
|
|
8
|
+
constructor(v1 = new Vector2(0, 0), v2 = new Vector2(0, 0)) {
|
|
9
|
+
super();
|
|
10
|
+
this.v1 = v1;
|
|
11
|
+
this.v2 = v2;
|
|
12
|
+
}
|
|
13
|
+
getPoint(t) {
|
|
14
|
+
if (t === 1)
|
|
15
|
+
return this.v2;
|
|
16
|
+
return this.v2.subtract(this.v1).multiplyScalar(t).add(this.v1);
|
|
17
|
+
}
|
|
18
|
+
/** Linear curve: `u` is already arc-length uniform. */
|
|
19
|
+
getPointAt(u) {
|
|
20
|
+
return this.getPoint(u);
|
|
21
|
+
}
|
|
22
|
+
getTangent(_t) {
|
|
23
|
+
return this.v2.subtract(this.v1).normalize();
|
|
24
|
+
}
|
|
25
|
+
getTangentAt(u) {
|
|
26
|
+
return this.getTangent(u);
|
|
27
|
+
}
|
|
28
|
+
clone() {
|
|
29
|
+
return new LineCurve(this.v1, this.v2);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=LineCurve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LineCurve.js","sourceRoot":"","sources":["../../../../../packages/math/src/curves/LineCurve.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,qDAAqD;AACrD,MAAM,OAAO,SAAU,SAAQ,SAAkB;IAIpC;IACA;IAJF,WAAW,GAAG,IAAa,CAAC;IAErC,YACW,KAAc,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,EAC/B,KAAc,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;QAExC,KAAK,EAAE,CAAC;QAHC,OAAE,GAAF,EAAE,CAA6B;QAC/B,OAAE,GAAF,EAAE,CAA6B;IAG1C,CAAC;IAED,QAAQ,CAAC,CAAS;QAChB,IAAI,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,EAAE,CAAC;QAC5B,OAAO,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,uDAAuD;IACvD,UAAU,CAAC,CAAS;QAClB,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC;IAED,UAAU,CAAC,EAAU;QACnB,OAAO,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,EAAE,CAAC;IAC/C,CAAC;IAED,YAAY,CAAC,CAAS;QACpB,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,KAAK;QACH,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,CAAS,CAAC;IACjD,CAAC;CACF"}
|