Prevent accuracy degradation of signed distance computation #2348
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Signed distance computation using fast winding number (i.e.
(1.0 - 2.0 * winding_num) * udist
) degrades accuracy, since fast winding number contains approximation errors. This PR replaces(1.0 - 2.0 * winding_num)
withwinding_num > 0.5 ? -1.0 : 1.0
.This PR also applies the above change to (non-fast) winding number for consistency with "pseudo-normal test" and patched "fast winding number".
[!NOTE] Numerical errors in (non-fast) winding number computation are very small in general, but in my random testing with double precision the largest winding number I got was 1.0000005.
Unit tests ran fine and I locally tested that "pseudo-normal test", "winding number" and "fast winding number" all give the same signed distance (if they give the same sign).
Checklist