Skip to content

Fix disjointComponents misclassifying inner component with boundary startingPoint#145

Draft
hfutrell wants to merge 1 commit into
0.16.4-releasefrom
fix/disjoint-components-boundary-probe
Draft

Fix disjointComponents misclassifying inner component with boundary startingPoint#145
hfutrell wants to merge 1 commit into
0.16.4-releasefrom
fix/disjoint-components-boundary-probe

Conversation

@hfutrell

Copy link
Copy Markdown
Owner

Summary

windingCountIncrementer uses guard point.x > xIntercept (strict), so a point exactly on a boundary segment returns 0. When an inner component's startingPoint lands precisely on another component's boundary, the old code got windingCount == 0 and treated the inner hole as a second outer component instead of grouping it with its owner.

Fix: use the midpoint of the component's first curve as the probe point instead of startingPoint. A midpoint of a curve is offset into the interior and avoids the boundary-exclusion edge case. The same probe point is used in both the classification pass (inner vs outer) and the owner-filing pass.

Test

Added testDisjointComponentsInnerStartingPointOnOuterBoundary: an outer 100×100 square and an inner triangle whose startingPoint is at (0, 50) — exactly on the outer's left edge. Without the fix, disjointComponents() returns 2 paths; with the fix, it correctly returns 1 path with 2 components.

Posted by Claude on behalf of @hfutrell.

…tartingPoint

windingCountIncrementer uses strict point.x > xIntercept, so a point exactly
on a boundary segment returns 0. When an inner component's startingPoint lands
on another component's boundary the old code got windingCount 0 and treated it
as a second outer component rather than a hole.

Fix: use the midpoint of the first curve as the probe point instead of
startingPoint. A curve midpoint is offset into the component's interior and
avoids the boundary coincidence. The same probe is used in both the
classification pass and the owner-filing pass.

Adds testDisjointComponentsInnerStartingPointOnOuterBoundary to verify the
fix, using an outer square and an inner triangle whose startingPoint sits
exactly on the outer's left edge.

Co-Authored-By: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant