相交n个线段(在整数网格上)

时间:2016-05-07 12:49:51

标签: algorithm computational-geometry

我的问题看起来几乎像找到给定线段的所有交叉点的经典CS问题。

略微修改的事实是:
我需要在交叉点处拆分所有段 2.生成的分割段必须具有整数坐标。

如果我只是应用标准扫描线算法来找到所有的交叉点,而不是将这些点的坐标转换为整数,我有时会得到由交叉点移动到整数网格引起的新交叉点。

我可能会反复应用这个算法,并且可能(我无法证明),在有限的步骤中达到我找不到新交叉点的状态。 但我确信必须有一个更简单,更优雅的解决方案。

我试图找到一篇关于这种算法的论文,但不知何故找不到能解决这个问题的论文。

你能告诉我这样一个pape,还是图形库使用的算法描述(比如Boost Polygon Library)?

谢谢。

1 个答案:

答案 0 :(得分:2)

这是线段交叉问题的一个有趣变体。找到这些段的交点坐标的原始问题可以使用线扫描算法来解决。

Here是一篇深入讨论上述问题的Line-Sweep技术实现的文章。有了这个,交叉点可以在O(n * logn)时间内找到。

现在,为了找到整数坐标,您可以投射交点。但是在这里你需要确定铸造的方向(这将有助于收敛)。

如果C位于线段AB上的交叉点,则将其拆分为ACCB。在AC中,您向C方向投射A,而在CB中向B方向投射M。 (按方向,我不是指沿着线段方向,而是沿着包含另一个终点的半平面。)这确保了每个交叉点后线段的长度将减少。

证明: 请注意,M是线段的最大长度。每当交叉点位于其上时,新线段的长度减少至少一个单位。因此,迭代次数受{{1}}的限制 因此,算法的整体迭代不能超过M.

复杂度= O(M * n * logn)