【问题标题】:Given a convex polygon, add a point and recalculate the area给定一个凸多边形,添加一个点并重新计算面积
【发布时间】:2017-08-06 15:30:23
【问题描述】:

假设你有一个凸多边形P(由点数组p定义)和一组点S(都在P之外),你如何选择一个点@ 987654327@ 这样它增加了P 的最大面积。 示例
我有一个 O(|P|) 公式来计算多边形的面积,但我不能对S 中的每个点都这样做

3 ≤ |P|, |S| ≤ 10^5

大点是S中的点
P u S 中没有 3 个点是共线的

【问题讨论】:

  • 对于每个s,您在Ps 的两个顶点之间引入边。您可以使用这些顶点形成的三角形来近似添加区域,这应该可以过滤掉很多不正确的区域。由于这些三角形的面积总是 >= 实际添加的面积,因此这种方法不会给出任何假阴性。计算实际面积可以简化为计算增加的​​面积,这样也节省了一些时间。
  • 搜索动态凸包。有一个 DS 为点插入/删除操作提供 O(log(n)*log(n)) 时间。
  • @Paul 我如何选择您所说的 2 个顶点?
  • @MoroSilverio Id 建议根据多边形中心围绕多边形中心的旋转对多边形的点进行排序,并对前两个点进行二分搜索ab,其中P u {s}如果我们插入边缘a - ss - b,就会变成凸的。搜索时间将是O(log |P|),假设恒定时间随机访问排序点。
  • 我添加了一个测试结果和一个更简单的近似方法。

标签: algorithm optimization computational-geometry convex-hull


【解决方案1】:

给定固定点 p = (px, py), q = (qx, qy) 和可变点 s = (sx, sy),三角形的有符号面积 ∆pqs 为

  |px py 1|
½ |qx qy 1|
  |sx sy 1| ,

这是sx,sy中的一个线性多项式。

一种方法是计算这些多项式的累积和,其中 p、q 是按顺时针顺序排列的边。使用二分搜索找到给定点 s 保留在凸包中的边的子列表,添加多项式并计算 s。

【讨论】:

    【解决方案2】:

    您有一种方法可以计算由点 n 添加的确切面积(David Eisenstat 发布了另一个),但它们的复杂性取决于多边形的边数。理想情况下,您应该有一种可以快速逼近附加区域的方法,并且您只需对有限数量的点运行精确的方法。

    正如保罗在评论中指出的那样,这样的近似值应该给出始终大于实际值的结果;这样,如果近似值告诉您一个点增加的面积小于当前最大值(对于随机排序的输入,大多数点都是如此),您可以丢弃它而无需确切的方法。

    最简单的方法是只测量多边形中每个点到一个点的距离;这可以做到,例如像这样:

    首先计算多边形的面积,然后找到包含整个多边形的最小圆,圆心为c,半径为r

    然后对于每个点n,计算nc的距离d,并近似附加区域为:

    • 面积为r × (d - r) 的三角形
    • 加上面积为 2 × r 2 的矩形(预先计算)
    • 加上面积为r × π的半圆(预先计算)
    • 减去多边形的面积(预先计算)

    该区域在下图中以蓝色表示,真实的附加区域稍暗,通过近似值添加的多余区域稍亮:

    因此对于每个点,您需要使用 √ ((xn - xc)2 + (yn - yc)2 ),然后将这个距离乘以一个常数并加上一个常数。

    当然,这种近似的精度取决于多边形的形状有多不规则;如果它根本不像一个圆,您最好创建一个包含原始多边形的较大的简单多边形(如三角形或矩形),并在较大的多边形上使用精确方法作为近似值。


    更新

    在一个简单的测试中,多边形是 100x100 正方形空间中间的 1x1 正方形,周围随机放置 100,000 个点,上述方法将精确测量函数的调用次数从 100,000 减少到 150 之间和 200 次,其中 10 到 20 次调用会产生新的最大值。

    在为测试中使用的正方形编写精确测量函数时,我意识到使用轴对齐的矩形而不是围绕多边形的圆会导致更简单的近似方法:

    在多边形周围创建一个矩形,边为 AB,中心点为 c,并计算矩形的面积和多边形。那么,对于每个点n,附加面积的近似值就是:

    • 底边为 A 高度为 abs(yn - yc) - B/2 的三角形
    • 底边为 B 高度为 abs(xn - xc) - A/2 的三角形
    • 矩形的面积减去多边形的面积

    (如果点在矩形的上方、下方或旁边,则其中一个三角形的高度

    所以近似所需的步骤是:

    abs(xn - xc) × X + abs(yn - yc) × Y + Z

    其中 X、Y 和 Z 是常数,即 2 个减法、2 个加法、2 个乘法和 2 个绝对值。这比圆形方法更简单,矩形也更适合长方形多边形。精确测量函数调用次数的减少应该与上面提到的测试结果相似。

    【讨论】:

      猜你喜欢
      • 2015-07-11
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 2012-04-07
      • 1970-01-01
      • 2011-08-18
      相关资源
      最近更新 更多