При использовании обычных формул для вычисления пересечения между двумя 2D-сегментами, то есть here, если вы округлите результат до целого числа, вы получите несимметричные результаты.вычислять пересечение между двумя сегментами симметричным способом.
То есть, из-за ошибок округления, я получаю это intersection(A,B)!=intersection(B,A)
.
Лучшим решением является сохранение работы с поплавками и сравнение результатов с определенной точностью. Тем не менее, я должен округлять результаты до целых чисел после вычисления пересечения, я не могу продолжать работать с поплавками.
Моим лучшим решением на данный момент было использование некоторого полного порядка на сегментах в плоскости и иметь intersection
, чтобы всегда сравнивать меньший сегмент с большим сегментом.
Есть ли лучший способ? Я что-то упускаю?
Любой причину, по которой вы можете» t использовать, скажем, симметричное пересечение (A, B) = (пересечение (A, B) + пересечение (B, A))/2? Смещение с плавающей запятой является коммутативным. – brainjam
@brainjam, это действительно хорошо и математически звучит, но для этого требуется, чтобы я дважды вычислил пересечение и полагался на округление с плавающей запятой, поэтому я не уверен, что это намного лучше, чем заказать на сегментах на практике. В любом случае палец вверх! Понравилось. –
@brainjam, когда ошибка ползет, любая операция может усилить ошибку. Так что, если уже сравнение 'X' ==' Y' получилось ложным, 'X' ==' (X + Y)/2', скорее всего, также будет ошибочным. Более того, в случаях, когда 'X' ==' Y' может получиться истинным, 'X' ==' (X + Y)/2' может получиться ложным (например, когда 'X' и' Y' могут быть представлены без ошибок, но 'X + Y' больше не может быть представлен без ошибок.) – vladr