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)
Réponses:
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:
L'applet de reconstruction de la courbe de croûte
Reconstruction de courbes par Tamal Dey
Curve and Surface Reconstruction: Algorithms with Mathematical Analysis , livre de Tamal K. Dey, Cambridge University Press, 2006
Puisque vous avez affaire à des courbes et que les échantillons sont denses, je vous suggère de calculer un arbre couvrant minimal euclidien.
la source
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:
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 ).θ
la source
É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))
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 tt t t
la source