Collision entre 2 rectangles

[Résolu]
Signaler
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Statut
Membre
Dernière intervention
4 mars 2008
-
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
-
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.
A voir également:

20 réponses

Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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.
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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.

@+
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
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
Messages postés
220
Date d'inscription
jeudi 30 mars 2006
Statut
Membre
Dernière intervention
26 octobre 2007
1
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²)
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Statut
Membre
Dernière intervention
4 mars 2008

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.
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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 !
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
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
);
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Statut
Membre
Dernière intervention
30 août 2012
24
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Statut
Membre
Dernière intervention
26 juillet 2013
37
Salut:

C'est une nouvelle chose à apprendre. Merci
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
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
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Statut
Membre
Dernière intervention
4 mars 2008

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.
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
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
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Statut
Membre
Dernière intervention
4 mars 2008

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
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Statut
Membre
Dernière intervention
4 mars 2008

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
Messages postés
15151
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
14 octobre 2021
99
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...
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Statut
Membre
Dernière intervention
4 mars 2008

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.
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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.
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Statut
Membre
Dernière intervention
4 mars 2008

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 !
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Statut
Membre
Dernière intervention
4 mars 2008

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+
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008
1
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.

@+