【问题标题】:Show that, given a query point q, it can be tested in time O(log n) whether q lies inside P证明,给定一个查询点 q,可以在 O(log n) 时间内测试 q 是否在 P 内
【发布时间】:2016-03-21 16:01:54
【问题描述】:

我正在尝试解决第 6 章 - 点位置的“计算几何算法和应用,第 3 次 - de berg 等人”一书的一些练习。不幸的是,我不知道如何解决以下练习:

给定一个凸多边形 P 作为其 n 个顶点按排序顺序排列的数组
沿着边界。证明,给定一个查询点 q,它可以在
时间 O(log n) q 是否在 P 内。

到目前为止我的想法: 我知道确定一个点是否位于 O(log n) 中的 p 内的唯一方法是使用有向无环图。为了使用有向无环图,我需要构建它,这在 O(log n) 中是不可能的。所以,不知何故,我需要使用有序数组,但我知道的唯一使用数组的解决方案将花费 O(N)。

我希望有人可以帮助我。

【问题讨论】:

    标签: algorithm geometry computational-geometry graph-algorithm


    【解决方案1】:

    这个想法基本上是进行二进制搜索,以找到该点属于哪个“段”。这里的假设是多边形环绕某个固定原点O,这是定义角度排序例程所必需的。

    要确定q 是位于P[n/2] 的“左”还是“右”(我的意思是关于O 的逆时针或顺时针旋转差异),我们进行二维叉积

    这是一个真正的标量。如果这是肯定的,那么ab 的右侧,反之亦然。在我们的代码a = q - Ob = P[i] - O 中,i 是我们正在测试q 所针对的多边形上的点的索引。

    然后我们可以使用这个测试来找出q 在哪个“段”或“楔形”中,即多边形q 的哪些点在它们之间(在图表上,它们是P[n/2 - 1]P[n/2]) ,使用二进制搜索,即 O(log n)。 (我假设你知道怎么做)

    一旦我们知道了这一点,我们就需要知道q 是否在“楔形”内部。

    https://en.wikipedia.org/wiki/Line%E2%80%93line_intersection,对于分别由点对[(x1,y1),(x2,y2)]和[(x3,y3),(x4,y4)]定义的两条线,它们的交点(Px , Py) 由

    给出

    计算 [Pl, Pr] 和 [q, O] 之间的交集得到s,并计算距离|s - O|。如果它大于|q - O|,则q 在多边形 P 内,反之亦然。

    (这一步当然是 O(1)。但是可能有更优雅的方法 - 我只是说明它背后的逻辑)

    那么总复杂度是 O(log n) + O(1) = O(log n)

    【讨论】:

    • 美丽。我以前从未见过这种技术!
    • 感谢您的详细解释!请问你用什么程序来制作这些图片?
    • @maffh 没问题。现在......这很尴尬 - 大多数人使用正确指定的软件,如 GIMP 或 Adob​​e Illustrator。我用过 PowerPoint (~_~) #SoftwareSacilege
    • @user3235832 好主意!我可以参考你的图片吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-02
    • 2018-02-11
    • 2011-04-04
    相关资源
    最近更新 更多