沿曲线排序一组无序点


9

我有一组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

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

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

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

1
请显示一个典型的点集!
Yves Daoust

Answers:



4

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

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

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

θ


3

XÿžXŤÿŤžŤ则可以尝试最小化

X-XŤ2+ÿ-ÿŤ2+ž-žŤ2

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

ŤŤŤ

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.