On appellera la procédure GetIntersection(x1,y1,x2,y2,x3,y3,x4,y4,varI%,ix,iy)
| où | Valeur passées en paramètres : x1,y1,x2,y2 sont les coordonnées de la premièreligne x3,y3,x4,y4 sont les coordonnées de la seconde ligne Valeur retournées dans : I% prend la valeur "VRAI" si il y a un point d'intersection et"FAUX" s'il n'y en a pas . ix,iy sont les coordonnées du point d'intersection |
| 2 types d'équation sont possibles : | Type 1 : y = ax + b Type 2 : x = ay + b |
'Détermination du type d'équationpour la première ligne
lx1=x2-x1, ly1=y2-y1 'Distancex et y
IF ABS(lx1)>ABS(ly1) 'si la ligne est plutôthorizontale
TYPE1%=1, A1 = ly1 / lx1, B1 = -(A1 * x1 - y1)
ELSE 'sinon
TYPE1%=2, A1 = lx1 / ly1, B1 = -(A1 * y1 - x1)
ENDIF
'Détermination du type d'équationpour la seconde ligne
lx2=x4-x3,ly2=y4-y3 'Distance x ety
IF ABS(lx2)>ABS(ly2) 'si la ligne est plutôthorizontale
TYPE2%=1, A2 = ly2 / lx2, B2 = -(A2 * x3 - y3)
ELSE 'sinon
TYPE2%=2, A2 = lx2 / ly2, B2 = -(A2 *y3 - x3)
ENDIF
IF TYPE1%=TYPE2%
Si les 2 lignes sont du même type on pourra calculer facilementle point d'intersection des 2 droites, puis vérifier en toute simplicitéque le point d'intersection est compris dans les 2 segments de droite .
| Il n'y a pas de point d'intersection | |
| Les 2 lignes sont confondues . Il y a donc une infinité de point d'intersection J'ai délibérément choisi de mettreI% = "FAUX" (pas de point d'intersection pour ce cas) | |
| Il existe un point d'intersection des 2 droites Reste à savoir si il fait partie des 2 segments |
IF TYPE1%<>TYPE2%
Si les 2 lignes sont de types différents, j'utilise alors uneméthode d'approximation (rassurez-vous le résultat est aussiexact) . Le calcul prend donc plus de temp .
|
J'ai choisi de faire ce calcul 40 fois car au-delà le segment primitif à une longueur égale à zéro,ou du moins il n'y a plus de chiffres significatif .
Si quelqu'un a une autre méthode qu'il n'hésite pas àme le signaler, merci d'avance . (scalion@free.fr).
If TYPE1% = 1 And TYPE2% = 2
ix = x3, iy = y3, ix2 = x4, iy2 = y4
For k% = 0 To 40
tx1 = (ix + ix2) / 2, ty1 = (iy+ iy2) / 2 ' pointcentral
ppx = (ix2 - tx1) / 2, ppy = (iy2- ty1) / 2 ' distance x et y dedéplacement
v1 = Abs((ty1 + ppy) - (A1 * (tx1+ ppx) + B1)) ' comparaison sens 1
v2 = Abs((ty1 - ppy) - (A1 * (tx1- ppx) + B1)) ' comparaison sens 2
If v1 < v2 ' si distance sens 1 inférieure ( meilleur)
ix = tx1, iy = ty1 ' nouvelle coordonnées du segment primitifsens 1
Else ' sinon
ix2 = tx1, iy2= ty1 ' nouvelle coordonnées du segment primitifsens 2
EndIf
Next k%
ty1 = A1 * ix + B1, tx1 = A2 * iy + B2 ' Vérification d'appartenance aux 2 segments
i% = (Abs(ty1 - iy) < 0.000000001) And (Abs(tx1- ix) < 0.000000001) And (ix >= Min(x1, x2) And ix <= Max(x1, x2))
EndIf
If TYPE1% = 2 And TYPE2% = 1
ix = x1, iy = y1, ix2 = x2, iy2 = y2
For k% = 0 To 40
tx1 = (ix + ix2) / 2, ty1 = (iy+ iy2) / 2 'point central
ppx = (ix2 - tx1) / 2, ppy = (iy2- ty1) / 2 ' distance x ety de déplacement
v1 = Abs((ty1 + ppy) - (A2 * (tx1+ ppx) + B2)) ' comparaison sens 1
v2 = Abs((ty1 - ppy) - (A2 * (tx1- ppx) + B2)) ' comparaison sens 2
If v1 < v2 ' si distance sens 1 inférieure ( meilleur)
ix = tx1, iy = ty1 ' nouvelle coordonnées du segment primitifsens 1
Else ' sinon
ix2 = tx1, iy2 = ty1 ' nouvelle coordonnées du segment primitifsens 2
EndIf
Next k%
ty1 = A2 * ix + B2, tx1 = A1 * iy + B1 ' Vérification d'appartenance aux 2 segments
i% = (Abs(ty1 - iy) < 0.000000001) And (Abs(tx1- ix) < 0.000000001) And (ix >= Min(x3, x4) And ix= < Max(x3, x4))
EndIf


| PROCEDURE GetIntersectionPB(x1, y1, x2, y2, x3, y3, x4, y4, VAR I%, ix, iy ) LOCAL S1,S2,S3,S4,S5,S6,S7,Ua,Ub,M1,M2 I% = FALSE S1 = x4 - x3 S2 = x2 - x1 S5 = y2 - y1 S6 = y4 - y3 M1 = S1 * S5 M2 = S6 * S2 IF M1 <> M2 ' Si les lignes ne sont pas parallèles S3 = y1 - y3 S4 = x1 - x3 S7 = M2 - M1 Ua = ( S1 * S3 - S6 * S4 ) / S7 Ub = ( S2 * S3 - S5 * S4 ) / S7 IF Ua > 0 IF Ua < 1 IF Ub > 0 IF Ub < 1 I% = TRUE ix = x1 + Ua * S2 iy = y1 + Ua * S5 ENDIF ENDIF ENDIF ENDIF ENDIF RETURN |