diff options
Diffstat (limited to 'packages/math/curve.test.ts')
| -rw-r--r-- | packages/math/curve.test.ts | 101 |
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); + }); + }); +}); |
