【问题标题】:Bounding Box of the Line Arrangement in O(n log n) timeO(n log n) 时间内的 Line Arrangement 的Bounding Box
【发布时间】:2017-12-08 13:08:46
【问题描述】:

我想计算线排列的边界框(没有平行线)。边界框应包含线排列的所有交点。

我做了一些研究,发现几次计算边界框应该可以在 O(n log n) 时间内完成。不幸的是,我无法找到此声明的来源。

我试图想出一种算法,可以在 O(n log n) 时间内解决这个问题,但到目前为止还不能。我尝试使用对偶性来计算信封,但不幸的是,信封并不总是包含最低和最高的交点。

如果有人知道在哪里可以找到这样的算法或它是如何工作的,我将不胜感激。

【问题讨论】:

  • 分段还是无限线?
  • no parallel lines(有点)拼写无限,除非它是邋遢的,因为没有一条平行于平面轴的线

标签: algorithm geometry line bounding-box


【解决方案1】:

可以在 O(n log n) 时间内完成。我们不必检查每个交叉点,只需要找到 x 和 y 坐标最高/最低的那些。

这就是我想出的。我想我们在同一个讲座,这几乎就是我要交的内容,所以如果你想使用这个解决方案,请不要只是复制粘贴。

左边界算法:

1) 根据点-线对偶l:y = mx + c => l* = (m, -c)将线化为点。 O(n)

2) 按 x 坐标排序。 O(n log n)

3) 将前两点的线保存为坡度最低的线。 O(1)

4) 遍历点,如果由两点 P[i] 和 P[i+1] 组成的线的斜率低于先前保存的最低斜率,则将该线保存为具有最低斜率的线。 O(n)

5) 再次使用对偶将线变成一个点。 O(1)

6) 返回该点的 x 坐标作为左边界。 O(1)

斜率最低的线表示 x 坐标最低的交点。右边界的工作方式相同,但坡度最高。为了得到上下界的算法,我们可以将对偶性更改为 l:y = mx + c => l* = (-c, m) (基本上将平面旋转 90 度)以便能够确定也可以通过查看斜坡来确定最低和最高的交点。

我们不必为了找到最陡峭的坡度而查看所有直线的交点,根据 x 坐标查看彼此相邻的直线就足够了。

【讨论】:

  • line with the lowest slope represents the intersection point with the lowest x-coordinate - 很好。您能否争辩为什么只需要考虑“x 中的双重邻居”(“斜坡中的原始邻居”)?
  • 我不确定你的意思......你想让我解释一下,为什么我只查看按 x 坐标排序的列表中彼此相邻的点,而不是每个组合两点?
  • @greybeard 考虑两条线 A 和 B,坡度 (A)
  • 如何确定最低斜率线是由对偶形式中的两个连续点形成的?例如,为什么不可能由 P[i]、P[i+2] 形成最低斜率线?
  • @X.Arthur 假设我们在两点 A、B 之间有一个斜率 AB。现在尝试在它们之间放置另一个点 X,并检查斜率 AX 和 XB。你会看到 AX 和 XB 中的一个总是比 AB 更陡,而另一个比 AB 更陡(除非 X 正好在 AB 上)。您可以轻松尝试所有情况,将 X 置于 A 和 B 之上,将 X 置于 AB 之上但低于更高点等。由于无法放置 X 以使 AB 保持最陡坡度,我们可以得出结论,最陡坡度总是在两个相邻点之间。
【解决方案2】:

我不同意PelicanFive 所说的,因为您仍然需要检查所有不同的对以找到最低斜率线。

我处理这个问题的方法是(让我们以最左边和最右边的交叉点为例)使用一条从左边很远到右边很远的垂直线扫向交叉点。

在很远的距离,这条垂直线会与所有这些线按从上到下的顺序相交,记录下这个顺序。

注意,如果这条垂直线经过某个交点,顺序会发生变化。

在决策树模型中,找到第一个交点的步骤数为 O(log n),每次检查将花费 O(n)。

因此,总运行时间为 O(n log n)。

最顶层和最底层的顶点是一样的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-09
    • 1970-01-01
    • 2011-12-12
    • 2011-12-11
    • 1970-01-01
    • 2015-05-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多