2009-07-18 19 views
2

J'essaye de créer une classe qui prend n'importe quel nombre de points (position et contrôle) et crée une spline de catmull-rom basée sur l'information donnée.Relier les cannelures Catmull-Rom et calculer sa longueur?

Ce que je fais - et je suis vraiment pas sûr que ce soit la bonne façon de le faire - est le stockage de chaque point individuel dans une classe comme ceci:

class Point { public: Vector3 position; Vector3 control; }

Où évidemment position la position du point et du contrôle est le point de contrôle.

Mon problème est de connecter les splines - évidemment, étant donné que la classe ci-dessus maintient un point dans le tableau spline indique qu'une position donnée ne peut avoir qu'un seul point de contrôle. Ainsi, lorsque vous avez trois points ou plus dans une spline catmull rom les différentes splines catmull-rom individuels qui sont connectés partagent une position et un contrôle avec une autre spline.

Maintenant avec la position étant le même est nécessaire - puisque je veux créer des splines qui sont continues entre eux. Cependant je me demande vraiment, les points de contrôle devraient-ils être les mêmes entre les deux splines? Avec un peu de bidouillage des points de contrôle, je peux faire sembler passer sans heurts d'une spline à l'autre mais je dois souligner que je ne suis pas sûr que la façon dont ils sont en transition est cohérente avec la façon dont les splines catmull-rom forment leur forme . Je préférerais le faire correctement plutôt que de m'asseoir sur mes mains et de rationaliser que c'est assez bon.

Évidemment, la deuxième partie de ma question est explicite: Étant donné deux points de contrôle et de position, comment calculer la longueur d'une spline catmull-rom?

Répondre

4

Pour définir la spline entre deux points de contrôle, la spline Catmull-Rom a besoin des points de contrôle et du vecteur tangent à chaque point de contrôle. Cependant, le vecteur de tangente aux points de contrôle interne (par exemple non-noeud final) est défini par les points de contrôle de chaque côté de celui-ci: T (P n) = (P n + 1 - P n-1)/2. Pour les courbes fermées, la spline est complètement définie par l'ensemble des points de contrôle. Pour les courbes non fermées, vous devez également fournir le vecteur tangent au premier et au dernier point de contrôle. Cela se fait couramment: T (P) = P - P et T (P n) = P n - P n-1. Ainsi, pour les courbes fermées, votre structure de données est juste une liste de points de contrôle. Pour les splines générales, il s'agit d'une liste de points plus le premier et le dernier vecteur normal.

Si vous souhaitez avoir une spline cardinale, vous pouvez ajouter un facteur de pondération au calcul du vecteur tangent comme dans Wikipedia article.

Pour calculer la longueur d'une telle spline, une approche consisterait à l'approximer en évaluant la spline en plusieurs points, puis en calculant la distance linéaire entre chaque paire de points adjacente.

1

En ce qui concerne la mesure des longueurs, vous pouvez le faire avec le calcul depuis sa spline polynomiale. Vous devez intégrer la fonction de distance à travers la ligne. Il décrit assez bien sur Wikipedia ...