Ordonner un ensemble de points non organisés le long d'une courbe

9

J'ai un ensemble de points 3D (que je récupère d'une bibliothèque qui effectue la tessellation d'un corps solide) qui appartiennent à une courbe (c'est-à-dire un bord du solide). Cela signifie que la courbe passe sûrement par chacun de ces points.

Néanmoins, l'ensemble de points n'est pas ordonné, je dois donc les trier afin de pouvoir tracer correctement cette courbe.

Existe-t-il une approche connue pour ce type de problème?

Quelques informations supplémentaires:

  • Les courbes sont paramétriques en général (splines / bezier, rondelles de cercle ..).
  • Les points sont donnés sous forme de coordonnées à virgule flottante.
  • Les points sont très denses (mais ils peuvent être aussi denses que je le souhaite). Pour vous donner une idée, pour une courbe qui occupe 19 unités en x, 10 unités en x et 5 unités en z, je cite une séquence de points dans un segment de courbe: (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
la source
Même si nous connaissons leur ordre jusqu'à un nombre infini de courbes qui correspondent aux points. Même si nous ajoutons des contraintes supplémentaires, les extrémités ouvertes sont problématiques car leur orientation tangente peut être arbitraire. Une photo ici
joojaa
@joojaa Oui, vous avez raison. Mais comme l'emballage des points est très dense, je ne m'attends pas à ce qu'il soit exact. Si j'arrive à avoir le bon ordre, je prévoyais de connecter la séquence de points sous forme de polyligne.
andrea.al
Dans le code qui doit ordonner les points, connaissez-vous même la forme paramétrique de la courbe? (Sinon, je supprimerai ma première réponse, car elle nécessite que vous connaissiez la forme paramétrique.)
Martin Ender
@ MartinBüttner Oui, j'ai accès à la forme paramétrique de la courbe, si nécessaire.
andrea.al
1
Veuillez montrer un ensemble de points typique!
Yves Daoust

Réponses:

6

Vous avez une instance d'un problème appelé reconstruction de courbe à partir de points non organisés . Maintenant que vous savez quoi chercher, vous trouverez plusieurs méthodes, telles que la croûte, la croûte NN, etc. Voici quelques liens:

Puisque vous avez affaire à des courbes et que les échantillons sont denses, je vous suggère de calculer un arbre couvrant minimal euclidien.

lhf
la source
4

Après quelques clarifications, il existe probablement une bien meilleure approche qui ne nécessite même pas de connaître la forme paramétrique de la courbe, et évite également l'étape de minimisation numérique potentiellement problématique.

Si la courbe ne se recoupe pas et que les points sont suffisamment denses sur la courbe (et j'entends par là qu'ils doivent être plus proches que deux points de la courbe qui n'appartiennent pas au même segment, par exemple par l'enroulement de la courbe autour de lui-même), vous pouvez facilement déterminer le point précédent et suivant de chaque échantillon:

  • Déterminez les deux voisins les plus proches de chaque point. C'est un opérationO(nlogn) .
  • Vous devrez effectuer un traitement spécial pour les points finaux. Leurs deux voisins les plus proches seront les deux prochains points le long de la courbe au lieu d'un de chaque côté. Vous pouvez soit les détecter heuristiquement si le rapport des distances aux deux voisins diffère de plus d'un certain seuil (1,5, par exemple, dépend de la finesse de votre courbe et de la densité des points). Ou vous pouvez traiter vos données de voisin le plus proche comme un graphique, dans lequel vous constaterez que les deux voisins des points de terminaison pointent l'un vers l'autre (ce qui ne devrait pas se produire ailleurs dans le graphique).
  • Maintenant, vous pouvez simplement choisir un point final et marcher le long des voisins les plus proches (en choisissant toujours celui dont vous n'êtes pas arrivé) pour parcourir les points le long de la courbe.

Surtout si vous pouvez rendre les points très denses, cela devrait être l'option la plus fiable, sauf si la courbe s'auto-intersecte. Même dans ce cas, cette approche peut être récupérable à condition que l'auto-intersection soit à un angle suffisamment grand et que la courbe soit suffisamment lisse (dans ce cas, vous pouvez choisir les bons voisins en fonction d'une contrainte selon laquelle les étapes successives ne peuvent pas faire un angle supérieur à un certain seuil ).θ

Martin Ender
la source
3

Étant donné que vous ne disposez que de représentations en virgule flottante des points, il n'y a aucune garantie que ceux-ci se trouvent toujours exactement sur la courbe, en raison d'erreurs d'arrondi. Je pense donc que la seule approche générique consiste à estimer où ils se trouvaient sur la courbe, en trouvant le point le plus proche sur la courbe de votre échantillon . Par exemple, si votre courbe paramétrique est vous pouvez essayer de minimiser( x ( t ) , y ( t ) , z ( t ) )(X,Y,Z)(x(t),y(t),z(t))

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

par rapport à . Si vous savez à quel type de courbe vous avez affaire, il pourrait y avoir de bonnes solutions analytiques à cela, sinon vous devrez recourir à un algorithme numérique. Étant donné que vos points doivent être très proches de la courbe, cette méthode doit être fiable (à condition que l'algorithme de minimisation le soit), sauf si vous avez un échantillon exactement là où la courbe se croise (presque). Dans ce cas, cependant, vous n'avez probablement pas de chance.t

Une fois que vous avez ce pour chacun de vos points, vous pouvez simplement les trier par . Bien sûr, si vous avez un contrôle sur la façon dont vous recevez les points, vous pourrez peut-être éviter tous ces problèmes en retournant immédiatement avec les coordonnées du point tout en les générant.t tttt

Martin Ender
la source