Ordenar un conjunto de puntos no organizados a lo largo de una curva

9

Tengo un conjunto de puntos 3D (que recupero de una biblioteca que realiza la teselación de un cuerpo sólido) que pertenecen a una curva (es decir, un borde del sólido). Eso significa que la curva seguramente pasa por cada uno de estos puntos.

Sin embargo, el conjunto de puntos no está ordenado, así que necesito ordenarlos para poder dibujar esta curva correctamente.

¿Existe algún enfoque conocido para este tipo de problema?

Alguna información adicional:

  • Las curvas son paramétricas en general (splines / bezier, cortes de círculo ...).
  • Los puntos se dan como coordenadas de coma flotante.
  • Los puntos están muy densos (pero pueden ser tan densos como yo quiero que sea). Para darle una idea, para una curva que ocupa 19 unidades en x, 10 unidades en x y 5 unidades en z, cito una secuencia de puntos en un segmento de curva: (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)
andrea.al
fuente
Incluso si sabemos que el orden existe hasta un número infinito de curvas que se ajustan a través de los puntos. Incluso si agregamos restricciones adicionales, los extremos abiertos son problemáticos ya que su orientación tangente puede ser arbitraria. Una foto aquí
joojaa
@joojaa Sí, tienes razón. Pero como el empaque de los puntos es muy denso, no espero que sea exacto. Si llego a tener el orden correcto, estaba planeando conectar la secuencia de puntos como una polilínea.
andrea.al
En el código que necesita ordenar los puntos, ¿eres consciente de la forma paramétrica de la curva? (Si no, eliminaré mi primera respuesta, porque requiere que sepas la forma paramétrica.)
Martin Ender
@ MartinBüttner Sí, tengo acceso a la forma paramétrica de la curva, si es necesario.
andrea.al
1
¡Por favor muestre un conjunto de puntos típico!
Yves Daoust

Respuestas:

6

Tiene una instancia de un problema llamado reconstrucción de curva desde puntos no organizados . Ahora que sabe qué buscar, encontrará varios métodos, como la corteza, la corteza NN, etc. Aquí hay algunos enlaces:

Como se trata de curvas y las muestras son densas, le sugiero que calcule un árbol de expansión mínima euclidiana.

lhf
fuente
4

Después de algunas aclaraciones, probablemente haya un enfoque mucho mejor que ni siquiera requiere conocer la forma paramétrica de la curva, y también evita el paso de minimización numérica potencialmente problemático.

Si la curva no se cruza y los puntos están suficientemente densamente empaquetados en la curva (y con eso quiero decir que tienen que estar más cerca que cualquiera de los dos puntos de la curva que no pertenecen al mismo segmento, por ejemplo, por el envoltorio de la curva alrededor de sí mismo), luego puede determinar fácilmente el punto anterior y siguiente de cada muestra:

  • O(nlogn)
  • Tendrá que hacer un tratamiento especial para los puntos finales. Sus dos vecinos más cercanos serán los siguientes dos puntos a lo largo de la curva en lugar de uno en cada lado. Puede detectarlos heurísticamente si la relación de las distancias a los dos vecinos difiere en más de un umbral (1.5, por ejemplo, depende de la suavidad de su curva y de la densidad de los puntos). O puede tratar los datos de su vecino más cercano como un gráfico, en el que encontrará que los dos vecinos de los puntos finales se apuntan entre sí (lo que no debería suceder en ningún otro lugar del gráfico).
  • Ahora puede simplemente elegir un punto final y caminar a lo largo de los vecinos más cercanos (siempre eligiendo el que no llegó) para recorrer los puntos a lo largo de la curva.

θ

Martin Ender
fuente
3

(X,Y,Z)(x(t),y(t),z(t))

(Xx(t))2+(Yy(t))2+(Zz(t))2

t

ttt

Martin Ender
fuente