@weasel-js/geom 1.8.0 → 1.9.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/README.md +1 -0
- package/dist/3d/index.d.ts +1 -1
- package/dist/3d/index.js +7 -12
- package/dist/3d/index.js.map +1 -1
- package/dist/{chunk-TXEGHCJ4.js → chunk-YQADYJJ7.js} +9 -3
- package/dist/chunk-YQADYJJ7.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +7 -13
- package/dist/index.js.map +1 -1
- package/dist/nd/index.d.ts +30 -0
- package/dist/nd/index.js +3 -0
- package/dist/nd/index.js.map +1 -0
- package/package.json +5 -1
- package/dist/chunk-TXEGHCJ4.js.map +0 -1
- package/dist/portCurve-BBr7eHAL.d.ts +0 -15
package/README.md
CHANGED
|
@@ -9,6 +9,7 @@ Dependency-free core. Subpaths:
|
|
|
9
9
|
- `./tessellate` — fill tessellation, polylines and trimming; needs the optional peer `earcut`
|
|
10
10
|
- `./booleans` — polygon booleans and path splitting; needs the optional peer `polygon-clipping`
|
|
11
11
|
- `./3d` — vectors, quaternions, 4x4 matrices and ray intersection
|
|
12
|
+
- `./nd` — the port-curve rule (`portControls`, `portCurvePoints`, `PORT_REACH`) over plain number arrays, for any dimension
|
|
12
13
|
|
|
13
14
|
Part of [weasel](https://github.com/orochi235/weasel), a domain-agnostic 2D
|
|
14
15
|
scene-graph canvas kit for React. See the
|
package/dist/3d/index.d.ts
CHANGED
package/dist/3d/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PORT_REACH, portControls, cubicAt } from '../chunk-
|
|
2
|
-
export { PORT_REACH } from '../chunk-
|
|
1
|
+
import { PORT_REACH, portControls, portCurvePoints, cubicAt } from '../chunk-YQADYJJ7.js';
|
|
2
|
+
export { PORT_REACH } from '../chunk-YQADYJJ7.js';
|
|
3
3
|
import { SINGULAR_RATIO } from '../chunk-7ROQRYOA.js';
|
|
4
4
|
|
|
5
5
|
// src/3d/vec3.ts
|
|
@@ -272,26 +272,21 @@ function portControls2(a, b, outNormal, inNormal, reach = PORT_REACH) {
|
|
|
272
272
|
);
|
|
273
273
|
return [fromComps(c1), fromComps(c2)];
|
|
274
274
|
}
|
|
275
|
-
function
|
|
276
|
-
|
|
275
|
+
function portCurvePoints2(a, b, outNormal, inNormal, samples, reach = PORT_REACH) {
|
|
276
|
+
return portCurvePoints(
|
|
277
277
|
comps(a),
|
|
278
278
|
comps(b),
|
|
279
279
|
compsOrNull(outNormal),
|
|
280
280
|
compsOrNull(inNormal),
|
|
281
|
+
samples,
|
|
281
282
|
reach
|
|
282
|
-
);
|
|
283
|
-
const out = [];
|
|
284
|
-
for (let s = 1; s <= samples; s++) {
|
|
285
|
-
const p = cubicAt(comps(a), c1, c2, comps(b), s / samples);
|
|
286
|
-
out.push(fromComps(p));
|
|
287
|
-
}
|
|
288
|
-
return out;
|
|
283
|
+
).map(fromComps);
|
|
289
284
|
}
|
|
290
285
|
function cubicAt2(p0, p1, p2, p3, t) {
|
|
291
286
|
const p = cubicAt(comps(p0), comps(p1), comps(p2), comps(p3), t);
|
|
292
287
|
return fromComps(p);
|
|
293
288
|
}
|
|
294
289
|
|
|
295
|
-
export { aabbAround, add, compose, cross, cubicAt2 as cubicAt, dot, identity, intersectRayAabb, intersectRayPlane, invert, len, len2, lookAt, multiply, normalize, perspective, portControls2 as portControls, portCurvePoints, quatFromAxisAngle, quatIdentity, scale, sub, transformAabb, transformPoint, transformPoint4 };
|
|
290
|
+
export { aabbAround, add, compose, cross, cubicAt2 as cubicAt, dot, identity, intersectRayAabb, intersectRayPlane, invert, len, len2, lookAt, multiply, normalize, perspective, portControls2 as portControls, portCurvePoints2 as portCurvePoints, quatFromAxisAngle, quatIdentity, scale, sub, transformAabb, transformPoint, transformPoint4 };
|
|
296
291
|
//# sourceMappingURL=index.js.map
|
|
297
292
|
//# 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","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/** `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","/** 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 { dot, len, 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 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 { PORT_REACH, cubicAt as cubicAtN, portControls as portControlsN } 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 const [c1, c2] = portControlsN(\n comps(a),\n comps(b),\n compsOrNull(outNormal),\n compsOrNull(inNormal),\n reach,\n );\n const out: Vec3[] = [];\n for (let s = 1; s <= samples; s++) {\n const p = cubicAtN(comps(a), c1, c2, comps(b), s / samples);\n out.push(fromComps(p));\n }\n return out;\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"],"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/** `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","/** 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 { dot, len, 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 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"]}
|
|
@@ -17,6 +17,12 @@ function portControls(a, b, outNormal, inNormal, reach = PORT_REACH) {
|
|
|
17
17
|
}
|
|
18
18
|
return [c1, c2];
|
|
19
19
|
}
|
|
20
|
+
function portCurvePoints(a, b, outNormal, inNormal, samples, reach = PORT_REACH) {
|
|
21
|
+
const [c1, c2] = portControls(a, b, outNormal, inNormal, reach);
|
|
22
|
+
const out = [];
|
|
23
|
+
for (let s = 1; s <= samples; s++) out.push(cubicAt(a, c1, c2, b, s / samples));
|
|
24
|
+
return out;
|
|
25
|
+
}
|
|
20
26
|
function cubicAt(p0, p1, p2, p3, t) {
|
|
21
27
|
const u = 1 - t;
|
|
22
28
|
const a = u * u * u;
|
|
@@ -30,6 +36,6 @@ function cubicAt(p0, p1, p2, p3, t) {
|
|
|
30
36
|
return out;
|
|
31
37
|
}
|
|
32
38
|
|
|
33
|
-
export { PORT_REACH, cubicAt, portControls };
|
|
34
|
-
//# sourceMappingURL=chunk-
|
|
35
|
-
//# sourceMappingURL=chunk-
|
|
39
|
+
export { PORT_REACH, cubicAt, portControls, portCurvePoints };
|
|
40
|
+
//# sourceMappingURL=chunk-YQADYJJ7.js.map
|
|
41
|
+
//# sourceMappingURL=chunk-YQADYJJ7.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/portCurve.ts"],"names":[],"mappings":";AAcO,IAAM,UAAA,GAAa;AAWnB,SAAS,aACd,CAAA,EACA,CAAA,EACA,SAAA,EACA,QAAA,EACA,QAAgB,UAAA,EACM;AACtB,EAAA,IAAI,GAAA,GAAM,CAAA;AACV,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,CAAA,GAAI,CAAA,CAAE,CAAC,CAAA,GAAK,EAAE,CAAC,CAAA;AACrB,IAAA,GAAA,IAAO,CAAA,GAAI,CAAA;AAAA,EACb;AACA,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAE9B,EAAA,MAAM,KAAe,EAAC;AACtB,EAAA,MAAM,KAAe,EAAC;AACtB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,CAAE,QAAQ,CAAA,EAAA,EAAK;AACjC,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,MAAM,EAAA,GAAK,EAAE,CAAC,CAAA;AACd,IAAA,EAAA,CAAG,IAAA,CAAK,SAAA,IAAa,IAAA,GAAO,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,KAAA,GAAQ,EAAA,GAAK,SAAA,CAAU,CAAC,CAAA,GAAK,IAAI,CAAA;AAC9E,IAAA,EAAA,CAAG,IAAA,CAAK,QAAA,IAAY,IAAA,GAAO,EAAA,GAAA,CAAM,EAAA,GAAK,EAAA,IAAM,KAAA,GAAQ,EAAA,GAAK,QAAA,CAAS,CAAC,CAAA,GAAK,IAAI,CAAA;AAAA,EAC9E;AACA,EAAA,OAAO,CAAC,IAAI,EAAE,CAAA;AAChB;AAGO,SAAS,gBACd,CAAA,EACA,CAAA,EACA,WACA,QAAA,EACA,OAAA,EACA,QAAgB,UAAA,EACJ;AACZ,EAAA,MAAM,CAAC,IAAI,EAAE,CAAA,GAAI,aAAa,CAAA,EAAG,CAAA,EAAG,SAAA,EAAW,QAAA,EAAU,KAAK,CAAA;AAC9D,EAAA,MAAM,MAAkB,EAAC;AACzB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,OAAA,EAAS,KAAK,GAAA,CAAI,IAAA,CAAK,OAAA,CAAQ,CAAA,EAAG,EAAA,EAAI,EAAA,EAAI,CAAA,EAAG,CAAA,GAAI,OAAO,CAAC,CAAA;AAC9E,EAAA,OAAO,GAAA;AACT;AAGO,SAAS,OAAA,CACd,EAAA,EACA,EAAA,EACA,EAAA,EACA,IACA,CAAA,EACU;AACV,EAAA,MAAM,IAAI,CAAA,GAAI,CAAA;AACd,EAAA,MAAM,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAClB,EAAA,MAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AACtB,EAAA,MAAM,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA,GAAI,CAAA;AACtB,EAAA,MAAM,CAAA,GAAI,IAAI,CAAA,GAAI,CAAA;AAClB,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,CAAG,QAAQ,CAAA,EAAA,EAAK;AAClC,IAAA,GAAA,CAAI,KAAK,CAAA,GAAI,EAAA,CAAG,CAAC,CAAA,GAAK,IAAI,EAAA,CAAG,CAAC,CAAA,GAAK,CAAA,GAAI,GAAG,CAAC,CAAA,GAAK,CAAA,GAAI,EAAA,CAAG,CAAC,CAAE,CAAA;AAAA,EAC5D;AACA,EAAA,OAAO,GAAA;AACT","file":"chunk-YQADYJJ7.js","sourcesContent":["/**\n * The cubic control points that make a curve leave a port along its normal and\n * arrive at the next against that port's normal — what makes a routed edge read\n * as plugged into a box rather than aimed at it.\n *\n * The rule is stated once, over loose components, and published as is from\n * `./nd`; the 2D barrel and `./3d` each wrap it in their own currency. Every\n * operation here is closed on the plane z = 0, so a planar problem answered\n * through the 3D wrapper returns the same numbers as through the 2D one, not an\n * approximation of them.\n */\n\n/** How far a control point reaches toward the other end, as a fraction of the\n * straight-line distance between the two. */\nexport const PORT_REACH = 0.4;\n\n/**\n * `[c1, c2]` for the cubic from `a` to `b`.\n *\n * A null normal falls back to a plain lerp along the chord, which is what makes\n * an unported waypoint curve smoothly instead of kinking. The two ends are not\n * symmetric: `outNormal` points the way the curve departs, while `inNormal`\n * points out of the receiving port, so `c2` is pushed *along* it to arrive\n * against it.\n */\nexport function portControls(\n a: readonly number[],\n b: readonly number[],\n outNormal: readonly number[] | null | undefined,\n inNormal: readonly number[] | null | undefined,\n reach: number = PORT_REACH,\n): [number[], number[]] {\n let sum = 0;\n for (let i = 0; i < a.length; i++) {\n const d = b[i]! - a[i]!;\n sum += d * d;\n }\n const span = Math.sqrt(sum) * reach;\n\n const c1: number[] = [];\n const c2: number[] = [];\n for (let i = 0; i < a.length; i++) {\n const ai = a[i]!;\n const bi = b[i]!;\n c1.push(outNormal == null ? ai + (bi - ai) * reach : ai + outNormal[i]! * span);\n c2.push(inNormal == null ? bi - (bi - ai) * reach : bi + inNormal[i]! * span);\n }\n return [c1, c2];\n}\n\n/** A port curve sampled into `samples` points, excluding its start. */\nexport function portCurvePoints(\n a: readonly number[],\n b: readonly number[],\n outNormal: readonly number[] | null | undefined,\n inNormal: readonly number[] | null | undefined,\n samples: number,\n reach: number = PORT_REACH,\n): number[][] {\n const [c1, c2] = portControls(a, b, outNormal, inNormal, reach);\n const out: number[][] = [];\n for (let s = 1; s <= samples; s++) out.push(cubicAt(a, c1, c2, b, s / samples));\n return out;\n}\n\n/** A cubic evaluated at `t`, component-wise, in whatever dimension it was given. */\nexport function cubicAt(\n p0: readonly number[],\n p1: readonly number[],\n p2: readonly number[],\n p3: readonly number[],\n t: number,\n): number[] {\n const u = 1 - t;\n const a = u * u * u;\n const b = 3 * u * u * t;\n const c = 3 * u * t * t;\n const d = t * t * t;\n const out: number[] = [];\n for (let i = 0; i < p0.length; i++) {\n out.push(a * p0[i]! + b * p1[i]! + c * p2[i]! + d * p3[i]!);\n }\n return out;\n}\n"]}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { a as PolygonPath, b as PathFillRule, R as RectPath, P as Path } from './path-D0CoudGM.js';
|
|
2
2
|
import { P as Point } from './cubicMath-CpCvuEl8.js';
|
|
3
3
|
export { c as cubicPointAt, f as fitCubicThroughDeletion, s as splitCubicAtT } from './cubicMath-CpCvuEl8.js';
|
|
4
|
-
export {
|
|
4
|
+
export { PORT_REACH } from './nd/index.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Scalar / 2-vector primitives and the kernel-wide epsilon policy.
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PORT_REACH, portControls,
|
|
2
|
-
export { PORT_REACH } from './chunk-
|
|
1
|
+
import { PORT_REACH, portControls, portCurvePoints } from './chunk-YQADYJJ7.js';
|
|
2
|
+
export { PORT_REACH } from './chunk-YQADYJJ7.js';
|
|
3
3
|
import { cubicPointAt } from './chunk-HPVINMOM.js';
|
|
4
4
|
export { cubicPointAt, fitCubicThroughDeletion, splitCubicAtT } from './chunk-HPVINMOM.js';
|
|
5
5
|
import { cubicEvalAt, elevateQuadraticToCubic, cubicBounds } from './chunk-URQMDR6Q.js';
|
|
@@ -168,16 +168,10 @@ function portControls2(ax, ay, bx, by, outNormal, inNormal, reach = PORT_REACH)
|
|
|
168
168
|
[c2[0], c2[1]]
|
|
169
169
|
];
|
|
170
170
|
}
|
|
171
|
-
function
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
const out = [];
|
|
176
|
-
for (let s = 1; s <= samples; s++) {
|
|
177
|
-
const p = cubicAt(a, c1, c2, b, s / samples);
|
|
178
|
-
out.push([p[0], p[1]]);
|
|
179
|
-
}
|
|
180
|
-
return out;
|
|
171
|
+
function portCurvePoints2(ax, ay, bx, by, outNormal, inNormal, samples, reach = PORT_REACH) {
|
|
172
|
+
return portCurvePoints([ax, ay], [bx, by], outNormal, inNormal, samples, reach).map(
|
|
173
|
+
(p) => [p[0], p[1]]
|
|
174
|
+
);
|
|
181
175
|
}
|
|
182
176
|
|
|
183
177
|
// src/paths/builder.ts
|
|
@@ -1794,6 +1788,6 @@ function resolveEasing(spec) {
|
|
|
1794
1788
|
throw new Error("resolveEasing: unrecognized easing spec");
|
|
1795
1789
|
}
|
|
1796
1790
|
|
|
1797
|
-
export { EASINGS, PathBuilder, SPRING_PRESETS, applyToPoint, boundsOfPath, boxToBox, clampRectWithin, composePath, cubicBezierEasing, decomposePath, easeIn, easeInBack, easeInBounce, easeInCirc, easeInCubic, easeInElastic, easeInExpo, easeInOut, easeInOutBack, easeInOutBounce, easeInOutCirc, easeInOutCubic, easeInOutElastic, easeInOutExpo, easeInOutQuad, easeInOutQuart, easeInOutQuint, easeInOutSine, easeInQuad, easeInQuart, easeInQuint, easeInSine, easeOut, easeOutBack, easeOutBounce, easeOutCirc, easeOutCubic, easeOutElastic, easeOutExpo, easeOutQuad, easeOutQuart, easeOutQuint, easeOutSine, ellipsePath, identity, invert, linePath, linear, multiply, nearestOnCubic, nearestOnLine, nearestOnPath, nearestOnQuadratic, pathContainsPoint, pathContainsPolygon, pathContainsRect, pathDistanceToPoint, pathFromD, pathIntersectsPolygon, pathIntersectsRect, pathSignedArea, placeRect, pointAlongPath, pointInPath, polygonContainsPath, polygonFromPoints, polygonIntersectsPath, polylineFromPoints, portControls2 as portControls, portCurvePoints, rectPath, regularPolygonPath, resolveEasing, reversePath, rotate, rotateAboutPoint, scale, scalePathToBounds, schneiderFit, splitSubpaths, starPath, strokeHitTest, transformCoords, transformPath, translate, translatePath, unionBoundsPath };
|
|
1791
|
+
export { EASINGS, PathBuilder, SPRING_PRESETS, applyToPoint, boundsOfPath, boxToBox, clampRectWithin, composePath, cubicBezierEasing, decomposePath, easeIn, easeInBack, easeInBounce, easeInCirc, easeInCubic, easeInElastic, easeInExpo, easeInOut, easeInOutBack, easeInOutBounce, easeInOutCirc, easeInOutCubic, easeInOutElastic, easeInOutExpo, easeInOutQuad, easeInOutQuart, easeInOutQuint, easeInOutSine, easeInQuad, easeInQuart, easeInQuint, easeInSine, easeOut, easeOutBack, easeOutBounce, easeOutCirc, easeOutCubic, easeOutElastic, easeOutExpo, easeOutQuad, easeOutQuart, easeOutQuint, easeOutSine, ellipsePath, identity, invert, linePath, linear, multiply, nearestOnCubic, nearestOnLine, nearestOnPath, nearestOnQuadratic, pathContainsPoint, pathContainsPolygon, pathContainsRect, pathDistanceToPoint, pathFromD, pathIntersectsPolygon, pathIntersectsRect, pathSignedArea, placeRect, pointAlongPath, pointInPath, polygonContainsPath, polygonFromPoints, polygonIntersectsPath, polylineFromPoints, portControls2 as portControls, portCurvePoints2 as portCurvePoints, rectPath, regularPolygonPath, resolveEasing, reversePath, rotate, rotateAboutPoint, scale, scalePathToBounds, schneiderFit, splitSubpaths, starPath, strokeHitTest, transformCoords, transformPath, translate, translatePath, unionBoundsPath };
|
|
1798
1792
|
//# sourceMappingURL=index.js.map
|
|
1799
1793
|
//# sourceMappingURL=index.js.map
|