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

时间:2014-12-02 23:54:48

标签: algorithm split polygon point

我不确定这个算法是否存在,非常感谢有人能提供算法的名称,然后我可以谷歌了。

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

感谢。

3 个答案:

答案 0 :(得分:1)

我不愿意将此作为答案发布,但它不符合评论。 在GIS世界中,这有时被称为voronoi算法。大多数GIS工具,如ESRI ArcMap,都可以从一组点生成veronoi polgons。对于您的用例,我认为您可以使用下面链接中的包(它兼容)从您的点创建一个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和我没有把你带到老鼠洞里。

答案 1 :(得分:0)

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

我将打电话给你给你的一组积分"目标"为了简化我的解决方案,我希望在平原上调用任意位置"点":

您将在2向量上进行大量算术

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

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

你的算法可能是这样的:

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

对于每组三个,如果该点更接近任何其他目标,则从所有三个目标中找到等距点。

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

现在你需要添加在无穷远处结束的边缘和目标本身 并且找到每对目标之间的中间点,任何不具有两个最近目标的点都可以被拒绝,这些前导中的每一个代表一条线(垂直平分线)并且它将在一个顶点或无限远处结束

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


另一种方式

另一方面,

可以使用分形分区方案将多边形划分为块,将每个块分割得更小,直到它包含单个多边形,结果将不那么美观,但看起来并不符合设计要求AFAICT。 / p>

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

然后将坐标转换为数字,将其划分为方便点的块(IE通过丢弃不需要的尾随1')


另一种方式

测量目标集的范围,如果它比它高则绘制一条直线将其划分为水平方向的一半。 如果被点燃的热点,其中一个目标会调整它,以免它错过。

重复每一半,直到外展为零(这意味着一个点)

答案 2 :(得分:0)

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

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

相关问题