Intersection entre

Une ligne et un cercle


- En GFA-Basic pour windows -

Page d'accueil

Les explications données ici sont issues du site de Paul Bourke (en anglais) :
http://astronomy.swin.edu.au/~pbourke/geometry/sphereline

Pour notre problème nous allons définir la ligne avec l'équation suivante :
P = P1 + U * (P2 - P1)
En clair pour connaitre un point de la ligne :
U est une inconnue
P1 et P2 sont les coordonnées de 2 points de la lignes (x1,y1) et (x2,y2), la distance entre ces 2 points doit toujours être de 1 unité.
Le point à trouver est donc :
x = x1 + U * (x2 - x1)
y = y1 + U * (y2 - y1)

Le cercle est défini par l'équation : (x-x3)^2 + (y-y3)^2 = r^2
ou (x3,y3) est le centre du cercle et r son rayon
C'est un simple calcul d'hypothénuse

La substitution de l'équation de la ligne dans la sphère donne une équation quadratique de la forme :
b^2 - 4 * a * c
Où :
a = (x2 - x1) ^ 2 + (y2 - y1) ^ 2
b = 2 * ( (x2 - x1) * (x1 - x3) + (y2 - y1) * (y1 - y3) )
c = x3 ^ 2 + y3 ^ 2 + x1 ^ 2 + y1 ^ 2 - 2 * (x3 * x1 + y3 * y1 ) - r ^ 2

- Démonstration d'une intersection entre une ligne et un cercle -
Listing GFA-Basic, Faites un copier-coller
ou cliquez ici pour télécharger le fichier linecerc.lst
' Intersection d'une ligne et d'un cercle
'
' Dêmonstration en GFA-Basic par Nicolas Rey - 05/12/2002
' http://scalion.free.fr
'
' Informations collectêes sur le site de Paul Bourke
' http://astronomy.swin.edu.au/~pbourke/geometry/sphereline/
'
FULLW #1
x3 = 300,y3 = 200,r = 50
DO
 
mx1% = MX%,my1% = MY%
 
MOUSE MX%,MY%,MK%
 
IF MX% <> mx1% OR MY% <> my1%
   
CLS
   
x1 = 0,y1 = 200 + r,x2 = MX%,y2 = MY%
   
NORMALISER x1,y1,x2,y2
   
AFFICHER_LIGNE x1,y1,x2,y2
   
CIRCLE x3,y3,r
   a
= (x2 - x1) ^ 2 + (y2 - y1) ^ 2
   
b = 2 * ( (x2 - x1) * (x1 - x3) + (y2 - y1) * (y1 - y3) )
   
c = x3 ^ 2 + y3 ^ 2 + x1 ^ 2 + y1 ^ 2 - 2 * (x3 * x1 + y3 * y1 ) - r ^ 2
   
v = b * b - 4 * a * c
   
IF v >= 0
     PRINT
"INTERSECTION !"
     
U = (-b - SQR(b ^ 2 - 4 * a * c))  / (2 * a)
     
ix = x1 + U * (x2 - x1),iy = y1 + U * (y2 - y1)
     CIRCLE
ix,iy,5
     ?
"u = ";U
     
IF v = 0
       ?
"TANGEANTE"
     
ENDIF
   ELSE
     PRINT
"EN DEHORS..."
     
? "u = Pas de solution"
   
ENDIF
 ENDIF
 EXIT IF
MK% <> 0
LOOP
CLOSEW #1
PROCEDURE AFFICHER_LIGNE(x1,y1,x2,y2)
 LOCAL
U,px,py
 
FOR U = 0 TO 500
   
px = x1 + U * (x2 - x1),py = y1 + U * (y2 - y1)
   PLOT
px,py
 
NEXT U
RETURN
PROCEDURE
NORMALISER(VAR x1,y1,x2,y2)
 LOCAL
lx,ly,h
 lx
= x2 - x1,ly = y2 - y1
 h
= SQR(lx ^ 2 + ly ^ 2)
 IF
h > 0
   
x2 = x1 + lx / h,y2 = y1 + ly / h
 
ELSE
   
x2 = x1 + 1
 ENDIF
RETURN