Algorithm 给定一个凸多边形,添加一个点并重新计算面积

Algorithm 给定一个凸多边形,添加一个点并重新计算面积,algorithm,optimization,computational-geometry,convex-hull,Algorithm,Optimization,Computational Geometry,Convex Hull,假设您有一个凸多边形p(由点数组p定义)和一组点S(它们都在p之外),如何在S中选择一个点S,以使p的面积最大化。 示例 我有一个O(| P |)公式来计算多边形的面积,但我不能对S中的每个点都这样做 3 ≤ |P|, |S| ≤ 10^5 大圆点是S中的点 pus中没有3个点是共线的您可以使用一种方法来计算由点n(和David Eisenstat发布的另一个点)添加的确切面积,但其复杂性取决于多边形的边数。理想情况下,你会有一个方法,可以快速近似额外的面积,你只需要运行有限数量的点的确切方

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

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

大圆点是S中的点

pus
中没有3个点是共线的

您可以使用一种方法来计算由点n(和David Eisenstat发布的另一个点)添加的确切面积,但其复杂性取决于多边形的边数。理想情况下,你会有一个方法,可以快速近似额外的面积,你只需要运行有限数量的点的确切方法

正如Paul在评论中指出的那样,这样一个近似值应该给出一个始终大于实际值的结果;这样,如果近似值告诉您一个点增加的面积小于当前最大值(并且对于大多数点来说,随机顺序输入是正确的),您可以放弃它,而无需使用精确的方法

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

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

然后,对于每个点n,计算从n到c的距离d,并将附加面积近似为:

  • 面积为r×(d-r)的三角形
  • 加上面积为2×R2的矩形(预先计算)
  • 加上面积为r×π的半圆(预先计算)
  • 减去多边形的面积(预计算)
该区域在下图中以蓝色表示,实际附加区域略暗,近似值添加的多余区域略亮:

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

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


更新

在一个简单的测试中,多边形在100x100平方米的中间是1x1平方,在其周围随机放置100000个点,上述方法减少了从100000到150到200的精确测量函数的调用数,10到20的调用导致了新的最大值。p> 在为我在测试中使用的正方形编写精确的测量函数时,我意识到使用轴对齐的矩形而不是多边形周围的圆可以得到更简单的近似方法:

围绕多边形创建一个矩形,边a和B以及中心点c,并计算矩形和多边形的面积。然后,对于每个点n,附加面积的近似值为:

  • 带底部A和高度abs(yn-yc)-B/2的三角形
  • 带底部B和高度abs(xn-xc)-A/2的三角形
  • 矩形的面积减去多边形的面积
(如果该点位于矩形上方、下方或旁边,则其中一个三角形的高度小于0,并且仅添加另一个三角形。)

因此,近似所需的步骤如下:

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

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

给定不动点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。

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