【发布时间】:2014-12-02 23:54:47
【问题描述】:
我不确定这个算法是否存在,如果有人可以提供算法的名称,我会很感激,然后我可以谷歌它。
基本上假设我在一个多边形内有 N 个点(凸面和凹面),我想有一种方法/算法将这个多边形分成 N 个多边形,每个 N 个多边形只包含 1 个点。
谢谢。
【问题讨论】:
标签: algorithm split polygon point
我不确定这个算法是否存在,如果有人可以提供算法的名称,我会很感激,然后我可以谷歌它。
基本上假设我在一个多边形内有 N 个点(凸面和凹面),我想有一种方法/算法将这个多边形分成 N 个多边形,每个 N 个多边形只包含 1 个点。
谢谢。
【问题讨论】:
标签: algorithm split polygon point
我不愿意将此作为答案发布,但它不适合 cmets。 在 GIS 世界中,这有时被称为 voronoi 算法。大多数 GIS 工具,如 ESRI ArcMap 可以从一组点生成 veronoi polgons。对于您的用例,我认为您可以使用下面链接中的包(它是兼容的)从您的点创建一个 veronoi 多边形集,然后获取该输出,并进行一些花哨的空间连接,以用多个多边形替换您的多边形。
这是描述该概念的维基百科页面的链接
http://en.wikipedia.org/wiki/Voronoi_diagram
delaunoy 三角测量也是您可能想要研究的另一种方法
这里有另一个链接,其中提到了上面提到的 st_veronoi 函数。 http://www.spatialdbadvisor.com/source_code/223/geoprocessing-package-documentation
这个包的基础似乎是 java JTS,它显然是在 oracle 的 java 存储过程中编译的。 JTS 是 Java 中几何运算的“标准”。我想我会自己尝试一下。
请记住,我只使用 ArcGIS 之类的工具完成了这项工作,没有使用我上面提到的任何东西....所以 HTH 我不会把你带进老鼠洞。
【讨论】:
我不能给你一个名字,但可以描述三种不同的算法
我将调用给你的点集“目标”以简化我的解决方案,因为我想调用普通“点”上的任意位置:
您将在 2 向量上进行大量算术运算
我分割多边形的算法很简单:找到最近的目标。
最接近任何目标的点集将具有直边。顶点将与三个(或更多)目标等距(或边缘与边界多边形相交的位置),
你的算法可能是这样的:
将原始目标集与自身交叉两次以生成一组三元组,拒绝那些不包含三个不同目标的三元组。
对于每组三个找到与所有三个目标等距的点,如果该点更接近任何其他目标,则拒绝它。
最终您将拥有(最多)n-2 个顶点,然后您只需要弄清楚边是如何连接起来的。您可以通过查看生成每个顶点的目标来做到这一点。
现在您需要添加以无穷远结束的边缘,并交叉目标和自身 并找到每对目标之间的中点,任何没有两个最近目标的点都可以被拒绝,这些点中的每一个代表一条线(垂直平分线),它将在一个顶点或无穷远处结束
最后使用边界多边形修剪地图,您可能希望从任何不包含目标的片段中删除其中一条边
另一种方式
另一方面,您可以使用分形分区方案将多边形划分为多个块,将每个块划分得更小,直到它包含一个多边形,结果在美学上会不那么令人愉悦,但外观不是 AFAICT 的设计要求。
例如用于 IP 地址的分形映射。
然后将坐标转换为数字,然后在方便的点将其分成块,(即通过删除不需要的尾随 1)
另一种方式
测量一组目标的范围,如果它比它更宽,画一条垂直线将它分成两半,否则水平画。 如果点燃的目标之一变热,请调整它以使其未命中。
重复每一半,直到 extet 为零(这意味着一个点)
【讨论】:
您没有提到对包含多边形的形状有任何限制,所以我假设您不在乎。我还将假设我们处于二维中,尽管这可以很容易地扩展。这个想法很简单:通过在 x 轴上相邻点之间的中间用垂直条切割初始多边形来创建新多边形。如果点共享 x 坐标,则在 y 轴上的点之间用垂直切片分割包含它们的条带。
如果长而薄的切片不适合您,请使用 markg 的建议。
【讨论】: