@weasel-js/geom 1.15.1 → 1.16.0
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/3d/index.d.ts +16 -2
- package/dist/3d/index.js +17 -10
- package/dist/3d/index.js.map +1 -1
- package/dist/booleans/index.js +5 -5
- package/dist/{chunk-B3D6KWW3.js → chunk-346XYYMX.js} +154 -3
- package/dist/chunk-346XYYMX.js.map +1 -0
- package/dist/{chunk-FROQPADA.js → chunk-5W425HJA.js} +82 -16
- package/dist/chunk-5W425HJA.js.map +1 -0
- package/dist/chunk-DNX24KBT.js +82 -0
- package/dist/chunk-DNX24KBT.js.map +1 -0
- package/dist/chunk-FOXMA54X.js +266 -0
- package/dist/chunk-FOXMA54X.js.map +1 -0
- package/dist/{chunk-3HQJGI63.js → chunk-HTT5AQIU.js} +3 -4
- package/dist/chunk-HTT5AQIU.js.map +1 -0
- package/dist/chunk-IOD2NFHQ.js +212 -0
- package/dist/chunk-IOD2NFHQ.js.map +1 -0
- package/dist/{chunk-HNLJO3E7.js → chunk-MOCSUHEI.js} +22 -8
- package/dist/chunk-MOCSUHEI.js.map +1 -0
- package/dist/{chunk-3YH5XU3H.js → chunk-OBPXEPUH.js} +14 -23
- package/dist/chunk-OBPXEPUH.js.map +1 -0
- package/dist/chunk-QSVZO7QZ.js +40 -0
- package/dist/chunk-QSVZO7QZ.js.map +1 -0
- package/dist/{chunk-EURWZUNY.js → chunk-TBS4NHGQ.js} +70 -93
- package/dist/chunk-TBS4NHGQ.js.map +1 -0
- package/dist/{chunk-HMGGJZTM.js → chunk-VJG5ZWCR.js} +7 -21
- package/dist/chunk-VJG5ZWCR.js.map +1 -0
- package/dist/{chunk-ZOMUTU7J.js → chunk-ZV24QZ6X.js} +5 -11
- package/dist/chunk-ZV24QZ6X.js.map +1 -0
- package/dist/{curvature-CDOI32hv.d.ts → curvature-DKPO4Qeh.d.ts} +0 -27
- package/dist/curves/index.d.ts +1 -1
- package/dist/curves/index.js +4 -4
- package/dist/index.d.ts +193 -13
- package/dist/index.js +409 -273
- package/dist/index.js.map +1 -1
- package/dist/lengthTable-Cv3W6lsH.d.ts +64 -0
- package/dist/nd/index.d.ts +28 -1
- package/dist/nd/index.js +2 -5
- package/dist/nd/index.js.map +1 -1
- package/dist/tessellate/index.d.ts +23 -1
- package/dist/tessellate/index.js +31 -17
- package/dist/tessellate/index.js.map +1 -1
- package/dist/warp/index.js +9 -15
- package/dist/warp/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-2N6OWA7E.js +0 -104
- package/dist/chunk-2N6OWA7E.js.map +0 -1
- package/dist/chunk-3HQJGI63.js.map +0 -1
- package/dist/chunk-3YH5XU3H.js.map +0 -1
- package/dist/chunk-755Y4YZS.js +0 -32
- package/dist/chunk-755Y4YZS.js.map +0 -1
- package/dist/chunk-B3D6KWW3.js.map +0 -1
- package/dist/chunk-EURWZUNY.js.map +0 -1
- package/dist/chunk-FROQPADA.js.map +0 -1
- package/dist/chunk-HMGGJZTM.js.map +0 -1
- package/dist/chunk-HNLJO3E7.js.map +0 -1
- package/dist/chunk-ZOMUTU7J.js.map +0 -1
package/dist/3d/index.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { L as LengthTable } from '../lengthTable-Cv3W6lsH.js';
|
|
1
2
|
export { P as PORT_REACH } from '../portCurve-C5HDWuuV.js';
|
|
2
3
|
|
|
3
4
|
/** Three-component vectors and unit quaternions. `Vec3`'s fields are readonly:
|
|
@@ -8,6 +9,7 @@ export { P as PORT_REACH } from '../portCurve-C5HDWuuV.js';
|
|
|
8
9
|
* consumer writing both dimensions says `p.x` in each. `Quat` stays a tuple —
|
|
9
10
|
* it is not a point, and `[x, y, z, w]` is the layout three.js and glMatrix
|
|
10
11
|
* both use. */
|
|
12
|
+
/** A point or direction in 3D. */
|
|
11
13
|
interface Vec3 {
|
|
12
14
|
readonly x: number;
|
|
13
15
|
readonly y: number;
|
|
@@ -115,7 +117,8 @@ declare function aabbOfPoints(points: readonly Vec3[]): Aabb;
|
|
|
115
117
|
/** The point of the infinite line through `origin` along `direction` nearest
|
|
116
118
|
* `p`. A zero direction makes the line the point `origin`. */
|
|
117
119
|
declare function closestPointOnLine(p: Vec3, origin: Vec3, direction: Vec3): Vec3;
|
|
118
|
-
/** The point of segment `a`–`b` nearest `p
|
|
120
|
+
/** The point of segment `a`–`b` nearest `p`; `a` when the segment has no
|
|
121
|
+
* length. The rule is `../points`', stated once for every dimension. */
|
|
119
122
|
declare function closestPointOnSegment(p: Vec3, a: Vec3, b: Vec3): Vec3;
|
|
120
123
|
/**
|
|
121
124
|
* The nearest pair of points between a ray and the infinite line through
|
|
@@ -143,4 +146,15 @@ declare function portCurvePoints(a: Vec3, b: Vec3, outNormal: Vec3 | null | unde
|
|
|
143
146
|
/** A cubic evaluated at `t`. The 2D barrel's `cubicEvalAt`, one dimension up. */
|
|
144
147
|
declare function cubicAt(p0: Vec3, p1: Vec3, p2: Vec3, p3: Vec3, t: number): Vec3;
|
|
145
148
|
|
|
146
|
-
|
|
149
|
+
/**
|
|
150
|
+
* Length-table queries one dimension up, in `Vec3`. The table and its math
|
|
151
|
+
* live in `../along`, stated over components; this wrapper is types only.
|
|
152
|
+
*/
|
|
153
|
+
|
|
154
|
+
/** The point at pen-order length `s` and the unit tangent there; see the root barrel's `pointAtLength`. */
|
|
155
|
+
declare function pointAtLength3(t: LengthTable, s: number): {
|
|
156
|
+
point: Vec3;
|
|
157
|
+
tangent: Vec3;
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export { type Aabb, type Mat4, type Quat, type Ray, type Vec3, aabbAround, aabbOfPoints, add, closestPointOnLine, closestPointOnSegment, closestPointsRayLine, compose, cross, cubicAt, distance, dot, identity, intersectRayAabb, intersectRayPlane, invert, len, len2, lerp, lookAt, multiply, normalize, perspective, pointAtLength3, pointOnRay, portControls, portCurvePoints, quatConjugate, quatFromAxisAngle, quatIdentity, quatMultiply, quatRotate, scale, sub, transformAabb, transformPoint, transformPoint4, vec3 };
|
package/dist/3d/index.js
CHANGED
|
@@ -1,6 +1,9 @@
|
|
|
1
|
+
import { pointAtLength } from '../chunk-FOXMA54X.js';
|
|
1
2
|
import { PORT_REACH, portControls, portCurvePoints, cubicAt } from '../chunk-YQADYJJ7.js';
|
|
2
3
|
export { PORT_REACH } from '../chunk-YQADYJJ7.js';
|
|
3
|
-
import
|
|
4
|
+
import '../chunk-QSVZO7QZ.js';
|
|
5
|
+
import '../chunk-IOD2NFHQ.js';
|
|
6
|
+
import { lerp, SINGULAR_RATIO, closestPointOnSegment } from '../chunk-DNX24KBT.js';
|
|
4
7
|
|
|
5
8
|
// src/3d/vec3.ts
|
|
6
9
|
function add(a, b) {
|
|
@@ -35,8 +38,8 @@ function normalize(a) {
|
|
|
35
38
|
function distance(a, b) {
|
|
36
39
|
return len(sub(a, b));
|
|
37
40
|
}
|
|
38
|
-
function
|
|
39
|
-
return { x: a.x
|
|
41
|
+
function lerp2(a, b, t) {
|
|
42
|
+
return { x: lerp(a.x, b.x, t), y: lerp(a.y, b.y, t), z: lerp(a.z, b.z, t) };
|
|
40
43
|
}
|
|
41
44
|
function vec3(x, y, z) {
|
|
42
45
|
return { x, y, z };
|
|
@@ -306,12 +309,9 @@ function closestPointOnLine(p, origin, direction) {
|
|
|
306
309
|
if (!(d2 > 0)) return origin;
|
|
307
310
|
return add(origin, scale(direction, dot(sub(p, origin), direction) / d2));
|
|
308
311
|
}
|
|
309
|
-
function
|
|
310
|
-
const
|
|
311
|
-
|
|
312
|
-
if (!(d2 > 0)) return a;
|
|
313
|
-
const t = Math.min(1, Math.max(0, dot(sub(p, a), ab) / d2));
|
|
314
|
-
return add(a, scale(ab, t));
|
|
312
|
+
function closestPointOnSegment2(p, a, b) {
|
|
313
|
+
const [x, y, z] = closestPointOnSegment([p.x, p.y, p.z], [a.x, a.y, a.z], [b.x, b.y, b.z]);
|
|
314
|
+
return { x, y, z };
|
|
315
315
|
}
|
|
316
316
|
function closestPointsRayLine(ray, origin, direction) {
|
|
317
317
|
const u = ray.direction;
|
|
@@ -359,6 +359,13 @@ function cubicAt2(p0, p1, p2, p3, t) {
|
|
|
359
359
|
return fromComps(p);
|
|
360
360
|
}
|
|
361
361
|
|
|
362
|
-
|
|
362
|
+
// src/3d/along3.ts
|
|
363
|
+
var fromComps2 = (p) => ({ x: p[0], y: p[1], z: p[2] });
|
|
364
|
+
function pointAtLength3(t, s) {
|
|
365
|
+
const { point, tangent } = pointAtLength(t, s);
|
|
366
|
+
return { point: fromComps2(point), tangent: fromComps2(tangent) };
|
|
367
|
+
}
|
|
368
|
+
|
|
369
|
+
export { aabbAround, aabbOfPoints, add, closestPointOnLine, closestPointOnSegment2 as closestPointOnSegment, closestPointsRayLine, compose, cross, cubicAt2 as cubicAt, distance, dot, identity, intersectRayAabb, intersectRayPlane, invert, len, len2, lerp2 as lerp, lookAt, multiply, normalize, perspective, pointAtLength3, pointOnRay, portControls2 as portControls, portCurvePoints2 as portCurvePoints, quatConjugate, quatFromAxisAngle, quatIdentity, quatMultiply, quatRotate, scale, sub, transformAabb, transformPoint, transformPoint4, vec3 };
|
|
363
370
|
//# sourceMappingURL=index.js.map
|
|
364
371
|
//# sourceMappingURL=index.js.map
|
package/dist/3d/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/3d/vec3.ts","../../src/3d/mat4.ts","../../src/3d/ray3.ts","../../src/3d/portCurve3.ts"],"names":["scale","portControls","portCurvePoints","cubicAt"],"mappings":"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","file":"index.js","sourcesContent":["/** Three-component vectors and unit quaternions. `Vec3`'s fields are readonly:\n * a pose stored in a history snapshot must not be writable through the value\n * handed to a renderer.\n *\n * Named fields rather than a tuple, matching `Vec2` one tier up, so a\n * consumer writing both dimensions says `p.x` in each. `Quat` stays a tuple —\n * it is not a point, and `[x, y, z, w]` is the layout three.js and glMatrix\n * both use. */\n\nexport interface Vec3 {\n readonly x: number;\n readonly y: number;\n readonly z: number;\n}\n\n/** `[x, y, z, w]`, w last — the layout three.js and glMatrix both use. */\nexport type Quat = readonly [number, number, number, number];\n\n/** `a + b`. */\nexport function add(a: Vec3, b: Vec3): Vec3 {\n return { x: a.x + b.x, y: a.y + b.y, z: a.z + b.z };\n}\n\n/** `a - b`. */\nexport function sub(a: Vec3, b: Vec3): Vec3 {\n return { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z };\n}\n\n/** `a` multiplied by the scalar `k`. */\nexport function scale(a: Vec3, k: number): Vec3 {\n return { x: a.x * k, y: a.y * k, z: a.z * k };\n}\n\n/** Dot product. */\nexport function dot(a: Vec3, b: Vec3): number {\n return a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\n/** Cross product `a × b`. */\nexport function cross(a: Vec3, b: Vec3): Vec3 {\n return {\n x: a.y * b.z - a.z * b.y,\n y: a.z * b.x - a.x * b.z,\n z: a.x * b.y - a.y * b.x,\n };\n}\n\n/** Squared length. Compare distances with this and skip the square root. */\nexport function len2(a: Vec3): number {\n return dot(a, a);\n}\n\n/** Euclidean length. */\nexport function len(a: Vec3): number {\n return Math.sqrt(len2(a));\n}\n\n/** A vector with no length, or no finite one, normalizes to the zero vector\n * rather than to `NaN`. Every other vector keeps its direction, however short. */\nexport function normalize(a: Vec3): Vec3 {\n const l = len(a);\n return l > 0 && l < Infinity ? scale(a, 1 / l) : { x: 0, y: 0, z: 0 };\n}\n\n/** Euclidean distance between two points. */\nexport function distance(a: Vec3, b: Vec3): number {\n return len(sub(a, b));\n}\n\n/** The point `t` of the way from `a` to `b`; `t` outside [0, 1] extrapolates. */\nexport function lerp(a: Vec3, b: Vec3, t: number): Vec3 {\n return { x: a.x + (b.x - a.x) * t, y: a.y + (b.y - a.y) * t, z: a.z + (b.z - a.z) * t };\n}\n\n/** `Vec3` from loose components — the shape `Mat4`'s row math produces. */\nexport function vec3(x: number, y: number, z: number): Vec3 {\n return { x, y, z };\n}\n\n/** The quaternion for no rotation, `[0, 0, 0, 1]`. */\nexport function quatIdentity(): Quat {\n return [0, 0, 0, 1];\n}\n\n/** Rotation by `angle` radians about `axis`, which must be nonzero but need\n * not be unit length. */\nexport function quatFromAxisAngle(axis: Vec3, angle: number): Quat {\n const a = normalize(axis);\n const half = angle / 2;\n const s = Math.sin(half);\n return [a.x * s, a.y * s, a.z * s, Math.cos(half)];\n}\n\n/** The rotation `a` after `b`: `quatRotate(quatMultiply(a, b), v)` is\n * `quatRotate(a, quatRotate(b, v))`. */\nexport function quatMultiply(a: Quat, b: Quat): Quat {\n const [ax, ay, az, aw] = a;\n const [bx, by, bz, bw] = b;\n return [\n aw * bx + ax * bw + ay * bz - az * by,\n aw * by - ax * bz + ay * bw + az * bx,\n aw * bz + ax * by - ay * bx + az * bw,\n aw * bw - ax * bx - ay * by - az * bz,\n ];\n}\n\n/** The inverse of a unit quaternion: the same rotation undone. */\nexport function quatConjugate(q: Quat): Quat {\n return [-q[0], -q[1], -q[2], q[3]];\n}\n\n/** `v` rotated by the unit quaternion `q`. */\nexport function quatRotate(q: Quat, v: Vec3): Vec3 {\n const [x, y, z, w] = q;\n const tx = 2 * (y * v.z - z * v.y);\n const ty = 2 * (z * v.x - x * v.z);\n const tz = 2 * (x * v.y - y * v.x);\n return {\n x: v.x + w * tx + (y * tz - z * ty),\n y: v.y + w * ty + (z * tx - x * tz),\n z: v.z + w * tz + (x * ty - y * tx),\n };\n}\n","/** 4x4 matrices in GL's column-major order: element (row `r`, column `c`) is\n * `m[c * 4 + r]`, which is the layout `gl.uniformMatrix4fv` reads without a\n * transpose and the one three.js `toArray()` emits. */\n\nimport { SINGULAR_RATIO } from '../scalar';\nimport { cross, dot, len, normalize, sub, vec3, type Quat, type Vec3 } from './vec3';\n\n/** 16 numbers, column-major. */\nexport type Mat4 = readonly number[];\n\n/** The identity matrix. */\nexport function identity(): Mat4 {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n\n/** The product `a · b`: applied to a point, `b` acts first. */\nexport function multiply(a: Mat4, b: Mat4): Mat4 {\n const out = new Array<number>(16);\n for (let c = 0; c < 4; c++) {\n for (let r = 0; r < 4; r++) {\n let sum = 0;\n for (let k = 0; k < 4; k++) sum += a[k * 4 + r] * b[c * 4 + k];\n out[c * 4 + r] = sum;\n }\n }\n return out;\n}\n\n/** `[x, y, z, w]` in whatever space `m` maps into — clip space, when `m` is a view-projection. */\nexport function transformPoint4(\n m: Mat4,\n p: Vec3,\n): readonly [number, number, number, number] {\n const { x, y, z } = p;\n return [\n m[0] * x + m[4] * y + m[8] * z + m[12],\n m[1] * x + m[5] * y + m[9] * z + m[13],\n m[2] * x + m[6] * y + m[10] * z + m[14],\n m[3] * x + m[7] * y + m[11] * z + m[15],\n ];\n}\n\n/** `transformPoint4` divided through by w, however small. A point on the eye\n * plane (w = 0) comes back non-finite. */\nexport function transformPoint(m: Mat4, p: Vec3): Vec3 {\n const [x, y, z, w] = transformPoint4(m, p);\n if (w === 1) return vec3(x, y, z);\n return vec3(x / w, y / w, z / w);\n}\n\n/** Inverse, or null when the matrix is singular, non-finite, or too\n * ill-conditioned to invert meaningfully at its own scale. */\nexport function invert(m: Mat4): Mat4 | null {\n const [\n m00, m01, m02, m03,\n m10, m11, m12, m13,\n m20, m21, m22, m23,\n m30, m31, m32, m33,\n ] = m;\n\n const b00 = m00 * m11 - m01 * m10;\n const b01 = m00 * m12 - m02 * m10;\n const b02 = m00 * m13 - m03 * m10;\n const b03 = m01 * m12 - m02 * m11;\n const b04 = m01 * m13 - m03 * m11;\n const b05 = m02 * m13 - m03 * m12;\n const b06 = m20 * m31 - m21 * m30;\n const b07 = m20 * m32 - m22 * m30;\n const b08 = m20 * m33 - m23 * m30;\n const b09 = m21 * m32 - m22 * m31;\n const b10 = m21 * m33 - m23 * m31;\n const b11 = m22 * m33 - m23 * m32;\n\n const det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n // Hadamard: |det| never exceeds the product of the column lengths, so the\n // ratio is a volume in [0, 1] that no per-column scale can shrink.\n const scale =\n Math.sqrt(m00 * m00 + m01 * m01 + m02 * m02 + m03 * m03) *\n Math.sqrt(m10 * m10 + m11 * m11 + m12 * m12 + m13 * m13) *\n Math.sqrt(m20 * m20 + m21 * m21 + m22 * m22 + m23 * m23) *\n Math.sqrt(m30 * m30 + m31 * m31 + m32 * m32 + m33 * m33);\n // Negated so a non-finite determinant falls out as singular.\n if (!(Math.abs(det) > SINGULAR_RATIO * scale)) return null;\n const d = 1 / det;\n\n return [\n (m11 * b11 - m12 * b10 + m13 * b09) * d,\n (m02 * b10 - m01 * b11 - m03 * b09) * d,\n (m31 * b05 - m32 * b04 + m33 * b03) * d,\n (m22 * b04 - m21 * b05 - m23 * b03) * d,\n (m12 * b08 - m10 * b11 - m13 * b07) * d,\n (m00 * b11 - m02 * b08 + m03 * b07) * d,\n (m32 * b02 - m30 * b05 - m33 * b01) * d,\n (m20 * b05 - m22 * b02 + m23 * b01) * d,\n (m10 * b10 - m11 * b08 + m13 * b06) * d,\n (m01 * b08 - m00 * b10 - m03 * b06) * d,\n (m30 * b04 - m31 * b02 + m33 * b00) * d,\n (m21 * b02 - m20 * b04 - m23 * b00) * d,\n (m11 * b07 - m10 * b09 - m12 * b06) * d,\n (m00 * b09 - m01 * b07 + m02 * b06) * d,\n (m31 * b01 - m30 * b03 - m32 * b00) * d,\n (m20 * b03 - m21 * b01 + m22 * b00) * d,\n ];\n}\n\n/** Translation · rotation · scale: the matrix that scales a point, then\n * rotates it, then moves it by `position`. */\nexport function compose(position: Vec3, rotation: Quat, scaling: Vec3): Mat4 {\n const [x, y, z, w] = rotation;\n const x2 = x + x;\n const y2 = y + y;\n const z2 = z + z;\n const xx = x * x2;\n const xy = x * y2;\n const xz = x * z2;\n const yy = y * y2;\n const yz = y * z2;\n const zz = z * z2;\n const wx = w * x2;\n const wy = w * y2;\n const wz = w * z2;\n const { x: sx, y: sy, z: sz } = scaling;\n\n return [\n (1 - (yy + zz)) * sx, (xy + wz) * sx, (xz - wy) * sx, 0,\n (xy - wz) * sy, (1 - (xx + zz)) * sy, (yz + wx) * sy, 0,\n (xz + wy) * sz, (yz - wx) * sz, (1 - (xx + yy)) * sz, 0,\n position.x, position.y, position.z, 1,\n ];\n}\n\n/** A GL-convention projection: vertical field of view `fovY` in radians, the\n * camera looking down −z, and `near`..`far` mapped to clip z −1..1. */\nexport function perspective(fovY: number, aspect: number, near: number, far: number): Mat4 {\n const f = 1 / Math.tan(fovY / 2);\n const range = near - far;\n return [\n f / aspect, 0, 0, 0,\n 0, f, 0, 0,\n 0, 0, (far + near) / range, -1,\n 0, 0, (2 * far * near) / range, 0,\n ];\n}\n\n/** A view from `eye` toward `target`. With the eye on its target, or `up`\n * parallel to the view to within rounding, the view has no orientation and\n * the result is singular. */\nexport function lookAt(eye: Vec3, target: Vec3, up: Vec3): Mat4 {\n const back = normalize(sub(eye, target));\n const side = cross(up, back);\n // |side| is |up| times the sine of the angle between up and the view.\n const right = len(side) > SINGULAR_RATIO * len(up) ? normalize(side) : vec3(0, 0, 0);\n const trueUp = cross(back, right);\n return [\n right.x, trueUp.x, back.x, 0,\n right.y, trueUp.y, back.y, 0,\n right.z, trueUp.z, back.z, 0,\n -dot(right, eye), -dot(trueUp, eye), -dot(back, eye), 1,\n ];\n}\n","/** Rays, axis-aligned boxes, and the intersections picking is built from. */\n\nimport { SINGULAR_RATIO } from '../scalar';\nimport { add, dot, len, len2, scale, sub, type Vec3 } from './vec3';\nimport { transformPoint, type Mat4 } from './mat4';\n\n/** A ray from `origin` along `direction`, which need not be unit length: the\n * `t` the intersections return is in multiples of it. */\nexport interface Ray {\n origin: Vec3;\n direction: Vec3;\n}\n\n/** An axis-aligned box. `min` is componentwise <= `max`. */\nexport interface Aabb {\n min: Vec3;\n max: Vec3;\n}\n\n/** Distance along the ray to the box, or null. A ray starting inside returns 0. */\nexport function intersectRayAabb(ray: Ray, min: Vec3, max: Vec3): number | null {\n let tMin = Number.NEGATIVE_INFINITY;\n let tMax = Number.POSITIVE_INFINITY;\n\n for (const axis of ['x', 'y', 'z'] as const) {\n const o = ray.origin[axis];\n const d = ray.direction[axis];\n // Any other direction, however short, divides to an honest (possibly infinite) t.\n if (d === 0) {\n if (o < min[axis] || o > max[axis]) return null;\n continue;\n }\n let t1 = (min[axis] - o) / d;\n let t2 = (max[axis] - o) / d;\n if (t1 > t2) [t1, t2] = [t2, t1];\n if (t1 > tMin) tMin = t1;\n if (t2 < tMax) tMax = t2;\n if (tMin > tMax) return null;\n }\n\n if (tMax < 0) return null;\n return tMin < 0 ? 0 : tMin;\n}\n\n/** Plane is `dot(normal, p) === offset`. Null when the ray runs parallel to the\n * plane to within rounding, or points away from it. */\nexport function intersectRayPlane(ray: Ray, normal: Vec3, offset: number): number | null {\n const denom = dot(normal, ray.direction);\n if (!(Math.abs(denom) > SINGULAR_RATIO * len(normal) * len(ray.direction))) return null;\n const t = (offset - dot(normal, ray.origin)) / denom;\n return t < 0 ? null : t;\n}\n\n/**\n * The axis-aligned box enclosing `local` after `m`. All eight corners are\n * transformed and re-bounded, so a rotation widens the result rather than\n * rotating it — an AABB cannot represent an oriented box, and pretending\n * otherwise is how a hit test starts missing its own geometry.\n */\nexport function transformAabb(m: Mat4, local: Aabb): Aabb {\n let min: Vec3 = { x: Infinity, y: Infinity, z: Infinity };\n let max: Vec3 = { x: -Infinity, y: -Infinity, z: -Infinity };\n for (let i = 0; i < 8; i++) {\n const corner: Vec3 = {\n x: i & 1 ? local.max.x : local.min.x,\n y: i & 2 ? local.max.y : local.min.y,\n z: i & 4 ? local.max.z : local.min.z,\n };\n const p = transformPoint(m, corner);\n min = { x: Math.min(min.x, p.x), y: Math.min(min.y, p.y), z: Math.min(min.z, p.z) };\n max = { x: Math.max(max.x, p.x), y: Math.max(max.y, p.y), z: Math.max(max.z, p.z) };\n }\n return { min, max };\n}\n\n/** The box centred on `center` reaching `radius` along every axis. */\nexport function aabbAround(center: Vec3, radius: number): Aabb {\n return {\n min: { x: center.x - radius, y: center.y - radius, z: center.z - radius },\n max: { x: center.x + radius, y: center.y + radius, z: center.z + radius },\n };\n}\n\n/** The point `t` direction-lengths along the ray. */\nexport function pointOnRay(ray: Ray, t: number): Vec3 {\n return add(ray.origin, scale(ray.direction, t));\n}\n\n/** The smallest box containing every point. No points gives an inverted\n * box, `min` at +Infinity and `max` at -Infinity. */\nexport function aabbOfPoints(points: readonly Vec3[]): Aabb {\n const min = { x: Infinity, y: Infinity, z: Infinity };\n const max = { x: -Infinity, y: -Infinity, z: -Infinity };\n for (const p of points) {\n for (const axis of ['x', 'y', 'z'] as const) {\n if (p[axis] < min[axis]) min[axis] = p[axis];\n if (p[axis] > max[axis]) max[axis] = p[axis];\n }\n }\n return { min, max };\n}\n\n/** The point of the infinite line through `origin` along `direction` nearest\n * `p`. A zero direction makes the line the point `origin`. */\nexport function closestPointOnLine(p: Vec3, origin: Vec3, direction: Vec3): Vec3 {\n const d2 = len2(direction);\n if (!(d2 > 0)) return origin;\n return add(origin, scale(direction, dot(sub(p, origin), direction) / d2));\n}\n\n/** The point of segment `a`–`b` nearest `p`. */\nexport function closestPointOnSegment(p: Vec3, a: Vec3, b: Vec3): Vec3 {\n const ab = sub(b, a);\n const d2 = len2(ab);\n if (!(d2 > 0)) return a;\n const t = Math.min(1, Math.max(0, dot(sub(p, a), ab) / d2));\n return add(a, scale(ab, t));\n}\n\n/**\n * The nearest pair of points between a ray and the infinite line through\n * `origin` along `direction`. `t` is the ray parameter (never negative) and\n * `s` the line's. A line parallel to the ray pairs with the ray's origin.\n */\nexport function closestPointsRayLine(\n ray: Ray,\n origin: Vec3,\n direction: Vec3,\n): { onRay: Vec3; onLine: Vec3; t: number; s: number } {\n const u = ray.direction;\n const v = direction;\n const w = sub(ray.origin, origin);\n const a = len2(u);\n const b = dot(u, v);\n const c = len2(v);\n const d = dot(u, w);\n const e = dot(v, w);\n const denom = a * c - b * b;\n let t = 0;\n if (a > 0 && denom > SINGULAR_RATIO * a * c) t = Math.max(0, (b * e - c * d) / denom);\n const onRay = pointOnRay(ray, t);\n const s = c > 0 ? dot(sub(onRay, origin), v) / c : 0;\n return { onRay, onLine: add(origin, scale(v, s)), t, s };\n}\n","/**\n * The port-curve rule one dimension up, in `Vec3`. The rule itself lives in\n * `../portCurve`, stated once over components — this wrapper is types and\n * nothing else, so 2D and 3D cannot disagree about what the curve is.\n */\n\nimport {\n PORT_REACH,\n cubicAt as cubicAtN,\n portControls as portControlsN,\n portCurvePoints as portCurvePointsN,\n} from '../portCurve';\nimport type { Vec3 } from './vec3';\n\nexport { PORT_REACH };\n\nconst comps = (v: Vec3): [number, number, number] => [v.x, v.y, v.z];\nconst compsOrNull = (v: Vec3 | null | undefined) => (v == null ? v : comps(v));\nconst fromComps = (p: readonly number[]): Vec3 => ({ x: p[0]!, y: p[1]!, z: p[2]! });\n\n/** `[c1, c2]` for the cubic from `a` to `b`. A null normal falls back to a lerp\n * along the chord; see `../portCurve` for why the two ends differ. */\nexport function portControls(\n a: Vec3,\n b: Vec3,\n outNormal: Vec3 | null | undefined,\n inNormal: Vec3 | null | undefined,\n reach: number = PORT_REACH,\n): [Vec3, Vec3] {\n const [c1, c2] = portControlsN(\n comps(a),\n comps(b),\n compsOrNull(outNormal),\n compsOrNull(inNormal),\n reach,\n );\n return [fromComps(c1), fromComps(c2)];\n}\n\n/** A port curve sampled into `samples` points, excluding its start. */\nexport function portCurvePoints(\n a: Vec3,\n b: Vec3,\n outNormal: Vec3 | null | undefined,\n inNormal: Vec3 | null | undefined,\n samples: number,\n reach: number = PORT_REACH,\n): Vec3[] {\n return portCurvePointsN(\n comps(a),\n comps(b),\n compsOrNull(outNormal),\n compsOrNull(inNormal),\n samples,\n reach,\n ).map(fromComps);\n}\n\n/** A cubic evaluated at `t`. The 2D barrel's `cubicEvalAt`, one dimension up. */\nexport function cubicAt(p0: Vec3, p1: Vec3, p2: Vec3, p3: Vec3, t: number): Vec3 {\n const p = cubicAtN(comps(p0), comps(p1), comps(p2), comps(p3), t);\n return fromComps(p);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/3d/vec3.ts","../../src/3d/mat4.ts","../../src/3d/ray3.ts","../../src/3d/portCurve3.ts","../../src/3d/along3.ts"],"names":["lerp","scale","closestPointOnSegment","portControls","portCurvePoints","cubicAt","fromComps"],"mappings":"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","file":"index.js","sourcesContent":["/** Three-component vectors and unit quaternions. `Vec3`'s fields are readonly:\n * a pose stored in a history snapshot must not be writable through the value\n * handed to a renderer.\n *\n * Named fields rather than a tuple, matching `Vec2` one tier up, so a\n * consumer writing both dimensions says `p.x` in each. `Quat` stays a tuple —\n * it is not a point, and `[x, y, z, w]` is the layout three.js and glMatrix\n * both use. */\n\nimport { lerp as lerpScalar } from '../scalar';\n\n/** A point or direction in 3D. */\nexport interface Vec3 {\n readonly x: number;\n readonly y: number;\n readonly z: number;\n}\n\n/** `[x, y, z, w]`, w last — the layout three.js and glMatrix both use. */\nexport type Quat = readonly [number, number, number, number];\n\n/** `a + b`. */\nexport function add(a: Vec3, b: Vec3): Vec3 {\n return { x: a.x + b.x, y: a.y + b.y, z: a.z + b.z };\n}\n\n/** `a - b`. */\nexport function sub(a: Vec3, b: Vec3): Vec3 {\n return { x: a.x - b.x, y: a.y - b.y, z: a.z - b.z };\n}\n\n/** `a` multiplied by the scalar `k`. */\nexport function scale(a: Vec3, k: number): Vec3 {\n return { x: a.x * k, y: a.y * k, z: a.z * k };\n}\n\n/** Dot product. */\nexport function dot(a: Vec3, b: Vec3): number {\n return a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\n/** Cross product `a × b`. */\nexport function cross(a: Vec3, b: Vec3): Vec3 {\n return {\n x: a.y * b.z - a.z * b.y,\n y: a.z * b.x - a.x * b.z,\n z: a.x * b.y - a.y * b.x,\n };\n}\n\n/** Squared length. Compare distances with this and skip the square root. */\nexport function len2(a: Vec3): number {\n return dot(a, a);\n}\n\n/** Euclidean length. */\nexport function len(a: Vec3): number {\n return Math.sqrt(len2(a));\n}\n\n/** A vector with no length, or no finite one, normalizes to the zero vector\n * rather than to `NaN`. Every other vector keeps its direction, however short. */\nexport function normalize(a: Vec3): Vec3 {\n const l = len(a);\n return l > 0 && l < Infinity ? scale(a, 1 / l) : { x: 0, y: 0, z: 0 };\n}\n\n/** Euclidean distance between two points. */\nexport function distance(a: Vec3, b: Vec3): number {\n return len(sub(a, b));\n}\n\n/** The point `t` of the way from `a` to `b`; `t` outside [0, 1] extrapolates. */\nexport function lerp(a: Vec3, b: Vec3, t: number): Vec3 {\n return { x: lerpScalar(a.x, b.x, t), y: lerpScalar(a.y, b.y, t), z: lerpScalar(a.z, b.z, t) };\n}\n\n/** `Vec3` from loose components — the shape `Mat4`'s row math produces. */\nexport function vec3(x: number, y: number, z: number): Vec3 {\n return { x, y, z };\n}\n\n/** The quaternion for no rotation, `[0, 0, 0, 1]`. */\nexport function quatIdentity(): Quat {\n return [0, 0, 0, 1];\n}\n\n/** Rotation by `angle` radians about `axis`, which must be nonzero but need\n * not be unit length. */\nexport function quatFromAxisAngle(axis: Vec3, angle: number): Quat {\n const a = normalize(axis);\n const half = angle / 2;\n const s = Math.sin(half);\n return [a.x * s, a.y * s, a.z * s, Math.cos(half)];\n}\n\n/** The rotation `a` after `b`: `quatRotate(quatMultiply(a, b), v)` is\n * `quatRotate(a, quatRotate(b, v))`. */\nexport function quatMultiply(a: Quat, b: Quat): Quat {\n const [ax, ay, az, aw] = a;\n const [bx, by, bz, bw] = b;\n return [\n aw * bx + ax * bw + ay * bz - az * by,\n aw * by - ax * bz + ay * bw + az * bx,\n aw * bz + ax * by - ay * bx + az * bw,\n aw * bw - ax * bx - ay * by - az * bz,\n ];\n}\n\n/** The inverse of a unit quaternion: the same rotation undone. */\nexport function quatConjugate(q: Quat): Quat {\n return [-q[0], -q[1], -q[2], q[3]];\n}\n\n/** `v` rotated by the unit quaternion `q`. */\nexport function quatRotate(q: Quat, v: Vec3): Vec3 {\n const [x, y, z, w] = q;\n const tx = 2 * (y * v.z - z * v.y);\n const ty = 2 * (z * v.x - x * v.z);\n const tz = 2 * (x * v.y - y * v.x);\n return {\n x: v.x + w * tx + (y * tz - z * ty),\n y: v.y + w * ty + (z * tx - x * tz),\n z: v.z + w * tz + (x * ty - y * tx),\n };\n}\n","/** 4x4 matrices in GL's column-major order: element (row `r`, column `c`) is\n * `m[c * 4 + r]`, which is the layout `gl.uniformMatrix4fv` reads without a\n * transpose and the one three.js `toArray()` emits. */\n\nimport { SINGULAR_RATIO } from '../scalar';\nimport { cross, dot, len, normalize, sub, vec3, type Quat, type Vec3 } from './vec3';\n\n/** 16 numbers, column-major. */\nexport type Mat4 = readonly number[];\n\n/** The identity matrix. */\nexport function identity(): Mat4 {\n return [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];\n}\n\n/** The product `a · b`: applied to a point, `b` acts first. */\nexport function multiply(a: Mat4, b: Mat4): Mat4 {\n const out = new Array<number>(16);\n for (let c = 0; c < 4; c++) {\n for (let r = 0; r < 4; r++) {\n let sum = 0;\n for (let k = 0; k < 4; k++) sum += a[k * 4 + r] * b[c * 4 + k];\n out[c * 4 + r] = sum;\n }\n }\n return out;\n}\n\n/** `[x, y, z, w]` in whatever space `m` maps into — clip space, when `m` is a view-projection. */\nexport function transformPoint4(\n m: Mat4,\n p: Vec3,\n): readonly [number, number, number, number] {\n const { x, y, z } = p;\n return [\n m[0] * x + m[4] * y + m[8] * z + m[12],\n m[1] * x + m[5] * y + m[9] * z + m[13],\n m[2] * x + m[6] * y + m[10] * z + m[14],\n m[3] * x + m[7] * y + m[11] * z + m[15],\n ];\n}\n\n/** `transformPoint4` divided through by w, however small. A point on the eye\n * plane (w = 0) comes back non-finite. */\nexport function transformPoint(m: Mat4, p: Vec3): Vec3 {\n const [x, y, z, w] = transformPoint4(m, p);\n if (w === 1) return vec3(x, y, z);\n return vec3(x / w, y / w, z / w);\n}\n\n/** Inverse, or null when the matrix is singular, non-finite, or too\n * ill-conditioned to invert meaningfully at its own scale. */\nexport function invert(m: Mat4): Mat4 | null {\n const [\n m00, m01, m02, m03,\n m10, m11, m12, m13,\n m20, m21, m22, m23,\n m30, m31, m32, m33,\n ] = m;\n\n const b00 = m00 * m11 - m01 * m10;\n const b01 = m00 * m12 - m02 * m10;\n const b02 = m00 * m13 - m03 * m10;\n const b03 = m01 * m12 - m02 * m11;\n const b04 = m01 * m13 - m03 * m11;\n const b05 = m02 * m13 - m03 * m12;\n const b06 = m20 * m31 - m21 * m30;\n const b07 = m20 * m32 - m22 * m30;\n const b08 = m20 * m33 - m23 * m30;\n const b09 = m21 * m32 - m22 * m31;\n const b10 = m21 * m33 - m23 * m31;\n const b11 = m22 * m33 - m23 * m32;\n\n const det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n // Hadamard: |det| never exceeds the product of the column lengths, so the\n // ratio is a volume in [0, 1] that no per-column scale can shrink.\n const scale =\n Math.sqrt(m00 * m00 + m01 * m01 + m02 * m02 + m03 * m03) *\n Math.sqrt(m10 * m10 + m11 * m11 + m12 * m12 + m13 * m13) *\n Math.sqrt(m20 * m20 + m21 * m21 + m22 * m22 + m23 * m23) *\n Math.sqrt(m30 * m30 + m31 * m31 + m32 * m32 + m33 * m33);\n // Negated so a non-finite determinant falls out as singular.\n if (!(Math.abs(det) > SINGULAR_RATIO * scale)) return null;\n const d = 1 / det;\n\n return [\n (m11 * b11 - m12 * b10 + m13 * b09) * d,\n (m02 * b10 - m01 * b11 - m03 * b09) * d,\n (m31 * b05 - m32 * b04 + m33 * b03) * d,\n (m22 * b04 - m21 * b05 - m23 * b03) * d,\n (m12 * b08 - m10 * b11 - m13 * b07) * d,\n (m00 * b11 - m02 * b08 + m03 * b07) * d,\n (m32 * b02 - m30 * b05 - m33 * b01) * d,\n (m20 * b05 - m22 * b02 + m23 * b01) * d,\n (m10 * b10 - m11 * b08 + m13 * b06) * d,\n (m01 * b08 - m00 * b10 - m03 * b06) * d,\n (m30 * b04 - m31 * b02 + m33 * b00) * d,\n (m21 * b02 - m20 * b04 - m23 * b00) * d,\n (m11 * b07 - m10 * b09 - m12 * b06) * d,\n (m00 * b09 - m01 * b07 + m02 * b06) * d,\n (m31 * b01 - m30 * b03 - m32 * b00) * d,\n (m20 * b03 - m21 * b01 + m22 * b00) * d,\n ];\n}\n\n/** Translation · rotation · scale: the matrix that scales a point, then\n * rotates it, then moves it by `position`. */\nexport function compose(position: Vec3, rotation: Quat, scaling: Vec3): Mat4 {\n const [x, y, z, w] = rotation;\n const x2 = x + x;\n const y2 = y + y;\n const z2 = z + z;\n const xx = x * x2;\n const xy = x * y2;\n const xz = x * z2;\n const yy = y * y2;\n const yz = y * z2;\n const zz = z * z2;\n const wx = w * x2;\n const wy = w * y2;\n const wz = w * z2;\n const { x: sx, y: sy, z: sz } = scaling;\n\n return [\n (1 - (yy + zz)) * sx, (xy + wz) * sx, (xz - wy) * sx, 0,\n (xy - wz) * sy, (1 - (xx + zz)) * sy, (yz + wx) * sy, 0,\n (xz + wy) * sz, (yz - wx) * sz, (1 - (xx + yy)) * sz, 0,\n position.x, position.y, position.z, 1,\n ];\n}\n\n/** A GL-convention projection: vertical field of view `fovY` in radians, the\n * camera looking down −z, and `near`..`far` mapped to clip z −1..1. */\nexport function perspective(fovY: number, aspect: number, near: number, far: number): Mat4 {\n const f = 1 / Math.tan(fovY / 2);\n const range = near - far;\n return [\n f / aspect, 0, 0, 0,\n 0, f, 0, 0,\n 0, 0, (far + near) / range, -1,\n 0, 0, (2 * far * near) / range, 0,\n ];\n}\n\n/** A view from `eye` toward `target`. With the eye on its target, or `up`\n * parallel to the view to within rounding, the view has no orientation and\n * the result is singular. */\nexport function lookAt(eye: Vec3, target: Vec3, up: Vec3): Mat4 {\n const back = normalize(sub(eye, target));\n const side = cross(up, back);\n // |side| is |up| times the sine of the angle between up and the view.\n const right = len(side) > SINGULAR_RATIO * len(up) ? normalize(side) : vec3(0, 0, 0);\n const trueUp = cross(back, right);\n return [\n right.x, trueUp.x, back.x, 0,\n right.y, trueUp.y, back.y, 0,\n right.z, trueUp.z, back.z, 0,\n -dot(right, eye), -dot(trueUp, eye), -dot(back, eye), 1,\n ];\n}\n","/** Rays, axis-aligned boxes, and the intersections picking is built from. */\n\nimport { closestPointOnSegment as closestPointOnSegmentN } from '../points';\nimport { SINGULAR_RATIO } from '../scalar';\nimport { add, dot, len, len2, scale, sub, type Vec3 } from './vec3';\nimport { transformPoint, type Mat4 } from './mat4';\n\n/** A ray from `origin` along `direction`, which need not be unit length: the\n * `t` the intersections return is in multiples of it. */\nexport interface Ray {\n origin: Vec3;\n direction: Vec3;\n}\n\n/** An axis-aligned box. `min` is componentwise <= `max`. */\nexport interface Aabb {\n min: Vec3;\n max: Vec3;\n}\n\n/** Distance along the ray to the box, or null. A ray starting inside returns 0. */\nexport function intersectRayAabb(ray: Ray, min: Vec3, max: Vec3): number | null {\n let tMin = Number.NEGATIVE_INFINITY;\n let tMax = Number.POSITIVE_INFINITY;\n\n for (const axis of ['x', 'y', 'z'] as const) {\n const o = ray.origin[axis];\n const d = ray.direction[axis];\n // Any other direction, however short, divides to an honest (possibly infinite) t.\n if (d === 0) {\n if (o < min[axis] || o > max[axis]) return null;\n continue;\n }\n let t1 = (min[axis] - o) / d;\n let t2 = (max[axis] - o) / d;\n if (t1 > t2) [t1, t2] = [t2, t1];\n if (t1 > tMin) tMin = t1;\n if (t2 < tMax) tMax = t2;\n if (tMin > tMax) return null;\n }\n\n if (tMax < 0) return null;\n return tMin < 0 ? 0 : tMin;\n}\n\n/** Plane is `dot(normal, p) === offset`. Null when the ray runs parallel to the\n * plane to within rounding, or points away from it. */\nexport function intersectRayPlane(ray: Ray, normal: Vec3, offset: number): number | null {\n const denom = dot(normal, ray.direction);\n if (!(Math.abs(denom) > SINGULAR_RATIO * len(normal) * len(ray.direction))) return null;\n const t = (offset - dot(normal, ray.origin)) / denom;\n return t < 0 ? null : t;\n}\n\n/**\n * The axis-aligned box enclosing `local` after `m`. All eight corners are\n * transformed and re-bounded, so a rotation widens the result rather than\n * rotating it — an AABB cannot represent an oriented box, and pretending\n * otherwise is how a hit test starts missing its own geometry.\n */\nexport function transformAabb(m: Mat4, local: Aabb): Aabb {\n let min: Vec3 = { x: Infinity, y: Infinity, z: Infinity };\n let max: Vec3 = { x: -Infinity, y: -Infinity, z: -Infinity };\n for (let i = 0; i < 8; i++) {\n const corner: Vec3 = {\n x: i & 1 ? local.max.x : local.min.x,\n y: i & 2 ? local.max.y : local.min.y,\n z: i & 4 ? local.max.z : local.min.z,\n };\n const p = transformPoint(m, corner);\n min = { x: Math.min(min.x, p.x), y: Math.min(min.y, p.y), z: Math.min(min.z, p.z) };\n max = { x: Math.max(max.x, p.x), y: Math.max(max.y, p.y), z: Math.max(max.z, p.z) };\n }\n return { min, max };\n}\n\n/** The box centred on `center` reaching `radius` along every axis. */\nexport function aabbAround(center: Vec3, radius: number): Aabb {\n return {\n min: { x: center.x - radius, y: center.y - radius, z: center.z - radius },\n max: { x: center.x + radius, y: center.y + radius, z: center.z + radius },\n };\n}\n\n/** The point `t` direction-lengths along the ray. */\nexport function pointOnRay(ray: Ray, t: number): Vec3 {\n return add(ray.origin, scale(ray.direction, t));\n}\n\n/** The smallest box containing every point. No points gives an inverted\n * box, `min` at +Infinity and `max` at -Infinity. */\nexport function aabbOfPoints(points: readonly Vec3[]): Aabb {\n const min = { x: Infinity, y: Infinity, z: Infinity };\n const max = { x: -Infinity, y: -Infinity, z: -Infinity };\n for (const p of points) {\n for (const axis of ['x', 'y', 'z'] as const) {\n if (p[axis] < min[axis]) min[axis] = p[axis];\n if (p[axis] > max[axis]) max[axis] = p[axis];\n }\n }\n return { min, max };\n}\n\n/** The point of the infinite line through `origin` along `direction` nearest\n * `p`. A zero direction makes the line the point `origin`. */\nexport function closestPointOnLine(p: Vec3, origin: Vec3, direction: Vec3): Vec3 {\n const d2 = len2(direction);\n if (!(d2 > 0)) return origin;\n return add(origin, scale(direction, dot(sub(p, origin), direction) / d2));\n}\n\n/** The point of segment `a`–`b` nearest `p`; `a` when the segment has no\n * length. The rule is `../points`', stated once for every dimension. */\nexport function closestPointOnSegment(p: Vec3, a: Vec3, b: Vec3): Vec3 {\n const [x, y, z] = closestPointOnSegmentN([p.x, p.y, p.z], [a.x, a.y, a.z], [b.x, b.y, b.z]);\n return { x: x!, y: y!, z: z! };\n}\n\n/**\n * The nearest pair of points between a ray and the infinite line through\n * `origin` along `direction`. `t` is the ray parameter (never negative) and\n * `s` the line's. A line parallel to the ray pairs with the ray's origin.\n */\nexport function closestPointsRayLine(\n ray: Ray,\n origin: Vec3,\n direction: Vec3,\n): { onRay: Vec3; onLine: Vec3; t: number; s: number } {\n const u = ray.direction;\n const v = direction;\n const w = sub(ray.origin, origin);\n const a = len2(u);\n const b = dot(u, v);\n const c = len2(v);\n const d = dot(u, w);\n const e = dot(v, w);\n const denom = a * c - b * b;\n let t = 0;\n if (a > 0 && denom > SINGULAR_RATIO * a * c) t = Math.max(0, (b * e - c * d) / denom);\n const onRay = pointOnRay(ray, t);\n const s = c > 0 ? dot(sub(onRay, origin), v) / c : 0;\n return { onRay, onLine: add(origin, scale(v, s)), t, s };\n}\n","/**\n * The port-curve rule one dimension up, in `Vec3`. The rule itself lives in\n * `../portCurve`, stated once over components — this wrapper is types and\n * nothing else, so 2D and 3D cannot disagree about what the curve is.\n */\n\nimport {\n PORT_REACH,\n cubicAt as cubicAtN,\n portControls as portControlsN,\n portCurvePoints as portCurvePointsN,\n} from '../portCurve';\nimport type { Vec3 } from './vec3';\n\nexport { PORT_REACH };\n\nconst comps = (v: Vec3): [number, number, number] => [v.x, v.y, v.z];\nconst compsOrNull = (v: Vec3 | null | undefined) => (v == null ? v : comps(v));\nconst fromComps = (p: readonly number[]): Vec3 => ({ x: p[0]!, y: p[1]!, z: p[2]! });\n\n/** `[c1, c2]` for the cubic from `a` to `b`. A null normal falls back to a lerp\n * along the chord; see `../portCurve` for why the two ends differ. */\nexport function portControls(\n a: Vec3,\n b: Vec3,\n outNormal: Vec3 | null | undefined,\n inNormal: Vec3 | null | undefined,\n reach: number = PORT_REACH,\n): [Vec3, Vec3] {\n const [c1, c2] = portControlsN(\n comps(a),\n comps(b),\n compsOrNull(outNormal),\n compsOrNull(inNormal),\n reach,\n );\n return [fromComps(c1), fromComps(c2)];\n}\n\n/** A port curve sampled into `samples` points, excluding its start. */\nexport function portCurvePoints(\n a: Vec3,\n b: Vec3,\n outNormal: Vec3 | null | undefined,\n inNormal: Vec3 | null | undefined,\n samples: number,\n reach: number = PORT_REACH,\n): Vec3[] {\n return portCurvePointsN(\n comps(a),\n comps(b),\n compsOrNull(outNormal),\n compsOrNull(inNormal),\n samples,\n reach,\n ).map(fromComps);\n}\n\n/** A cubic evaluated at `t`. The 2D barrel's `cubicEvalAt`, one dimension up. */\nexport function cubicAt(p0: Vec3, p1: Vec3, p2: Vec3, p3: Vec3, t: number): Vec3 {\n const p = cubicAtN(comps(p0), comps(p1), comps(p2), comps(p3), t);\n return fromComps(p);\n}\n","/**\n * Length-table queries one dimension up, in `Vec3`. The table and its math\n * live in `../along`, stated over components; this wrapper is types only.\n */\n\nimport type { LengthTable } from '../along/lengthTable';\nimport { pointAtLength } from '../along/positions';\nimport type { Vec3 } from './vec3';\n\nconst fromComps = (p: readonly number[]): Vec3 => ({ x: p[0]!, y: p[1]!, z: p[2]! });\n\n/** The point at pen-order length `s` and the unit tangent there; see the root barrel's `pointAtLength`. */\nexport function pointAtLength3(t: LengthTable, s: number): { point: Vec3; tangent: Vec3 } {\n const { point, tangent } = pointAtLength(t, s);\n return { point: fromComps(point), tangent: fromComps(tangent) };\n}\n"]}
|
package/dist/booleans/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { orientBoundaries, parseContours, toPath, contoursIntersect, assembleRegions, signedArea, negligibleArea, regionArea, parseSubpaths, writePath, signChanges, sideCoeffs, evalSeg, extentOf, keepCorners, windingAt, reverseContour, sampleContour, subSeg, endSide, intersectSegments, derivSeg } from '../chunk-
|
|
2
|
-
import {
|
|
3
|
-
import
|
|
4
|
-
import '../chunk-
|
|
5
|
-
import
|
|
1
|
+
import { orientBoundaries, parseContours, toPath, contoursIntersect, assembleRegions, signedArea, negligibleArea, regionArea, parseSubpaths, writePath, signChanges, sideCoeffs, evalSeg, extentOf, keepCorners, windingAt, reverseContour, sampleContour, subSeg, endSide, intersectSegments, derivSeg } from '../chunk-OBPXEPUH.js';
|
|
2
|
+
import { resolveCorners, DEFAULT_FLATTEN_TOLERANCE, fillsOpenSubpaths, flattenCubic, flattenQuadratic, pointInPolygon } from '../chunk-TBS4NHGQ.js';
|
|
3
|
+
import '../chunk-IOD2NFHQ.js';
|
|
4
|
+
import { worldCoords, PATH_Z, PATH_Q, elevateQuadraticToCubic, PATH_C, PATH_L, PATH_M, originFor, coordsFrom, nearestOnLine, nearestOnQuadratic, nearestOnCubic } from '../chunk-346XYYMX.js';
|
|
5
|
+
import '../chunk-DNX24KBT.js';
|
|
6
6
|
import polygonClipping from 'polygon-clipping';
|
|
7
7
|
|
|
8
8
|
// src/booleans/adapter.ts
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { lerp, segmentTFrom } from './chunk-DNX24KBT.js';
|
|
2
|
+
|
|
1
3
|
// src/box.ts
|
|
2
4
|
function boundsOfCoords(coords) {
|
|
3
5
|
if (coords.length < 2) return null;
|
|
@@ -28,6 +30,33 @@ function boxContainsBox(outer, inner) {
|
|
|
28
30
|
function rectToContour(x, y, w, h) {
|
|
29
31
|
return Float64Array.of(x, y, x + w, y, x + w, y + h, x, y + h);
|
|
30
32
|
}
|
|
33
|
+
function boxesIntersect(a, b) {
|
|
34
|
+
return a[0] <= b[2] && b[0] <= a[2] && a[1] <= b[3] && b[1] <= a[3];
|
|
35
|
+
}
|
|
36
|
+
function rectsOverlap(a, b) {
|
|
37
|
+
return a.x < b.x + b.width && b.x < a.x + a.width && a.y < b.y + b.height && b.y < a.y + a.height;
|
|
38
|
+
}
|
|
39
|
+
function rectsIntersect(a, b) {
|
|
40
|
+
return a.x <= b.x + b.width && b.x <= a.x + a.width && a.y <= b.y + b.height && b.y <= a.y + a.height;
|
|
41
|
+
}
|
|
42
|
+
function rectContainsPoint(r, x, y) {
|
|
43
|
+
return x >= r.x && x <= r.x + r.width && y >= r.y && y <= r.y + r.height;
|
|
44
|
+
}
|
|
45
|
+
function rectContainsPointHalfOpen(r, x, y) {
|
|
46
|
+
return x >= r.x && x < r.x + r.width && y >= r.y && y < r.y + r.height;
|
|
47
|
+
}
|
|
48
|
+
function unionRects(rects) {
|
|
49
|
+
let minX = Infinity, minY = Infinity, maxX = -Infinity, maxY = -Infinity;
|
|
50
|
+
let any = false;
|
|
51
|
+
for (const r of rects) {
|
|
52
|
+
any = true;
|
|
53
|
+
minX = Math.min(minX, r.x);
|
|
54
|
+
minY = Math.min(minY, r.y);
|
|
55
|
+
maxX = Math.max(maxX, r.x + r.width);
|
|
56
|
+
maxY = Math.max(maxY, r.y + r.height);
|
|
57
|
+
}
|
|
58
|
+
return any ? { x: minX, y: minY, width: maxX - minX, height: maxY - minY } : null;
|
|
59
|
+
}
|
|
31
60
|
|
|
32
61
|
// src/commands.ts
|
|
33
62
|
var PATH_COMMANDS = {
|
|
@@ -165,6 +194,128 @@ function splitLineAt(x0, y0, x1, y1, t) {
|
|
|
165
194
|
return [[x0, y0, mx, my], [mx, my, x1, y1]];
|
|
166
195
|
}
|
|
167
196
|
|
|
197
|
+
// src/points2.ts
|
|
198
|
+
function distance2(a, b) {
|
|
199
|
+
const dx = a.x - b.x;
|
|
200
|
+
const dy = a.y - b.y;
|
|
201
|
+
return dx * dx + dy * dy;
|
|
202
|
+
}
|
|
203
|
+
function distance(a, b) {
|
|
204
|
+
return Math.sqrt(distance2(a, b));
|
|
205
|
+
}
|
|
206
|
+
function lerpPoint(a, b, t) {
|
|
207
|
+
return { x: lerp(a.x, b.x, t), y: lerp(a.y, b.y, t) };
|
|
208
|
+
}
|
|
209
|
+
function segmentT(px, py, ax, ay, bx, by) {
|
|
210
|
+
const vx = bx - ax, vy = by - ay;
|
|
211
|
+
return segmentTFrom((px - ax) * vx + (py - ay) * vy, vx * vx + vy * vy);
|
|
212
|
+
}
|
|
213
|
+
function pointSegmentDist2(px, py, ax, ay, bx, by) {
|
|
214
|
+
const t = segmentT(px, py, ax, ay, bx, by);
|
|
215
|
+
const dx = px - (t === 1 ? bx : lerp(ax, bx, t));
|
|
216
|
+
const dy = py - (t === 1 ? by : lerp(ay, by, t));
|
|
217
|
+
return dx * dx + dy * dy;
|
|
218
|
+
}
|
|
219
|
+
function pointSegmentDist(px, py, ax, ay, bx, by) {
|
|
220
|
+
return Math.sqrt(pointSegmentDist2(px, py, ax, ay, bx, by));
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// src/nearest.ts
|
|
224
|
+
function nearestOnLine(px, py, x0, y0, x1, y1) {
|
|
225
|
+
const t = segmentT(px, py, x0, y0, x1, y1);
|
|
226
|
+
const x = t === 1 ? x1 : lerp(x0, x1, t);
|
|
227
|
+
const y = t === 1 ? y1 : lerp(y0, y1, t);
|
|
228
|
+
return { x, y, t, dist: Math.sqrt((px - x) * (px - x) + (py - y) * (py - y)) };
|
|
229
|
+
}
|
|
230
|
+
var CUBIC_SAMPLES = 32;
|
|
231
|
+
var REFINE_ITERS = 40;
|
|
232
|
+
var T_EPS = 1e-14;
|
|
233
|
+
function nearestOnCubic(px, py, x0, y0, x1, y1, x2, y2, x3, y3) {
|
|
234
|
+
const ax = -x0 + 3 * x1 - 3 * x2 + x3, ay = -y0 + 3 * y1 - 3 * y2 + y3;
|
|
235
|
+
const bx = 3 * x0 - 6 * x1 + 3 * x2, by = 3 * y0 - 6 * y1 + 3 * y2;
|
|
236
|
+
const cx = 3 * (x1 - x0), cy = 3 * (y1 - y0);
|
|
237
|
+
const d2At = (t) => {
|
|
238
|
+
const [x4, y4] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, t);
|
|
239
|
+
return (x4 - px) ** 2 + (y4 - py) ** 2;
|
|
240
|
+
};
|
|
241
|
+
const d2s = [];
|
|
242
|
+
for (let k = 0; k <= CUBIC_SAMPLES; k++) d2s.push(d2At(k / CUBIC_SAMPLES));
|
|
243
|
+
let bestT = 0, bestD2 = d2s[0];
|
|
244
|
+
for (let k = 0; k <= CUBIC_SAMPLES; k++) {
|
|
245
|
+
const d = d2s[k];
|
|
246
|
+
const prev = k > 0 ? d2s[k - 1] : Infinity;
|
|
247
|
+
const next = k < CUBIC_SAMPLES ? d2s[k + 1] : Infinity;
|
|
248
|
+
if (!(d <= prev && d <= next)) continue;
|
|
249
|
+
let lo = Math.max(0, (k - 1) / CUBIC_SAMPLES);
|
|
250
|
+
let hi = Math.min(1, (k + 1) / CUBIC_SAMPLES);
|
|
251
|
+
let t = k / CUBIC_SAMPLES;
|
|
252
|
+
for (let i = 0; i < REFINE_ITERS; i++) {
|
|
253
|
+
const t2 = t * t;
|
|
254
|
+
const ex = ax * t2 * t + bx * t2 + cx * t + x0 - px;
|
|
255
|
+
const ey = ay * t2 * t + by * t2 + cy * t + y0 - py;
|
|
256
|
+
const dx = 3 * ax * t2 + 2 * bx * t + cx, dy = 3 * ay * t2 + 2 * by * t + cy;
|
|
257
|
+
const ddx = 6 * ax * t + 2 * bx, ddy = 6 * ay * t + 2 * by;
|
|
258
|
+
const g = ex * dx + ey * dy;
|
|
259
|
+
const gp = dx * dx + dy * dy + ex * ddx + ey * ddy;
|
|
260
|
+
if (g > 0) hi = t;
|
|
261
|
+
else if (g < 0) lo = t;
|
|
262
|
+
else break;
|
|
263
|
+
let tn = gp > 0 ? t - g / gp : NaN;
|
|
264
|
+
if (!(tn > lo && tn < hi)) tn = (lo + hi) / 2;
|
|
265
|
+
const step = Math.abs(tn - t);
|
|
266
|
+
t = tn;
|
|
267
|
+
if (step < T_EPS || hi - lo < T_EPS) break;
|
|
268
|
+
}
|
|
269
|
+
const refined = d2At(t);
|
|
270
|
+
const [tk, dk] = refined <= d ? [t, refined] : [k / CUBIC_SAMPLES, d];
|
|
271
|
+
if (dk < bestD2) {
|
|
272
|
+
bestD2 = dk;
|
|
273
|
+
bestT = tk;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
const [x, y] = cubicEvalAt(x0, y0, x1, y1, x2, y2, x3, y3, bestT);
|
|
277
|
+
return { x, y, t: bestT, dist: Math.hypot(x - px, y - py) };
|
|
278
|
+
}
|
|
279
|
+
function nearestOnQuadratic(px, py, x0, y0, x1, y1, x2, y2) {
|
|
280
|
+
const [c1x, c1y, c2x, c2y] = elevateQuadraticToCubic(x0, y0, x1, y1, x2, y2);
|
|
281
|
+
return nearestOnCubic(px, py, x0, y0, c1x, c1y, c2x, c2y, x2, y2);
|
|
282
|
+
}
|
|
283
|
+
function nearestOnPath(commands, coords, px, py) {
|
|
284
|
+
let best = null;
|
|
285
|
+
let startX = 0, startY = 0;
|
|
286
|
+
forEachSegment(commands, coords, (cmd, ci, x0, y0, commandIndex) => {
|
|
287
|
+
let hit;
|
|
288
|
+
if (cmd === PATH_M) {
|
|
289
|
+
startX = coords[ci];
|
|
290
|
+
startY = coords[ci + 1];
|
|
291
|
+
return;
|
|
292
|
+
} else if (cmd === PATH_L) {
|
|
293
|
+
hit = nearestOnLine(px, py, x0, y0, coords[ci], coords[ci + 1]);
|
|
294
|
+
} else if (cmd === PATH_Q) {
|
|
295
|
+
hit = nearestOnQuadratic(px, py, x0, y0, coords[ci], coords[ci + 1], coords[ci + 2], coords[ci + 3]);
|
|
296
|
+
} else if (cmd === PATH_C) {
|
|
297
|
+
hit = nearestOnCubic(
|
|
298
|
+
px,
|
|
299
|
+
py,
|
|
300
|
+
x0,
|
|
301
|
+
y0,
|
|
302
|
+
coords[ci],
|
|
303
|
+
coords[ci + 1],
|
|
304
|
+
coords[ci + 2],
|
|
305
|
+
coords[ci + 3],
|
|
306
|
+
coords[ci + 4],
|
|
307
|
+
coords[ci + 5]
|
|
308
|
+
);
|
|
309
|
+
} else if (cmd === PATH_Z) {
|
|
310
|
+
hit = nearestOnLine(px, py, x0, y0, startX, startY);
|
|
311
|
+
} else {
|
|
312
|
+
throw new Error(`nearestOnPath: unknown command code ${cmd}`);
|
|
313
|
+
}
|
|
314
|
+
if (best === null || hit.dist < best.dist) best = { ...hit, commandIndex, coordIndex: ci };
|
|
315
|
+
});
|
|
316
|
+
return best;
|
|
317
|
+
}
|
|
318
|
+
|
|
168
319
|
// src/paths/pathOrigin.ts
|
|
169
320
|
var ZERO = Object.freeze({ x: 0, y: 0 });
|
|
170
321
|
function originOf(path) {
|
|
@@ -483,6 +634,6 @@ function splitCubicAtT(p0, p1, p2, p3, t) {
|
|
|
483
634
|
return { left: quad(l), right: quad(r) };
|
|
484
635
|
}
|
|
485
636
|
|
|
486
|
-
export { ORIGIN_THRESHOLD, PATH_C, PATH_CMD_LENGTHS, PATH_COMMANDS, PATH_L, PATH_M, PATH_Q, PATH_Z, PathBuilder, addOrigin, asPolygonPath, boundsOfCoords, boxContainsBox, boxContainsPoint, compactCorners, coordsFrom, cornerAt, cornerSpecAt, cubicAxisExtremaTs, cubicBounds, cubicEvalAt, cubicPointAt, elevateQuadraticToCubic, ellipsePath, forEachSegment, hasCorners, joinPaths, lerpCorners, linePath, originFor, originOf, pathCommandCoordCount, pathPoint, polygonFromPoints, polylineFromPoints, quadraticEvalAt, rectPath, rectToContour, regularPolygonPath, scaleCorners, splitCubicAt, splitCubicAtT, splitLineAt, splitQuadraticAt, starPath, unionBox, withCorner, withoutCorners, worldCoords };
|
|
487
|
-
//# sourceMappingURL=chunk-
|
|
488
|
-
//# sourceMappingURL=chunk-
|
|
637
|
+
export { ORIGIN_THRESHOLD, PATH_C, PATH_CMD_LENGTHS, PATH_COMMANDS, PATH_L, PATH_M, PATH_Q, PATH_Z, PathBuilder, addOrigin, asPolygonPath, boundsOfCoords, boxContainsBox, boxContainsPoint, boxesIntersect, compactCorners, coordsFrom, cornerAt, cornerSpecAt, cubicAxisExtremaTs, cubicBounds, cubicEvalAt, cubicPointAt, distance, distance2, elevateQuadraticToCubic, ellipsePath, forEachSegment, hasCorners, joinPaths, lerpCorners, lerpPoint, linePath, nearestOnCubic, nearestOnLine, nearestOnPath, nearestOnQuadratic, originFor, originOf, pathCommandCoordCount, pathPoint, pointSegmentDist, pointSegmentDist2, polygonFromPoints, polylineFromPoints, quadraticEvalAt, rectContainsPoint, rectContainsPointHalfOpen, rectPath, rectToContour, rectsIntersect, rectsOverlap, regularPolygonPath, scaleCorners, segmentT, splitCubicAt, splitCubicAtT, splitLineAt, splitQuadraticAt, starPath, unionBox, unionRects, withCorner, withoutCorners, worldCoords };
|
|
638
|
+
//# sourceMappingURL=chunk-346XYYMX.js.map
|
|
639
|
+
//# sourceMappingURL=chunk-346XYYMX.js.map
|