我有一组3D点(可以从执行实体细分的库中恢复),这些点属于曲线(即实体的边缘)。这意味着曲线肯定会经过这些点中的每一个。

但是,点集是无序的,因此我需要对其进行排序才能正确绘制此曲线。

是否有解决此类问题的已知方法?片..)。
这些点以浮点坐标的形式给出。
这些点被非常密集地打包(但是它们可以像我想要的那样密集)。为了让您有个想法,对于一条曲线,它在x中占19个单位,在x中占10个单位,在z中占5个单位,我引用了曲线段中的一系列点:(20.7622,25.8676,0)(20.6573,25.856, 0)(20.5529,25.8444,0)(20.4489,25.8329,0)(20.3454,25.8213,0)


评论

即使我们知道顺序,也可以找到无数个符合点的曲线。即使我们添加了其他约束,由于其切线方向可以是任意的,因此开口端也存在问题。图片在这里

@joojaa是的,您是对的。但是由于点的打包非常密集,所以我不希望它是精确的。如果我确实要有正确的顺序,则我打算将点的序列连接为折线。

在需要对点进行排序的代码中,您是否还知道曲线的参数形式? (如果没有,我将删除我的第一个答案,因为它要求您知道参数形式。)

@MartinBüttner是的,如果需要,我可以访问曲线的参数形式。

请显示典型的点集!

#1 楼

您有一个问题的实例,即从无序点重建曲线。现在您知道要搜索什么,您将找到几种方法,例如地壳,NN-地壳等。以下是一些链接:


Crust Curve Reconstruction Applet
Tamal Dey的曲线重构
曲线和曲面重构:带有数学分析的算法,Tamal K. Dey着,剑桥大学出版社,2006年

因为您要处理曲线和样本很密集,建议您计算一个欧几里得最小生成树。

#2 楼

经过澄清后,可能有一种更好的方法,它甚至不需要知道曲线的参数形式,而且还避免了可能出现问题的数值最小化步骤。

如果曲线本身不相交,并且点在曲线上足够密集地堆积(这意味着它们必须比不属于曲线的任意两个点更近相同的线段(例如,通过自身环绕的曲线),则可以轻松确定每个样本的上一个和下一个点:


确定每个点的两个最近邻居。这是$ O(n \ log n)$操作。
您必须对端点进行一些特殊处理。他们的两个最近的邻居将是曲线上的下两个点,而不是每一侧的两个点。如果到两个邻居的距离之比相差超过某个阈值(1.5,取决于曲线的平滑度和点的密集程度),则可以通过启发式检测。或者,您可以将最近的邻居数据视为一个图形,在该图中,您会发现端点的两个邻居彼此指向对方(不应在图中的其他任何地方发生)。选择一个端点,然后沿着最近的邻居走(总是选择您从未到达的端点)来遍历曲线上的各个点。

特别是如果您可以使这些点非常密集,则应该除非曲线自相交,否则为最可靠的选择。即使在那种情况下,如果自相交处于足够大的角度且曲线足够平滑,这种方法还是可以解决的(在这种情况下,您可以基于一些限制,即连续步长不能使角度大于某个阈值而选择正确的邻居) $ \ theta $)。

#3 楼

由于您只有点的浮点表示形式,因此不能保证由于舍入误差而使这些点仍然精确地位于曲线上。因此,我认为唯一通用的方法是通过找到曲线上与样本$(X,Y,Z)$的最接近点来近似曲线上的位置。例如。如果您的参数曲线是$(x(t),y(t),z(t))$,则可以尝试将

$$
(Xx(t))^最小化2+(Yy(t))^ 2+(Zz(t))^ 2
$$

关于$ t $。如果您知道要处理的曲线类型,可能会有很好的解析解决方案,否则,您将不得不求助于某种数值算法。由于您的点应该非常接近曲线,因此该方法应该是可靠的(前提是最小化算法是这样),除非您在曲线(几乎)相交的确切位置上有一个样本。但是,在那种情况下,您可能还是运气不佳。

一旦每个点都有$ t $,您只需按$ t $对其进行排序。当然,如果您可以控制接收点的方式,则可以在生成点时立即返回$ t $以及点的坐标,从而避免所有麻烦。