fix: Curve endpoint intersection (#10640)
* fix: Curve endpoint intersection Signed-off-by: Mark Tolmacs <mark@lazycat.hu> * fix debug --------- Signed-off-by: Mark Tolmacs <mark@lazycat.hu> Co-authored-by: dwelle <5153846+dwelle@users.noreply.github.com>
This commit is contained in:
@@ -10,8 +10,6 @@ const lessPrecise = (num: number, precision = 5) =>
|
|||||||
const getAvgFrameTime = (times: number[]) =>
|
const getAvgFrameTime = (times: number[]) =>
|
||||||
lessPrecise(times.reduce((a, b) => a + b) / times.length);
|
lessPrecise(times.reduce((a, b) => a + b) / times.length);
|
||||||
|
|
||||||
const getFps = (frametime: number) => lessPrecise(1000 / frametime);
|
|
||||||
|
|
||||||
export class Debug {
|
export class Debug {
|
||||||
public static DEBUG_LOG_TIMES = true;
|
public static DEBUG_LOG_TIMES = true;
|
||||||
|
|
||||||
@@ -66,12 +64,14 @@ export class Debug {
|
|||||||
}
|
}
|
||||||
for (const [name, { t, times, avg }] of Object.entries(Debug.TIMES_AVG)) {
|
for (const [name, { t, times, avg }] of Object.entries(Debug.TIMES_AVG)) {
|
||||||
if (times.length) {
|
if (times.length) {
|
||||||
const avgFrameTime = getAvgFrameTime(times);
|
// const avgFrameTime = getAvgFrameTime(times);
|
||||||
|
const totalTime = times.reduce((a, b) => a + b);
|
||||||
|
const avgFrameTime = lessPrecise(totalTime / Debug.FRAME_COUNT);
|
||||||
console.info(
|
console.info(
|
||||||
name,
|
name,
|
||||||
`${times.length} runs: ${avgFrameTime}ms across ${
|
`- ${times.length} calls - ${avgFrameTime}ms/frame across ${
|
||||||
Debug.FRAME_COUNT
|
Debug.FRAME_COUNT
|
||||||
} frames (${getFps(avgFrameTime)} fps ~ ${lessPrecise(
|
} frames (${lessPrecise(
|
||||||
(avgFrameTime / 16.67) * 100,
|
(avgFrameTime / 16.67) * 100,
|
||||||
1,
|
1,
|
||||||
)}% of frame budget)`,
|
)}% of frame budget)`,
|
||||||
@@ -136,7 +136,7 @@ export class Debug {
|
|||||||
return (...args: T) => {
|
return (...args: T) => {
|
||||||
const t0 = performance.now();
|
const t0 = performance.now();
|
||||||
const ret = fn(...args);
|
const ret = fn(...args);
|
||||||
Debug.logTime(performance.now() - t0, name);
|
Debug[type](performance.now() - t0, name);
|
||||||
return ret;
|
return ret;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { isPoint, pointDistance, pointFrom, pointFromVector } from "./point";
|
import { isPoint, pointDistance, pointFrom, pointFromVector } from "./point";
|
||||||
import { vector, vectorNormal, vectorNormalize, vectorScale } from "./vector";
|
import { vector, vectorNormal, vectorNormalize, vectorScale } from "./vector";
|
||||||
import { LegendreGaussN24CValues, LegendreGaussN24TValues } from "./constants";
|
import { LegendreGaussN24CValues, LegendreGaussN24TValues } from "./constants";
|
||||||
|
import { lineSegment, lineSegmentIntersectionPoints } from "./segment";
|
||||||
|
|
||||||
import type { Curve, GlobalPoint, LineSegment, LocalPoint } from "./types";
|
import type { Curve, GlobalPoint, LineSegment, LocalPoint } from "./types";
|
||||||
|
|
||||||
@@ -174,6 +175,23 @@ export function curveIntersectLineSegment<
|
|||||||
return [solution];
|
return [solution];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Fallback: approximate the curve with short segments to catch near-endpoint hits.
|
||||||
|
const startHit = lineSegmentIntersectionPoints(
|
||||||
|
lineSegment(bezierEquation(c, 0), bezierEquation(c, 1 / 20)),
|
||||||
|
l,
|
||||||
|
);
|
||||||
|
if (startHit) {
|
||||||
|
return [startHit];
|
||||||
|
}
|
||||||
|
|
||||||
|
const endHit = lineSegmentIntersectionPoints(
|
||||||
|
lineSegment(bezierEquation(c, 19 / 20), bezierEquation(c, 1)),
|
||||||
|
l,
|
||||||
|
);
|
||||||
|
if (endHit) {
|
||||||
|
return [endHit];
|
||||||
|
}
|
||||||
|
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user