我的问题看起来几乎像找到给定线段的所有交叉点的经典CS问题。
略微修改的事实是:
我需要在交叉点处拆分所有段
2.生成的分割段必须具有整数坐标。
如果我只是应用标准扫描线算法来找到所有的交叉点,而不是将这些点的坐标转换为整数,我有时会得到由交叉点移动到整数网格引起的新交叉点。
我可能会反复应用这个算法,并且可能(我无法证明),在有限的步骤中达到我找不到新交叉点的状态。 但我确信必须有一个更简单,更优雅的解决方案。
我试图找到一篇关于这种算法的论文,但不知何故找不到能解决这个问题的论文。
你能告诉我这样一个pape,还是图形库使用的算法描述(比如Boost Polygon Library)?
谢谢。
答案 0 :(得分:2)
这是线段交叉问题的一个有趣变体。找到这些段的交点坐标的原始问题可以使用线扫描算法来解决。
Here是一篇深入讨论上述问题的Line-Sweep技术实现的文章。有了这个,交叉点可以在O(n * logn)时间内找到。
现在,为了找到整数坐标,您可以投射交点。但是在这里你需要确定铸造的方向(这将有助于收敛)。
如果C
位于线段AB
上的交叉点,则将其拆分为AC
和CB
。在AC
中,您向C
方向投射A
,而在CB
中向B
方向投射M
。 (按方向,我不是指沿着线段方向,而是沿着包含另一个终点的半平面。)这确保了每个交叉点后线段的长度将减少。
证明: 请注意,M是线段的最大长度。每当交叉点位于其上时,新线段的长度减少至少一个单位。因此,迭代次数受{{1}}的限制 因此,算法的整体迭代不能超过M.
复杂度= O(M * n * logn)