Collision 2d

Signaler
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
voila j'ai un pb avec les collisions en 2d ,
j'aimerai savoir si qq1 connai une maniere de gérer les collisions entre un rond et des droites et de maniere relativement precise .
les droites sont definie par 2 points, pr le disque j'ai les coordonnées du centre et le rayon .
merci d'avance
@+

9 réponses

Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
bon je dis ca un peu au feeling paske il est tard pr reflechir clairement(et jai jamsi reelement fait)
a priori, si tu as deux points de ta droite, tu dois pouvoir trouver son equation, a partir de lequation, trouve la normale a la droite passant par le centre du cercle, si la distance entre le pt dintersection de la normale et de la droite et le centre du cercle est inferieur au rayon, tu as collision. je pense ke meme si cest faux je dois pas etre loin de la réalité. en esperant ke ca taide (et ke jai pas dit une grosse connerie)
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010

scuz moi je me suis planter c'est pas des droites mais des segments et pr ton idée tu pourrais detaillé un peu car je serai pas faire ( par ex : comment tu fais pr trouver la normal )
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
droite : ptStart, ptEnd.
point : pt.

// vecteur directeur de la droite
int dx = ptEnd.x-ptStart.x;
int dy = ptEnd.y-ptStart.y;

// système d'équation pour le calcul des coordonnées de la projection orthogonale du point sur la droite
int s1 = -ptStart.y*dx+ptStart.x*dy;
int s2 = pt.x*dx+pt.y*dy;
int delta = dx*dx+dy*dy;
if(delta == 0)
return 0;

// coordonnées de la projection, puis calcul de la distance (au carré)
double x = ((double)(dy*s1+dx*s2))/delta;
double y = ((double)(-dx*s1+dy*s2))/delta;
double dist = ((x-pt.x)*(x-pt.x)+(y-pt.y)*(y-pt.y));

code récupéré sur un projet, à re-tester.
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
au pire voila l'algo (a combiner avec ce code):
si point d'une des deux extremités ds le cercle -> collision
(c'est a dire si la distance du point au centre est inferieure ou egale au rayon)
sinon, trouver la normale a la droite generée par les 2 extremites de ton segment et passant par le centre du cercle.
si cette droite nappartient pas a ton segment, pas collision
sinon si cette droite appartient au segment et que le distance entre le segment et le centre du cercle est inferieure ou egale au rayon -> collision
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010

ymca2003 : je ne comprend pas comment tu peux calculer la projection du pt sur la droite alors que tu ne tient pas compte de la direction de la balle ?
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
La balle ?

le code que j'ai mis sert simplement à calculer la distance entre un point et une droite, aucune notion de direction la dedans.
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010

ouai mais alors comment tu choisix le point de la droite a tester pr la distance avec point ?
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
bah faut tester la distance entre le point d'intersection de la droite et sa normale et le point en question, car ce sera la distance la plus courte entre le droite et le point.
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010

en okay j'ai pigé , en fait je ne conprenais pas bien a koa servait la normal