我有一个详细的2D多边形(代表一个地理区域),它由一组非常大的顶点定义。我正在寻找一种算法,它将简化和平滑多边形(减少顶点的数量),其约束条件是生成的多边形的区域必须包含详细多边形的所有顶点。 / p>
对于上下文,这是一个复杂多边形边缘的示例:
我的研究:
我找到了Ramer-Douglas-Peucker算法,它将减少顶点的数量 - 但生成的多边形将不包含所有原始多边形的顶点。请参阅此文Ramer-Douglas-Peucker on Wikipedia
我考虑过扩展多边形(我相信这也称为向外多边形偏移)。我发现了以下问题:Expanding a polygon (convex only)和Inflating a polygon。但我认为这不会大幅减少多边形的细节。
感谢你给我的任何建议!
答案 0 :(得分:18)
修改
截至2013年,以下大多数链接不再起作用。但是,我找到了the cited paper, algorithm included, still available at this (very slow) server。
Here您可以找到一个完全解决您问题的项目。虽然它主要用于由点“填充”的区域,但您可以将其设置为与您的“周边”类型定义一起使用。
它使用k近邻法计算区域。
样品:
Here您可以索取该文件的副本。
看起来他们planned to offer an online service请求计算,但我没有测试它,可能它没有运行。
HTH!
答案 1 :(得分:1)
这是一个有趣的问题!我从来没有尝试过这样的事情,但是这里有一个我头脑中的想法...如果没有意义或不行则道歉:)
每个级别的递归应该给出更好的近似....当你达到令人满意的水平时,合并该水平的所有外壳以获得最终的多边形。
这听起来像是可以完成这项工作吗?
答案 2 :(得分:1)
我遇到了一个非常类似的问题:我需要对多边形进行充气简化。
我做了一个简单的算法,通过去除凹点(这将增加多边形大小)或去除凸边(在两个凸点之间)和延长相邻边。在任何情况下,执行这两种可能性中的一种将删除多边形上的一个点。
我选择移除导致最小区域变化的点或边缘。您可以重复此过程,直到您可以进行简化(例如,不超过200个点)。
两个主要的困难是获得快速算法(通过避免两次计算顶点/边缘去除变化并保持可能的排序)并避免在过程中插入自相交(不是很容易做到和解释但可能与计算复杂度有限。)
事实上,在仔细观察之后,它与Visvalingam相似,并且适合去除边缘。
答案 3 :(得分:0)
在某种程度上,我不确定你要做什么,但似乎你有两个非常好的答案。一个是Ramer-Douglas-Peucker(DP),另一个是计算alpha形状(也称为凹面船体,非凸面船体等)。我发现了一篇更新的论文,描述了alpha形状并将其链接在下面。
我个人认为带有多边形扩展的DP是可行的方法。我不确定为什么你认为它不会大幅减少顶点的数量。使用DP,您可以提供一个因子,无论您输入什么,您都可以随心所欲地制作任何想要的三角形。挑选这个因素可能很难,但在你的情况下,我认为这是最好的方法。您应该能够根据要消失的最大细节的大小来确定因子。您可以通过直接测试或从源数据计算来完成此操作。
http://www.it.uu.se/edu/course/homepage/projektTDB/ht13/project10/Project-10-report.pdf
答案 4 :(得分:0)
我认为Visvalingam’s algorithm可以用于此目的 - 跳过删除会减少面积的三角形。
答案 5 :(得分:0)
我写了道格拉斯·皮克(Douglas-Peucker)的简单修改,可能对将来遇到此问题的任何人都有用:https://github.com/prakol16/rdp-expansion-only
与DP相同,不同之处在于,如果要删除的点在多边形之外,则会将线段向外一点推动。这样可以保证所生成的简化多边形包含所有原始多边形,但是它具有与原始DP算法几乎相同的线段数,并且通常在近似原始形状方面相当出色。