以对称方式计算两个段之间的交点

时间:2010-04-11 05:39:25

标签: math geometry precision line-segment

当使用常用公式计算两个2D段之间的交集时,即here,如果将结果舍入为整数,则会得到非对称结果。

也就是说,有时候,由于舍入错误,我得到intersection(A,B)!=intersection(B,A)

最好的解决方案是继续使用浮点数,并将结果与​​一定精度进行比较。但是,我必须在计算交叉点后将结果舍入为整数,我不能继续使用浮点数。

到目前为止,我最好的解决方案是在平面中的段上使用一些完整的顺序,并intersection始终将较小的段与较大的段进行比较。

有更好的方法吗?我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

您不想比较段长度。

此外,我假设在将intersection(A',B')intersection(B",A")进行比较时,我们可以理解A'的坐标 representationally相同到{{ 1}}(A"B'的同意,或者没有解决方案。

话虽如此,请考虑细分B"[PQ],其中[RS]PQR是飞机上的点。您想要段的交叉点:

  • S [PQ]
  • [RS] [QP]
  • [RS] [PQ]
  • [SR] [QP]
  • [SR] [RS]
  • [PQ] [SR]
  • [PQ] [RS]
  • [QP] [SR]

...总是返回相同的坐标对。

订购,每个段上的端点中的第一个,然后是段本身(基于每个段的最少端点),是保证可重现结果的唯一解决方案。排序本身在计算上可以是微不足道的,例如, [QP] iff P<Q,虽然如果处理数百万个网段,分支可能会变得昂贵(如果可能的话,请参阅如何利用SIMD就地交换网段坐标订购。)