当使用常用公式计算两个2D段之间的交集时,即here,如果将结果舍入为整数,则会得到非对称结果。
也就是说,有时候,由于舍入错误,我得到intersection(A,B)!=intersection(B,A)
。
最好的解决方案是继续使用浮点数,并将结果与一定精度进行比较。但是,我必须在计算交叉点后将结果舍入为整数,我不能继续使用浮点数。
到目前为止,我最好的解决方案是在平面中的段上使用一些完整的顺序,并intersection
始终将较小的段与较大的段进行比较。
有更好的方法吗?我错过了什么吗?
答案 0 :(得分:1)
您不想比较段长度。
此外,我假设在将intersection(A',B')
与intersection(B",A")
进行比较时,我们可以理解A'
的坐标 representationally相同到{{ 1}}(A"
和B'
的同意,或者没有解决方案。
话虽如此,请考虑细分B"
和[PQ]
,其中[RS]
,P
,Q
和R
是飞机上的点。您想要段的交叉点:
S
[PQ]
[RS]
[QP]
[RS]
[PQ]
[SR]
[QP]
[SR]
[RS]
[PQ]
[SR]
[PQ]
[RS]
[QP]
[SR]
...总是返回相同的坐标对。
订购,每个段上的端点中的第一个,然后是段本身(基于每个段的最少端点),是保证可重现结果的唯一解决方案。排序本身在计算上可以是微不足道的,例如, [QP]
iff P<Q
,虽然如果处理数百万个网段,分支可能会变得昂贵(如果可能的话,请参阅如何利用SIMD就地交换网段坐标订购。)