Answers:
这个问题有许多有效的解决方案。其中之一的工作方式与您的描述有点类似,但是您不必以“随机”位置对多边形进行切片的方式,而是可以通过故意设计的方式来最大程度地减少计算量。
这是基本算法。 它的输入包括任何平面扫描方向,非零区域的多边形P,零与多边形区域之间的目标区域a和非负阈值t(以面积为单位)。其目的是为了分裂P与线垂直于扫掠方向分成两个部分,一个到行的右边,而另一对线的左侧,使得右手区域和目标区域之间的差一个没有大于t。
令L为垂直于扫描方向的任何定向线。将f(L)定义为在L右侧找到的P的面积减去a。用这些术语,任务是找到f的零。因为f不太可能是可微的,而是连续的,所以请使用二分法,割线法或-我最喜欢的-Brent方法。所有这些都很简单,可以保证融合。使用t作为参数的收敛容限。
而已。让我们考虑一下如何对此进行编码。根本发现是常规的-您可以为其使用通用代码-因此GIS的工作归结为编码f。这样做需要
1. Splitting the polygon by a line.
2. Computing the area of the piece(s) to the right of the line.
几乎在任何基于矢量的GIS中都实现了这两种操作。如果不是,则可以用一个很大的矩形代替该线,该矩形代表该线右边的半平面。步骤1变成
1'. Clip the polygon to the rectangle.
这是一个非常基本的操作。
要开始查找根,您需要找到一个保证f的零位于的时间间隔。这很容易:将多边形的包络线(“边界框”)投影到线扫的方向。投影是您想要的间隔。
这个问题历史悠久。我很早以前就为ArcView 3.x实现了该算法,并在旧的ESRI用户论坛中对其进行了多次描述。谷歌
Huber分割多边形site:forums.esri.com
为了便于讨论,提供了代码链接,增强功能和变体(例如将多边形分成所需尺寸的尽可能紧凑的部分)以及栅格数据的算法。
这是美国大陆各州的样子(以相等的面积投影),每个州的底部三分之一都被阴影了。显然,扫掠方向是垂直的。