par Flodelarab » 11 Oct 2006, 15:35
[quote="rodymary"]Je précise mon énoncé.
Soient A et B 2 segments dont on connait les coordonnées de leurs extrémités réspectives :
segment A : (x1A,y1A)-----------(x2A,y2A)
segment B : (x1B,y1B)-----------(x2B,y2B)
Ces 2 segments peuvent être perpendiculaires, parrallèles, séquants ou non, bref toutes les configurations possibles et inimaginables.
Admettons que nous ayons en notre possession 2 fonctions permettant de renvoyer la valeur minimum ou maximum de 2 variables : Notons les Min(variable1,variable2) et Max(variable1,variable2).
Est-ce possible de savoir si oui ou non ces 2 segments possèdent une intersection, uniquement en utilisant ces 2 fonctions, des tests de supériorité/infériorité/égalité/inégalité que nous noterons respectivement > , un algorithme simple du genre Si toto dy1*dx2) return +1;
if (dx1*dy2 < dy1*dx2) return -1;
if ((dx1*dx2 < 0) || (dy1*dy2 < 0)) return -1;
if ((dx1*dx1 + dy1*dy1) < (dx2*dx2 + dy2*dy2)) return +1;
return 0;
}
Par convention, lorsque les points p0, p1, p2 sont colinéaires,
si p0 est entre p1 et p2, ccw retourne -1
si p1 est entre p0 et p2, ccw retourne +1
si p2 est entre p0 et p1, ccw retourne 0
int intersect(struct line l1, struct line l2) {
return ((ccw(l1.p1, l1.p2, l2.p1) *
ccw(l1.p1, l1.p2, l2.p2)) <= 0) &&
((ccw(l2.p1, l2.p2, l1.p1) *
ccw(l2.p1, l2.p2, l1.p2)) <= 0);
}
Cet algorithme semble nécessiter beaucoup de calculs
Cependant, la recherche d'une solution plus courte, mais néanmoins
complète est loin d'être triviale
satisfait ?