将多边形分割为小多边形,每个多边形包含 1 个点



我不确定这个算法是否存在,如果有人能给我提供算法的名称,我将不胜感激,那么我可以谷歌一下。

基本上,假设我在多边形(凸面和凹面(中有 N 个点,并且我想有一种方法/算法将这个多边形分成 N 个多边形,每个 N 个多边形只包含 1 个点。

谢谢。

我不愿意将其作为答案发布,但它不适合评论。在 GIS 世界中,这有时被称为 voronoi 算法。大多数 GIS 工具(如 ESRI ArcMap (都可以根据一组点生成维罗诺伊波尔贡。对于您的用例,我认为您可以使用下面链接中的包(兼容(从您的点创建一个 veronoi 多边形集,然后获取该输出,并进行一些花哨的空间连接以将您的多边形替换为多个多边形。

这是描述该概念的维基百科页面的链接

http://en.wikipedia.org/wiki/Voronoi_diagram

此外,Delaunoy 三角测量是您可能想要查看的另一种方法

http://www.spatialdbadvisor.com/oracle_spatial_tips_tricks/283/application-of-delaunay-triangulation-and-inverse-distance-weighting-idw-in-oracle

这是另一个链接,其中包含提到的st_veronoi功能,并链接到上述链接。http://www.spatialdbadvisor.com/source_code/223/geoprocessing-package-documentation

这个包的基础似乎是Java JTS,它显然是在Oracle的Java存储过程中编译的。JTS是Java中几何操作的"标准"。我想我会自己试一试。

请记住,我只使用像 ArcGIS 这样的工具来完成此操作,而不是使用我上面提到的任何内容。所以HTH和我不会带你进入老鼠洞。

我不能给你一个名字,但可以描述三种不同的算法

我将把给你的一组点称为"目标"以简化我的解决方案,因为我想调用普通"点"上的任意位置:

您将在 2 向量上做很多算术

我对多边形进行分区的算法很简单:找到最近的目标。

最靠近任何目标的点集将具有直边。 顶点将与三个(或更多(目标等距(或位于边与边界多边形相交的位置(,

您的算法可能是这样的:

原始目标集与自身交叉两次,以产生一组三元组,拒绝那些不能与三个不同目标相对应的三元组。

对于每组三个,如果该点更接近任何其他目标,请找到与所有三个目标等距的点,请将其拒绝。

最终,您将拥有(最多(n-2个顶点,然后您只需要弄清楚边是如何连接的。 您可以通过查看哪些目标生成了每个顶点来做到这一点。

现在您需要添加以无穷大结束的边缘,这些边缘需要目标和自身的交叉并找到每对目标之间的中间点,任何没有两个最近目标的点都可以被拒绝,这些 pont 中的每一个代表一条线(垂直平分线(,它将在一个顶点或无穷远处结束

最后使用边界多边形修剪地图,您可能希望从不包含目标的任何片段中删除一条边


另一种方式

另一方面,您可以使用分形分区方案将多边形划分为块,将每个块划分为更小的块,直到它包含一个多边形,结果在美学上会不太令人愉悦,但外观不是 AFAICT 的设计要求。

例如,用于 IP 地址的分形映射。

然后将坐标转换为数字,在方便的点将其分成块,(即通过删除不需要的尾随 1(


另一种方式

测量一组目标的范围,如果它比它高 画一条垂直的线,将其分成两半,否则水平绘制。如果点燃的热点燃了其中一个目标,请调整它以使其错过。

对每半重复,直到六重奏为零(这意味着一个点(

你没有提到对包含多边形的形状有任何限制,所以我假设你不在乎。我还假设我们处于二维空间,尽管这很容易扩展。这个想法很简单:通过在 x 轴上相邻点之间的中间点之间使用垂直条带切割初始多边形来创建新的多边形。如果点共享 x 坐标,请在 y 轴上的点之间用垂直切片拆分包含它们的条带。

如果长而薄的切片不适合您,请使用 markg 的建议。

最新更新