如何对二维多边形进行二次采样?
Posted
技术标签:
【中文标题】如何对二维多边形进行二次采样?【英文标题】:How to subsample a 2D polygon? 【发布时间】:2011-07-26 19:39:30 【问题描述】:我有定义英国郡县轮廓的多边形。这些形状非常详细(每个 10k 到 20k 点),因此渲染相关计算(多边形 P 中的点 X 吗?)的计算量非常大。
因此,我想对我的多边形进行“二次采样”,以获得相似的形状但点数更少。有哪些不同的技术可以做到这一点?
最简单的方法是每N
点取一个(因此按因子N
进行二次抽样),但这感觉太“粗鲁”了。我宁愿做一些平均分,或者类似的东西。任何指针?
【问题讨论】:
【参考方案1】:我想到了两个解决方案:
1) 由于英国的地图相当方正,您可以选择渲染带有县的位图。为每个指定颜色,然后用 1 或 2 像素粗的黑线渲染边框。这意味着如果样本恰好位于边界上,您只需执行昂贵的内部/外部计算。位图越大,这种情况发生的频率就越低。
2) 简化县域大纲。您可以使用递归Ramer–Douglas–Peucker 算法递归地简化边界。只要确保你缓存结果。您可能还必须解决这个问题,而不是针对整个县边界,而是仅针对共享边界,以确保没有间隙。这可能很棘手。
【讨论】:
好主意!对于差距,我的初始数据已经在不同的多边形之间有重叠,所以我想这不会是一个问题。 请参阅 psimpl.sf.net 了解 C++ 库,该库提供多种简化算法的实现,包括 douglas-peucker。【参考方案2】:Here 你可以找到一个项目来解决你的问题。虽然它主要适用于由点“填充”的区域,但您可以将其设置为与您的“周长”类型定义一起使用。
它使用 k 最近邻方法来计算区域。
样本:
Here您可以索取论文的副本。
似乎他们planned to offer an online service 请求计算,但我没有测试它,可能它没有运行。
HTH!
【讨论】:
【参考方案3】:Polygon triangulation 应该在这里提供帮助。您仍然需要检查许多多边形,但这些现在是三角形,因此它们更容易检查,您可以使用一些优化来确定只有一小部分多边形来检查给定的区域或点。
您似乎拥有多边形所需的所有算法,不仅适用于三角形,您还可以合并几个在三角剖分后太小或三角形计数过高的三角形。
【讨论】:
好吧,检查点是否在多边形中的函数不是我的(我使用内置的 mysql 空间函数),所以我无法真正影响它。但是感谢您的信息! @Wookai:即使你不能改变函数,如果使用不太复杂的多边形,它们应该会更快。以上是关于如何对二维多边形进行二次采样?的主要内容,如果未能解决你的问题,请参考以下文章