假设您有一个凸多边形P
(由一组点p
定义)和一组点S
(所有这些都在P
之外) ,您如何选择一个点s in S
,使其增加P
区域的最大值。
例如
我有一个O(| P |)公式来计算多边形的面积,但我不能为S
中的每一个点做这个
3 ≤ |P|, |S| ≤ 10^5
大点是S
中的点
P u S
中没有3个点是共线的
答案 0 :(得分: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。
答案 1 :(得分:0)
您有一种方法可以计算由点 n (而David Eisenstat发布的另一个)添加的确切区域,但它们的复杂性取决于多边形的边数。理想情况下,你有一个方法可以快速逼近附加区域,你只需要为有限数量的点运行精确的方法。
正如保罗在评论中指出的那样,这种近似应该给出一个始终大于实际值的结果;这样,如果近似值告诉您一个点增加的面积小于当前最大值(并且随机排序的输入对于大多数点都是如此),您可以丢弃它而不需要精确的方法。
最简单的方法是只测量多边形中每个点到一个点的距离;这可以做到,例如像这样:
首先计算多边形的面积,然后找到包含整个多边形的最小圆,其中心点为 c ,半径为 r 。
然后对于每个点 n ,计算从 n 到 c 的距离 d ,并估算附加值区域为:
这个区域在下面的图像上以蓝色显示,实际的附加区域稍微偏暗,并且近似区域添加的多余区域稍微亮一些:
因此,对于每个点,您需要使用√(( x n - x c ) 2 +( y n - y c ) 2 )然后将此距离乘以常数并添加常量。
当然,这种近似的精确度取决于多边形的形状有多么不规则;如果它根本不像一个圆,你可能最好创建一个包含原始多边形的较大的简单多边形(如三角形或矩形),并使用较大多边形上的精确方法作为近似值。
更新
在一个简单的测试中,多边形在100x100平方空间的中间是1x1正方形,在其周围随机放置100,000个点,上述方法将精确测量函数的调用次数从100,000减少到150之间200和这些调用之间的10到20之间会产生新的最大值。
在为测试中使用的方形编写精确测量功能时,我意识到使用轴对齐矩形而不是多边形周围的圆形会导致更简单的近似方法:
在多边形周围创建一个矩形,边为 A 和 B ,中心点为 c ,并计算矩形的面积和多边形。然后,对于每个点 n ,附加区域的近似值是:
(如果该点位于矩形的上方,下方或旁边,则其中一个三角形的高度<0,并且仅添加另一个三角形。)
所以近似所需的步骤是:
abs(x n - x c )×X + abs(y n - y c ) ×Y + Z
其中X,Y和Z是常数,即2次减法,2次加法,2次乘法和2次绝对值。这比圆形方法更简单,矩形也更适合椭圆形多边形。对精确测量功能的调用次数的减少应与上述测试结果类似。