mercredi 21 juillet 2010

Intersection de droites

Étant donné deux droites dans le plan définies chacune par un point et un vecteur, trouver leur intersection (si elle existe).

C'est autour de ce problème que je procrastinais depuis un certain temps, et une fois le boulot fait, force est de reconnaître que c'est trivial. Il fallait bien s'y mettre, puisque cette routine est à la base de nombreux systèmes de définition des rails (et notamment des courbes). Enfin, voici la bête:


boost::optional<dVector2>
geom::intersect(const dVector2 & v1,
const dVector2 & n1,
const dVector2 & v2,
const dVector2 & n2)
{
double denominator = n2(0) * n1(1) - n2(1) * n1(0);

if(std::abs(denominator) > 0.000001)
{
double numerator =
(v1(0) * n1(1) - v1(1) * n1(0)) -
(v2(0) * n1(1) - v2(1) * n1(0));

return boost::optional<dVector2>(v2 + n2 * (numerator / denominator));
}
else
{
return boost::optional<dVector2>();
}
}

En regardant la formule de près, je trouve qu'il y a beaucoup de calculs de type Ax * By - Ay * Bx, qui me font furieusement penser à un produit vectoriel. Il y a peut-être moyen d'effectuer ce calcul en utilisant des opérations sur les vecteurs au lieu de leurs composantes. À creuser.

Aucun commentaire: