Restore collision optimization

This commit is contained in:
Mark Tolmacs 2025-03-26 20:10:01 +01:00
parent fdd7420e65
commit 6e520fdbb9

View file

@ -212,28 +212,28 @@ const intersectRectanguloidWithLineSegment = (
const [sides, corners] = deconstructRectanguloidElement(element, offset); const [sides, corners] = deconstructRectanguloidElement(element, offset);
return ( return (
[ // Test intersection against the sides, keep only the valid
// Test intersection against the sides, keep only the valid // intersection points and rotate them back to scene space
// intersection points and rotate them back to scene space sides
...sides .map((s) =>
.map((s) => lineSegmentIntersectionPoints(
lineSegmentIntersectionPoints( lineSegment<GlobalPoint>(rotatedA, rotatedB),
lineSegment<GlobalPoint>(rotatedA, rotatedB), s,
s, ),
), )
) .filter((x) => x != null)
.filter((x) => x != null) .map((j) => pointRotateRads<GlobalPoint>(j!, center, element.angle))
.map((j) => pointRotateRads<GlobalPoint>(j!, center, element.angle)),
// Test intersection against the corners which are cubic bezier curves, // Test intersection against the corners which are cubic bezier curves,
// keep only the valid intersection points and rotate them back to scene // keep only the valid intersection points and rotate them back to scene
// space // space
...corners .concat(
.flatMap((t) => corners
curveIntersectLineSegment(t, lineSegment(rotatedA, rotatedB)), .flatMap((t) =>
) curveIntersectLineSegment(t, lineSegment(rotatedA, rotatedB)),
.filter((i) => i != null) )
.map((j) => pointRotateRads(j, center, element.angle)), .filter((i) => i != null)
] .map((j) => pointRotateRads(j, center, element.angle)),
)
// Remove duplicates // Remove duplicates
.filter( .filter(
(p, idx, points) => points.findIndex((d) => pointsEqual(p, d)) === idx, (p, idx, points) => points.findIndex((d) => pointsEqual(p, d)) === idx,
@ -266,29 +266,28 @@ const intersectDiamondWithLineSegment = (
const [sides, curves] = deconstructDiamondElement(element, offset); const [sides, curves] = deconstructDiamondElement(element, offset);
return ( return (
[ sides
...sides .map((s) =>
.map((s) => lineSegmentIntersectionPoints(
lineSegmentIntersectionPoints( lineSegment<GlobalPoint>(rotatedA, rotatedB),
lineSegment<GlobalPoint>(rotatedA, rotatedB), s,
s, ),
), )
) .filter((p): p is GlobalPoint => p != null)
.filter((p): p is GlobalPoint => p != null) // Rotate back intersection points
// Rotate back intersection points .map((p) => pointRotateRads<GlobalPoint>(p!, center, element.angle))
.map((p) => pointRotateRads<GlobalPoint>(p!, center, element.angle)), .concat(
...curves curves
.flatMap((p) => .flatMap((p) =>
curveIntersectLineSegment(p, lineSegment(rotatedA, rotatedB)), curveIntersectLineSegment(p, lineSegment(rotatedA, rotatedB)),
) )
.filter((p) => p != null) .filter((p) => p != null)
// Rotate back intersection points // Rotate back intersection points
.map((p) => pointRotateRads(p, center, element.angle)), .map((p) => pointRotateRads(p, center, element.angle)),
] )
// Remove duplicates // Remove duplicates
.filter( .filter(
(p, idx, points) => (p, idx, points) => points.findIndex((d) => pointsEqual(p, d)) === idx,
points.findIndex((d) => pointsEqual(p, d, 1e-3)) === idx,
) )
); );
}; };