Fix some issues that may cause catastrophic floating point error #284
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.
Made the following changes
p+d*t
toq+d*(t-1)
. The problem is if-a+sqrt(det) ≫ 1
, then the termarg(v, q)
is supposed to be identically zero, however ifq ≈ (0, 0)
then it's possible thatp+d ≉ q
andarg(v, q) ≉ 0
, which results in a large error. Seea.cpp
in the attached file below.side != (s.cross(e, prev) < 0)
is true, it is possible that the 4 points are almost collinear thatlineInter
returns the second value being(0, 0)
. With this change, whenever(a < 0) != (b < 0)
then0 ≤ a / (a - b) ≤ 1
, which means the point being pushed is always on the line betweenprev
andcur
i.e. no catastrophic error can happen. Seeb.cpp
in the attached file below.Attachment (demonstration of catastrophic failure): a.zip