From 4ee99de2fba55159b8a366b9544fb09dd4a4ca8b Mon Sep 17 00:00:00 2001 From: Mark Tolmacs Date: Mon, 24 Mar 2025 15:24:06 +0100 Subject: [PATCH] Get three solutions for curve-line intersections to avoid issue with high inclination intersectors --- packages/math/src/curve.ts | 21 ++++++--------------- packages/math/src/point.ts | 3 ++- packages/math/src/utils.ts | 2 +- 3 files changed, 9 insertions(+), 17 deletions(-) diff --git a/packages/math/src/curve.ts b/packages/math/src/curve.ts index a79fb43a19..a0b2e75c5c 100644 --- a/packages/math/src/curve.ts +++ b/packages/math/src/curve.ts @@ -157,22 +157,13 @@ export function curveIntersectLineSegment< return bezierEquation(c, t); }; - let solution = calculate(initial_guesses[0]); - if (solution) { - return [solution]; - } + const solutions = [ + calculate(initial_guesses[0]), + calculate(initial_guesses[1]), + calculate(initial_guesses[2]), + ].filter((x, i, a): x is Point => x !== null && a.indexOf(x) === i); - solution = calculate(initial_guesses[1]); - if (solution) { - return [solution]; - } - - solution = calculate(initial_guesses[2]); - if (solution) { - return [solution]; - } - - return []; + return solutions; } /** diff --git a/packages/math/src/point.ts b/packages/math/src/point.ts index b6054a10a3..b760d020a7 100644 --- a/packages/math/src/point.ts +++ b/packages/math/src/point.ts @@ -91,9 +91,10 @@ export function isPoint(p: unknown): p is LocalPoint | GlobalPoint { export function pointsEqual( a: Point, b: Point, + precision: number = PRECISION, ): boolean { const abs = Math.abs; - return abs(a[0] - b[0]) < PRECISION && abs(a[1] - b[1]) < PRECISION; + return abs(a[0] - b[0]) < precision && abs(a[1] - b[1]) < precision; } /** diff --git a/packages/math/src/utils.ts b/packages/math/src/utils.ts index 8807c275e4..89765fa670 100644 --- a/packages/math/src/utils.ts +++ b/packages/math/src/utils.ts @@ -6,7 +6,7 @@ export const clamp = (value: number, min: number, max: number) => { export const round = ( value: number, - precision: number, + precision: number = (Math.log(1 / PRECISION) * Math.LOG10E + 1) | 0, func: "round" | "floor" | "ceil" = "round", ) => { const multiplier = Math.pow(10, precision);