mercredi 21 juillet 2010

Puisqu'on parle d'intersections...

Parlons donc de rails!

Voici un petit schéma du problème et de la solution. L'utilisateur a entré chaque borne du rail, définie par une position et un vecteur tangent au rail (en noir sur le schéma). Quel est le rail défini par ces contraintes?
Tout d'abord, traçons les droites normales aux bornes. Elles se croisent en un point nommé C1.

Ensuite, définissons C2 à l'intersection de la droite la plus longue, et d'une droite parallèle à la droite la plus courte, de manière à ce que la distance entre la borne et C2 soit identique à la distance entre C2 et l'intersection de notre parallèle avec la droite issue de la deuxième borne (il y a du Thalès là dedans. Si je pensais que je le ressortirais un jour, celui là!). Si ces explications vous semblent confuses, regardez où est C2 sur le schéma: les deux segments de droite marqués a sont de longueur identique.

C2 définit maintenant le centre de l'arc de cercle correspondant à la partie courbe de la voie, la partie droite de la voie continuant simplement. La voie est indiquée en bleu sur le schéma.

Les quelques détails supplémentaires à régler pour obtenir une implémentation solide sont la gestion des cas impossibles, et l'affichage en temps réel du chemin proposé, pour que l'utilisateur sache où il aille.

De beaux défis en perspective.

2 commentaires:

Julien a dit…

C'est une solution, peut-etre la plus elegante. Il y en a (toujours) une infinite, meme si tu forces un rayon de courbure minimum - tu vas simplement faire pas mal de detours :) Tu peux aussi jeter un oeil sur les B-splines.

Kokuma a dit…

Loin de moi l'idée de critiquer ce mode de fonctionnement pour définir des chemins, mais un utilisateur lambda (enfin, de ceux qui s'amusent à définir des chemins à partir de vecteurs) est plus habitué à gérer des courbes de Bézier (B-splines) que ce fonctionnement certes simple mais atypique. Pourquoi ce choix ? Plus simple en termes de calculs et en moyen de stockage ? (C'est vrai que ce ne sont que des segments et des arcs de cercles.)