Collision entre 2 rectangles

Résolu
unrealgun Messages postés 87 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 4 mars 2008 - 14 nov. 2006 à 18:31
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 - 16 nov. 2006 à 18:57
Hi,

Je débute le C++ et je programme sous windows avec la library Opengl, sans Glut.

Voila mon probleme :
je souhaite detecter une collision entre deux rectangles (2D), ce serait simple si ces rectangles ne tournaient pas...
Le centre de la rotation de chaque rectangle est son centre respectif.

J'aurais pu englober et considerer un rectangle plus gros, ou un cercle... mais je voudrais un algo de précision.

Merci d'avance de votre aide.

20 réponses

Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
14 nov. 2006 à 23:41
Détermine la position des points des rectangles (disons rectangle 1 et rectangle 2) avec sin et cos, puis vérifie que les 4 points du rectangle 1 sont en dehors du rectangle 2 avec ma méthode, ET que les 4 points du rectangle 2 sont en dehors du rectangle 1.
Ainsi tu n'auras pas collision.

Le cas échéant tu as collision.
Le(s) point(s) fautif(s) (à l'intérieur d'un rectangle) te donnera(ont) accès à une très bonne approximation de la position du point de contact et de la normale au contact.
3
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
15 nov. 2006 à 18:13
Salut,

Je viens de faire une source de collision de rectangle en 2D.
Elle est disponible sur le site @ http://www.cppfrance.com/codes/COLLISION-RECTANGLES-2D-SANS-INTERFACE-GRAPHIQUE_40332.aspx.

J'espère que ça t'aidera.

@+
3
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
16 nov. 2006 à 13:00
chti conseil :
au lieu de te trimballer les conversions dans tous tes calculs, fais les UNE fois : lorsque l'utilisateur l'entre.
rot ne sera QUE en radians.

_______________________

Omnia vincit labor improbus
3
lex1111 Messages postés 220 Date d'inscription jeudi 30 mars 2006 Statut Membre Dernière intervention 26 octobre 2007 1
15 nov. 2006 à 13:49
Posons un repère : (O,ex,ez)

Posons les coordonnées du point que tu connais A(x,y) et le centre O(0,0) de ton rectangle
l'angle H entre Oex et OA :  H= Arctan(y/x)
la distance OA=racine(x² + y²)
l'angle dont le point à tourné H'

les coordonnées de ton nouveau A'(x',y')
avec x'=cos( H+H')*racine(x²+y²)
et y'=sin( H+H')*racine(x²+y²)
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
unrealgun Messages postés 87 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 4 mars 2008
14 nov. 2006 à 18:34
j'oubliais de préciser :
connus, pour chacun des deux rectangles :
- la hauteur, la largeur
- la position X et Y du centre
- l'angle de rotation

toutes ces proprietes peuvent etre differentes pour chacun des rectangles.
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
14 nov. 2006 à 19:48
Tu as quel niveau en math ?

Un indice:
Si tu as A,B et C 3 points.
(AB.x*BC.y-AB.y*BC*x)>0 si C est à gauche de la droite AB (si tu t'imagines en A en regardant vers B).

Avec ça tu peux te débrouiller.

Bonne chance !
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
14 nov. 2006 à 19:54
Salut:

Utilises la fonction "IntersectRect" pour détecter l'intersection de deux rectangles.


BOOL IntersectRect(
  LPRECT
 lprcDst
,        // pointer to structure for intersection
  CONST RECT *lprcSrc1,  // pointer to structure with first rectangle
  CONST RECT *lprcSrc2   // pointer to structure with second rectangle
);
0
cs_laurent1024 Messages postés 987 Date d'inscription mardi 31 mai 2005 Statut Membre Dernière intervention 30 août 2012 25
14 nov. 2006 à 20:01
0
Ombitious_Developper Messages postés 2333 Date d'inscription samedi 28 février 2004 Statut Membre Dernière intervention 26 juillet 2013 38
14 nov. 2006 à 20:10
Salut:

C'est une nouvelle chose à apprendre. Merci
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
14 nov. 2006 à 20:16
Le plus rigolo c'est de recoder ça toi même atta ^^


la méthode : tu prends 2 sommets de ton rectangle. avec ça tu peux
aisément connaître l'equa de la droite qui passe par ces 2 points.

pour chacune des droites de l'autre rectangle, tu regardes si ces 2
droites se coupent, et SI OUI, si l'intersection se situe bien entre
les 2 sommets

Si tu es dans ce cas, les 2 rectangles se chevauchent, oui.


après tu aura encore un autre cas à gérer mais là t'as déjà de quoi faire ^^

_______________________

Omnia vincit labor improbus
0
unrealgun Messages postés 87 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 4 mars 2008
14 nov. 2006 à 21:46
Vous voue êtes surpassé... j'attendais pas tant de réponses aussi vite.

Désolé pour mon viveau de math, je suis en 2nde on vient juste de commencer le programme de maths.

Je vais tester ce que vous me proposez.

PS : arnaud, le CAS dont tu parle c'est bien lorsqu'on a une figure petite dans une autre figure plus grande sans que il y ait intersection des segments ?

Merci beaucoup. Vive cppfrance.
0
Arnaud16022 Messages postés 1329 Date d'inscription vendredi 15 août 2003 Statut Membre Dernière intervention 16 juin 2010 2
14 nov. 2006 à 21:56
Exactement :)

Niveau 2nde -> largement suffisant je pense ( à vrai dire je ne me souviens plus bien du programme de 2nde :/ )

Bon atta j'ai déjà fait ça . Je vais voir si j'arrive à te le retrouver ( ça va etre dur :s )

_______________________

Omnia vincit labor improbus
0
unrealgun Messages postés 87 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 4 mars 2008
14 nov. 2006 à 22:20
euu... pourriez-vous juste me dire comment trouver la position d'un point du rectangle qui a tourné autour de son centre d'un angle défini , sachant qu'on connait la position initiale du point et la position du centre de rotation...  ?    

désolé si je vous soule mais c'est un forum d'entraide a ce que j'ai compris...

merci d'avance et excusez mon viveau pourri en math
0
unrealgun Messages postés 87 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 4 mars 2008
14 nov. 2006 à 22:30
PS : tout ce qu'on a fait depuis le debut de l'année c'est les droites remarquables des triangles, thales, pythagore, et les equations. :p
0
BunoCS Messages postés 15475 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 23 avril 2024 103
15 nov. 2006 à 09:59
Salut,
ça me paraît limite avec un niveau 2nde en Maths...mais ce n'est pas impossible avec un peu de temps et de travail.
Bon courage

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
unrealgun Messages postés 87 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 4 mars 2008
15 nov. 2006 à 12:54
Merci des encouragements buno.
Galmiza : je saurais faire tout le reste, pas de probleme (merci quand meme pour tes précisions qui m'ont eclairci certaines choses) , ce qui me manque c'est juste la position de l'image du point : on connait les positions du point initial et du centre de rotation, ansi que l'angle, la je cherche donc la position de l'image de ce point apres rotation.
Tu me consielles d'utiliser sin et cos ? le prob c'est que sa je sais m'en servir qu'en trigonometrie (or ici, pas de triangle rectangle) et ce uniquement pour trouver un angle a partir de deux cotés connus.

Merci de toutes vos réponses, sa va surement m'aider.
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
15 nov. 2006 à 21:24
J'ai fait des mises à jours.
Maintenant il y a une interface pour visualiser les résultats.
Des bugs mineurs ont été éliminés.

unrealgun -> Le code ne devrait pas être difficile à adapter à tes besoins.
0
unrealgun Messages postés 87 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 4 mars 2008
16 nov. 2006 à 12:44
Bonjour, toud d'abord je tiens a remercier lex1111 pour son explication que j'ai , apres quelques heures de boulot, reussi a adapter :

                long double ax= -pobjn->width/2,
                            ay= -pobjn->height/2,
                            apx= cosl(atanl(ay/ax)+(long double)bbn->rot*pi/180)*
                                -sqrtl(ax*ax+ay*ay)+bbn->posx,
                            apy= sinl(atanl(ay/ax)+(long double)bbn->rot*pi/180)*
                                -sqrtl(ax*ax+ay*ay)+bbn->posy,
                            bx= pobjn->width/2,
                            by= -pobjn->height/2,
                            bpx= cosl(atanl(by/bx)+(long double)bbn->rot*pi/180)*
                                -sqrtl(bx*bx+by*by)+bbn->posx,
                            bpy= sinl(atanl(by/bx)+(long double)bbn->rot*pi/180)*
                                -sqrtl(bx*bx+by*by)+bbn->posy,
                            cx= pobjn->width/2,
                            cy= pobjn->height/2,
                            cpx= cosl(atanl(cy/cx)+(long double)bbn->rot*pi/180)*
                                sqrtl(cx*cx+cy*cy)+bbn->posx,
                            cpy= sinl(atanl(cy/cx)+(long double)bbn->rot*pi/180)*
                                sqrtl(cx*cx+cy*cy)+bbn->posy,
                            dx= -pobjn->width/2,
                            dy= pobjn->height/2,
                            dpx= cosl(atanl(dy/dx)+(long double)bbn->rot*pi/180)*
                                sqrtl(dx*dx+dy*dy)+bbn->posx,
                            dpy= sinl(atanl(dy/dx)+(long double)bbn->rot*pi/180)*
                                sqrtl(dx*dx+dy*dy)+bbn->posy;

bbn->rot étant la rotation en degrés de l'objet
bbn->posx est la position x de son centre
bbn->posy est la position y de son centre
pobjn->width est la largeur de l'objet
pobjn->height est sa hauteur

J'ai misun bail a comprendre qu'il fallait des radians, puis j'ai trouvé la conversoin sur msdn,
puis j'avais des problemes alors jme suis souvenu qu'un carré annulait les signes...
et la j'ai mes 4 points : merci encore une fois a lex1111.

galmiza>je vais aller voir ta source ce soir car la je suis pressé :) merci

Merci a tous !
0
unrealgun Messages postés 87 Date d'inscription mardi 16 décembre 2003 Statut Membre Dernière intervention 4 mars 2008
16 nov. 2006 à 13:42
return ( (xB-xA)*(y-yA)-(yB-yA)*(x-xA)<=0.0f
&& (xC-xB)*(y-yB)-(yC-yB)*(x-xB)<=0.0f
&& (xD-xC)*(y-yC)-(yD-yC)*(x-xC)<=0.0f
&& (xA-xD)*(y-yD)-(yA-yD)*(x-xD)<=0.0f );

!!! je comprends rien mais sa marche lol
merci beaucoup galmiza !!!

merci a vous tous pour votre aide, je vais essayer de comprendre ce calcul, si jy arrive pas jdemanderé a la prof de math.

a+
0
Galmiza Messages postés 573 Date d'inscription samedi 16 novembre 2002 Statut Membre Dernière intervention 9 avril 2008 1
16 nov. 2006 à 18:57
Content de t'avoir dépanné :D !

(xB-xA)*(y-yA)-(yB-yA)*(x-xA) est négatif si le point (x,y) est à droite de AB quand on se positionne en A et qu'on regarde vers B.
On doit voir ça en Terminale avec les produits vectoriels (Ca fait 5 ans donc je ne me souviens plus trop des programmes de TS).

J'ai joint un petit dessin au zip où je schématise cela.

@+
0
Rejoignez-nous