在2D空间中对点进行排序以生成样条线

时间:2017-09-12 09:28:08

标签: python matlab computational-geometry

我有一系列分布在2D空间中的点。它们代表一种形状,但它们没有订购。因此,我可以将它们绘制为点,以便了解形状,但如果我绘制连接它们的线,我会错过形状,因为点的顺序不是正确的连接顺序。

我想知道,我怎么能把它们按正确的顺序排列,这样,如果我依次连接它们,我会得到一个样条线来显示它们所代表的形状?我在Matlab中找到并尝试了凸包,但没有结果。形状可能很复杂,例如星星和凸包,我得到的形状太简单了(很多点都没有考虑在内)。 谢谢你的帮助!

修改 可能是图像的一切。我随机创建了一个向你展示一个可能的案例,其中一些部分正在形成,而且点也可以有不同的距离。

我在Matlab中尝试过凸壳功能,这就是我得到的。每当轮廓有一个“尖角”时,我都会想念它,最终的形状不是我想要的。另外,Matlab函数没有设置参数来改变凸包结果(至少我在帮助中看不到任何东西)。

hull = convhull(coords(:,1),coords(:,2)); plot(coords(hull,1),coords(hull,2),'.r');

enter image description here

2 个答案:

答案 0 :(得分:1)

你需要以某种方式命令你的分数,所以它们可以按顺序排列;在你的绘图示例的情况下,可以使用最小距离,到下一个尚未使用的点来订购积分,从一端开始(您可能需要提供)结束)。

然后你可以绘制一个样条曲线,可能使用Chaikin's algorithm for curves来局部逼近贝塞尔曲线。

如果遇到困难,您需要开始处理此问题,并使用您的代码发布另一个问题。

答案 1 :(得分:0)

对于这个问题,Alpha形状可能比凸包更好。 Alpha形状将触及点云外部的所有点,甚至可以雕刻出洞。

但是对于复杂的形状重建,我建议你尝试在https://people.eecs.berkeley.edu/~jrs/meshpapers/AmentaBernEppstein.pdf

中讨论的beta-skeleton bsed方法

https://en.wikipedia.org/wiki/Beta_skeleton

查看有关β-骨架的更多详情

来自链接文章的引用:

  

基于圆的β骨架可以用于图像分析,以重建二维物体的形状,给定物体边界上的一组采样点(连接点的计算形式拼图在哪里点的连接顺序必须通过算法推导出来,而不是作为拼图的一部分给出。

     

有可能证明选择β= 1.7将正确地重建任何光滑表面的整个边界,并且不产生任何不属于边界的边缘,只要样本相对于表面的局部曲率

干杯