Algorithm 将多边形分成两等份

Algorithm 将多边形分成两等份,algorithm,polygons,Algorithm,Polygons,我有一个凸多边形,我想得到一条平行于X轴的线,它把多边形分成两个相等的区域。 我已尝试实现以下功能(对于X轴): 0按Y坐标递增顺序对多边形的所有顶点排序。 1.得到具有最小Y坐标的点P。 2.通过穿过P的垂直线分割多边形。 3.遍历所有顶点,将x>P.x的所有顶点添加到q数组,并将所有其他顶点添加到P数组 4.遍历所有顶点的数组,查看当前顶点所属的位置以及它可以投影到哪条线上。 5.计算我得到的梯形的面积 更新: 我决定选择2个顶点:Y坐标的最大值和最小值,以及它们所给的直线,将所有顶点分成2

我有一个凸多边形,我想得到一条平行于X轴的线,它把多边形分成两个相等的区域。 我已尝试实现以下功能(对于X轴): 0按Y坐标递增顺序对多边形的所有顶点排序。 1.得到具有最小Y坐标的点P。 2.通过穿过P的垂直线分割多边形。 3.遍历所有顶点,将x>P.x的所有顶点添加到q数组,并将所有其他顶点添加到P数组 4.遍历所有顶点的数组,查看当前顶点所属的位置以及它可以投影到哪条线上。 5.计算我得到的梯形的面积

更新: 我决定选择2个顶点:Y坐标的最大值和最小值,以及它们所给的直线,将所有顶点分成2个数组p和q。 现在我需要按给定的比例划分梯形。如果我知道底座和高度,我怎么做? 如何按给定比例分割p1和p2顶点给定的梯形区域?

与另一个答案类似,只是二进制搜索操作较少,并且给出了准确的答案。对顶点的y坐标进行排序。设m和m为最小和最大y坐标。然后从中间顶点的y坐标y0开始,查看穿过它的线的面积是否相等。如果不是,则根据顶部或底部的面积是否更多,设置m=y0或m=y0。您将找到一个提供相等面积的顶点y坐标,或者找到两个相邻的顶点y坐标,其中一个提供顶部更多面积,另一个提供底部更多面积。所以你知道正确的分割点在这两个相邻的y坐标之间。根据正确分割线的位置以符号方式计算顶部和底部区域(可以这样做,因为分割线y坐标的范围不重叠任何顶点)。然后将两个面积表达式设置为相等,并求解正确的分割线。这种方法的优点是,您可以得到准确的答案,并且它最多只需要lg(n)二进制搜索操作,其中n是顶点数


如果对多边形进行三角形剖分,则最多会有n个三角形,每个三角形的面积可以在固定时间内预先计算,当您使用分割线对三角形进行切片并对生成的区域进行三角形剖分时,最多会产生O(n)个额外三角形,每个三角形的面积可以在固定时间内计算。因此,该算法的二进制搜索部分需要O(n logn)时间。最终计算(精确分裂线的求解)需要线性时间。所以总的时间复杂度是O(n logn)

以下是一种有效的方法:-

1. A horizontal line cut the convex polygon at exactly two points.
2. You can evaluate for each line segment forming the side of polygon 
   the interval of its y values.
3. Using these intervals you can easily determine the overlapping pairs of lines using sorting.
4. you now have interval of y values (y1,y2) and corresponding lines which are
   intersected within these interval.
5. Consider a pair of line (l1,l2) that are intersected by given y=k where y1<=k<=y2
6. x1 = (k-c1)/m1 and x2 = (k-c2)/m2
7. find difference between the areas of two polygons formed by them is to minimized.
8. minimize F(k) = (A1-A2)^2 = d/dk[(A1-A2)^2] = (A1-A2)*(d/dk(A1)-d/dk(A2)) = 0.
9. as F(K) is only single variable continuous function in interval [y1,y2] you can easily find its solution.
10. The given y=k is minimum for given interval for y.
11. record minimum value of absolute diff for all interval and select the one which is 
    minimum in all intervals.
使用顶点查找多边形区域:-

Finding overlapping intervals is O(nlogn) using sorting.
Finding minimum must take O(intervals*n).