Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1003 connectés 

  FORUM HardWare.fr
  Programmation

  Matheux, besoin de vous!

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Matheux, besoin de vous!

n°47207
shinji
Posté le 17-07-2001 à 12:05:17  profilanswer
 

J'ai trouvé 2 fonctions qui permettent de savoir si 2 segments se croisent. Elles utilisent apparement le produit vectoriel. Seulement j'aimerais bien comprendre comment elles marchent, quel est le but de chacune d'elles, le lien, bref l'algo.
 
Ce serait super sympa, merci!
 
Intersect est la fonction principale, il faut lui fournir les 8 coordonnées qui constituent les extrémités des segments (4 points x 2 coordonnées) dans l'ordre logique.
ex: segments [AB],[CD]:
intersect(Ax,Ay,Bx,By,Cx,Cy,Dx,Dy);
 
function ccw ( $p0x, $p0y, $p1x, $p1y, $p2x, $p2y){
 $dx1 = $p1x - $p0x;
 $dy1 = $p1y - $p0y;
 $dx2 = $p2x - $p0x;
 $dy2 = $p2y - $p0y;
 
 if( $dx1 * $dy2 > $dy1 * $dx2 ) return 1;
 else if( $dx1 * $dy2 < $dy1 * $dx2) return -1;
 else{
      if( $dx1 * $dx2 < 0 || $dy1 * $dy2 < 0 ) return -1;
      else if( $dx1 * $dx1 + $dy1 * $dy1 >= $dx2 * $dx2 + $dy2 * $dy2 ) return 0;
      else return 1;
 }
}
function intersect( $p1x, $p1y, $p2x, $p2y, $p3x, $p3y, $p4x, $p4y){
return( ccw ( $p1x, $p1y, $p2x, $p2y, $p3x, $p3y) * ccw ( $p1x, $p1y, $p2x, $p2y, $p4x, $p4y) <= 0 ) && ( ccw( $p3x, $p3y, $p4x, $p4y, $p1x, $p1y) * ccw( $p3x, $p3y, $p4x, $p4y, $p2x, $p2y) <= 0 );
}
 
Merci beaucoup!

mood
Publicité
Posté le 17-07-2001 à 12:05:17  profilanswer
 

n°47252
bjone
Insert booze to continue
Posté le 17-07-2001 à 14:37:02  profilanswer
 

ccw => counter clock wise ?
je suis en pleine digestion, mais on dirait que ccw retourne 1 si les points p0,p1,p2 sont dans le sens contraire des aiguilles d'une montre (sens trigo).... (et -1 inversement, ptet 0 quand 2 points sont confondus)
 
ça me fait mal au crâne..........
apparemment, 4 couples de "triangles" sont testés d'un point de vue ccw, et dont si un des 4 quatres ccw retourne 0 y'a pas intersection (m'enfin on obtient pas le point d'intersection avec ce code, y'aurait ptet mieux approche)
fodrait faire des dessins beuhhhhh

n°47256
shinji
Posté le 17-07-2001 à 14:47:04  profilanswer
 

bjone-> j'essaye une approche par les angles!
C'est horrible ce truc mais je dois savoir comment ça marche! Le pire c'est que ça marche d'enfer.
 
Voici le site où j'ai trouvé le code mais aucune explications:
http://www.enseignement.polytechni [...] 0/a10.html

n°47268
shinji
Posté le 17-07-2001 à 15:42:15  profilanswer
 

Voilà les seuls commentaires du site:

Citation :


On cherche à savoir si l'angle P1P0P2 > 0 ?
 
En calculant le produit vectoriel P0 P1 Ù P0 P2. Si l'angle est nul, par convention on compare les normes.


 
 
Voilà ce que quelq'un m'a répondu aussi, ça devrait aider:

Citation :

En théorie, le produit vectoriel en 2D te donne pour 3 points, les
coordonnées du 4ème pour faire un parallèlogramme ! En fait, si tes  
points
sont A, O, et B, le produit vectoriel OA par OB te donne le vecteur OC  
de
manière à avoir : OACB est un parallèlogramme.
 
En fait si je comprend bien ce qu'il fait, il cherche à savoir de quel  
coté
d'un segment se trouve un point donné. C'est quelque chose du genre :
Je caclule le vecteur OC, si sa valeur algébrique (Longueur orientée !)  
est
nulle, les point sont allignés, si elle est positive, le point est  
(mettons
!) à droite et si elle est négative, à gauche. Je dis pas que c'est
éxactement çà, mais c'est l'idée. Ensuite si par raport à un segment,  
les
deux points de l'autre segments de sont pas du même coté (et
réciproquement), c'est que les segments sont séquants !

n°47294
bjone
Insert booze to continue
Posté le 17-07-2001 à 16:45:07  profilanswer
 

ouaip, l'idée ça doit être ça..... fodrait passer du temps, sinon moi pour calculer une intersection entre 2 segments (dans la pratique, genre un missile qui change de position / mur), je ferais une projection des points d'un segment sur l'autre (ancienne & nouvelle position missile => sur segment de mur), tu peux alors en déduire les coordonnées du point d'intersection....
tu veux quoi savoir seulement si y'a intersection (& uniquement ça, dans ce cas cette routine peut être idéale), mais si tu veux ensuite la coordonnée du point d'intersection, fo changer d'approche je pense....

n°47295
bjone
Insert booze to continue
Posté le 17-07-2001 à 16:45:40  profilanswer
 

m'enfin ce que j'en dis, j'ai aps fait polytechnique ;)

n°47297
youdontcar​e
Posté le 17-07-2001 à 16:46:50  profilanswer
 

l'algo est tout joli ! en cas d'intersection, les segments [AB] et [CD] formeront les diagonales du quadrilatère ABCD ou ABDC, suivant l'organisation des points.
 
le but de l'algo est de tester si :
 
* les points C et D sont de part et d'autre de (AB)
* la même chose pour l'autre segment : si les points A et B sont de part et d'autre de (CD)
 
si ces deux conditions sont remplies, les segments s'intersectent.
 
ccw(point a, point b, point c) renvoie 1 si l'angle (bac) > 0, -1 s'il est < 0. (et 0 par convention, regarde la fonction, là au moins c'est expliqué)
 
comment tester si C et D sont de part et d'autre de (AB) ?  
deux cas :
* si l'angle (bac) > 0 et l'angle (bad) < 0
* si l'angle (bac) < 0 et l'angle (bad) > 0
 
soit  
* si ccw(abc) = 1 et ccw(abd) = -1
* si ccw(abc) = -1 et ccw(abd) = 1
 
ce qui se ramène à ccw(abc) * ccw(abd) <= 0  
 
pareil pour tester si A et B sont de part et d'autre de [CD].
 
// j'ai peut-être confondu l'ordre des angles (bac et non pas abc ou je ne sais quoi), mais ça ne change rien au raisonnement.

n°47298
youdontcar​e
Posté le 17-07-2001 à 16:47:32  profilanswer
 

j'oubliais : si tu as du mal à comprendre, qq figures aident beaucoup.

n°47312
shinji
Posté le 17-07-2001 à 17:07:37  profilanswer
 

Merci les gars!
 
bijone-> C'est juste pour savoir s'il y a intersection. J'ai pas besoin des coordonnées du point d'intersection.
 
:)


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation

  Matheux, besoin de vous!

 

Sujets relatifs
besoin d'aide PHP3[access] BESOIN DE PROS
[Apache] VirtualHost : besoin d'aide pliz !!![LotusScript] Besoin d'aide...
[SQL VBA]message d erreur de l espace!!!!!!! Besoin de pros[SQL]Besoin d ecrire dans une table sans l ecraser,Delivrez moi!
[SQL] Probleme Besoin du mot magiqueNouveau mod pour half-life --> nh, on a besoin de vous
[VB] ERREUR Winsock (besoin d'une petite explication)[php] Projet btp: on a besoin de soutiens !!!
Plus de sujets relatifs à : Matheux, besoin de vous!


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR