Si j'ai un Catmull-Rom spline d'une certaine longueur, comment puis-je calculer sa position à une certaine distance? Typiquement, pour calculer le point dans une spline catmull rom, vous entrez une valeur entre 0 et 1 pour obtenir sa position via les proportions, comment puis-je faire cela pour les distances? Par exemple, si ma spline est longue de 30 unités, comment puis-je obtenir sa position à la distance 8? La raison pour laquelle je demande est parce qu'il semble qu'avec catmull rom splines donner des points dans le domaine [0,1] ne garantit pas qu'il vous donnera le point à cette distance dans la spline, par exemple si j'ai entré 0.5 dans un romspline catmull de longueur 30 cela ne signifie pas que j'obtiendrai la position à la distance de 15 de la spline à moins que la spline elle-même soit en effet une ligne droite ..Obtenir le point d'un catmull rom spline après une certaine distance?
Répondre
La manière habituelle est de stocker la longueur de chaque segment puis, pour trouver la longueur partielle d'un segment, vous l'incrémentez d'une valeur epsilon et calculez la distance linéaire entre les deux points jusqu'à ce que vous atteigniez votre réponse. Évidemment, plus votre epsilon est petit, meilleur est le résultat obtenu, mais il donne des résultats étonnamment bons. J'ai utilisé cette méthode pour me déplacer à une vitesse constante le long d'un catmul-rom et vous ne pouvez pas le voir accélérer et ralentir ... il se déplace à une vitesse constante. Évidemment, en fonction de la rigueur de vos segments, votre valeur epsilon devra changer mais, en général, vous pouvez choisir un epsilon «assez bon» et tout ira bien. Finder la réponse non-itérativement est INCREDABLEMENT cher (j'ai vu la dérivation tout à l'heure et ce n'était pas joli;)). Vous devez avoir une petite valeur epsilon pour obtenir de moins bonnes performances ...
Un autre lien: Adaptive Subdivision of Bezier Curves dans la bibliothèque Géométrie Anti-Grain
est principalement sur les différents problèmes de dessiner des courbes de Bézier sur une grille de pixels avec une brosse large, mais voir la fin.
(Ajouté :) Antigrain a aussi un bel exemple/bspline.cpp dans lequel vous pouvez déplacer des nœuds et faire varier le nombre de points intermédiaires.
La réponse de Goz est précise - voici un related discussion about length of Bezier curves. Le résumé des posters était que c'est moins de calcul (et beaucoup plus simple) de faire une approximation que de calculer la réponse exacte. Ceci est applicable parce que vous pouvez changer la base des splines paramétriques, ainsi vous pourriez convertir la courbe de Catmull-Rom en segments de Bézier. Pour l'approximation, vous êtes fondamentalement la rupture en primitives avec une longueur analytique simple, puis en additionnant toutes les longueurs simples. Alors que la plupart des gens utilisent des segments de ligne, vous avez tendance à rétrécir. Vous pouvez minimiser l'erreur en utilisant des petits segments, mais votre approximation sera toujours inférieure à la vraie longueur pour les courbes non linéaires.
Si vous avez besoin de plus de précision, il y a un paper from jgt qui explique comment utiliser les cercles comme primitives d'approximation, ce qui est apparemment plus rapide/plus précis mais pas beaucoup plus difficile à implémenter. Ils comprennent un exemple de mise en œuvre de C.
J'ai récemment entendu parler de la bibliothèque AGG, mais je suis très impressionné. – tfinniga