给定平面上的一组点,对于给定的正数alpha,alpha形状的概念通过找到Delaunay三角剖分并删除任何至少一条边的长度超过alpha的三角形来定义。下面是一个使用d3的例子:
http://bl.ocks.org/gka/1552725
问题是,当有成千上万个点时,简单地绘制所有内部三角形对于交互式可视化来说太慢了,所以我想只找到边界多边形。这并不简单,因为正如你从那个例子中看到的,有时可能有两个这样的多边形。
为了简化,假设已经执行了一些聚类,以保证每个三角剖分都有一个唯一的边界多边形。找到这个边界多边形的最佳方法是什么?特别是,边缘必须一致地排序,并且它必须支持“洞”的可能性(想想环面或甜甜圈形状-这在GeoJSON中可以表达)。
8条答案
按热度按时间zphenhs41#
下面是一些Python代码,可以满足您的需要。我修改了here的alpha形状(凹船体)计算,使其不插入内边(
only_outer
参数)。我还使其自包含,使其不依赖于外部库。字符串
如果你运行下面的测试代码,你会得到this figure:
型
waxmsbnn2#
1.创建一个图,其中节点对应于Delaunay三角形,并且当且仅当两个三角形共享两个顶点时,两个三角形之间存在图边。
1.计算图的连通分量。
1.对于每个连通分支,找到所有相邻节点少于3个的节点(即度为0、1或2的节点)。这些节点对应于边界三角形。我们将边界三角形的边定义为该边界三角形的边界边。
作为一个例子,我在你的“问号”Delaunay三角剖分示例中突出显示了这些边界三角形:
的数据
根据定义,每个边界三角形最多与另外两个边界三角形相邻。边界三角形的边界边形成循环。您可以简单地遍历这些循环来确定边界的多边形形状。如果在实现中记住了这些,这也适用于带孔的多边形。
e4eetjau3#
我知道这是一个延迟的答案,但这里张贴的方法没有为我工作的各种原因。
上面提到的包Alphashape总体上是不错的,但它的缺点是它使用Shapely的
cascade_union
和三角测量方法来给予最终的凹形船体,这对于大型数据集和低alpha值来说非常慢(高精度)。在这种情况下,Iddo Hanniel发布的代码(以及Harold的修订版)将在内部保留大量的边缘,唯一的方法是使用前面提到的cascade_union
和Shapely的三角剖分。我通常使用复杂的表单,下面的代码运行良好,速度很快(100K 2D点需要2秒):
字符串
6qfn3psc4#
现在有一个非常容易使用的python包alphashape,可以通过
pip
或conda
安装。main函数的输入与@Iddo Hanniel给出的答案类似,调整第二个位置参数将为您提供所需的轮廓。或者,您可以将seconda位置参数留空,函数将为您优化该参数,以提供最佳凹船体。请注意,如果让函数优化值,则计算时间会大大增加。
nxagd54h5#
对Hanniel's answer的轻微修改,用于3d点的情况(四面体)。
字符串
xggvc2p66#
TopoJSON有一个合并算法,它只执行以下任务:https://github.com/mbostock/topojson/wiki/API-Reference#merge
甚至有一个例子显示了它的作用:http://bl.ocks.org/mbostock/9927735
在我的例子中,生成TopoJSON数据对我来说很容易,这个库函数完美地完成了我的任务。
brgchamk7#
在@Timothy的回答的基础上,我使用以下算法来计算Delaunay三角剖分的边界环。
字符串
vwhgwdsa8#
Alpha形状定义为没有超过alpha的边的Delaunay三角剖分。首先删除所有内部三角形,然后删除所有超过alpha的边。