aboutsummaryrefslogtreecommitdiffstats
path: root/packages/math/curve.test.ts
diff options
context:
space:
mode:
authorkj_sh6042026-03-15 16:19:35 -0400
committerkj_sh6042026-03-15 16:19:35 -0400
commit6ec259a0e71174651bae95d4628138bf6fd68742 (patch)
tree5e33c6a5ec091ecabfcb257fdc7b6a88ed8754ac /packages/math/curve.test.ts
parent16c8578b15c727f22921f8a80a56ee4d4e7f2272 (diff)
refactor: packages/
Diffstat (limited to 'packages/math/curve.test.ts')
-rw-r--r--packages/math/curve.test.ts101
1 files changed, 101 insertions, 0 deletions
diff --git a/packages/math/curve.test.ts b/packages/math/curve.test.ts
new file mode 100644
index 0000000..94670d7
--- /dev/null
+++ b/packages/math/curve.test.ts
@@ -0,0 +1,101 @@
+import "../utils/test-utils";
+import {
+ curve,
+ curveClosestPoint,
+ curveIntersectLineSegment,
+ curvePointDistance,
+} from "./curve";
+import { pointFrom } from "./point";
+import { lineSegment } from "./segment";
+
+describe("Math curve", () => {
+ describe("line segment intersection", () => {
+ it("point is found when control points are the same", () => {
+ const c = curve(
+ pointFrom(100, 0),
+ pointFrom(100, 100),
+ pointFrom(100, 100),
+ pointFrom(0, 100),
+ );
+ const l = lineSegment(pointFrom(0, 0), pointFrom(200, 200));
+
+ expect(curveIntersectLineSegment(c, l)).toCloselyEqualPoints([
+ [87.5, 87.5],
+ ]);
+ });
+
+ it("point is found when control points aren't the same", () => {
+ const c = curve(
+ pointFrom(100, 0),
+ pointFrom(100, 60),
+ pointFrom(60, 100),
+ pointFrom(0, 100),
+ );
+ const l = lineSegment(pointFrom(0, 0), pointFrom(200, 200));
+
+ expect(curveIntersectLineSegment(c, l)).toCloselyEqualPoints([
+ [72.5, 72.5],
+ ]);
+ });
+
+ it("points are found when curve is sliced at 3 points", () => {
+ const c = curve(
+ pointFrom(-50, -50),
+ pointFrom(10, -50),
+ pointFrom(10, 50),
+ pointFrom(50, 50),
+ );
+ const l = lineSegment(pointFrom(0, 112.5), pointFrom(90, 0));
+
+ expect(curveIntersectLineSegment(c, l)).toCloselyEqualPoints([[50, 50]]);
+ });
+
+ it("can be detected where the determinant is overly precise", () => {
+ const c = curve(
+ pointFrom(41.028864759926016, 12.226249068355052),
+ pointFrom(41.028864759926016, 33.55958240168839),
+ pointFrom(30.362198093259348, 44.22624906835505),
+ pointFrom(9.028864759926016, 44.22624906835505),
+ );
+ const l = lineSegment(
+ pointFrom(-82.30963544324186, -41.19949363038283),
+
+ pointFrom(188.2149592542487, 134.75505940984908),
+ );
+
+ expect(curveIntersectLineSegment(c, l)).toCloselyEqualPoints([
+ [34.4, 34.71],
+ ]);
+ });
+ });
+
+ describe("point closest to other", () => {
+ it("point can be found", () => {
+ const c = curve(
+ pointFrom(-50, -50),
+ pointFrom(10, -50),
+ pointFrom(10, 50),
+ pointFrom(50, 50),
+ );
+ const p = pointFrom(0, 0);
+
+ expect([curveClosestPoint(c, p)]).toCloselyEqualPoints([
+ [5.965462100367372, -3.04104878946646],
+ ]);
+ });
+ });
+
+ describe("point shortest distance", () => {
+ it("can be determined", () => {
+ const c = curve(
+ pointFrom(-50, -50),
+ pointFrom(10, -50),
+ pointFrom(10, 50),
+ pointFrom(50, 50),
+ );
+ const p = pointFrom(0, 0);
+
+ expect(curvePointDistance(c, p)).toBeCloseTo(6.695873043213627);
+ });
+ });
+});