Collision entre 2 rectangles [Résolu]

Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Dernière intervention
4 mars 2008
- - Dernière réponse : Galmiza
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
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.
Afficher la suite 

Votre réponse

20 réponses

Meilleure réponse
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Dernière intervention
9 avril 2008
3
Merci
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.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Galmiza
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Dernière intervention
9 avril 2008
3
Merci
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.

@+

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Galmiza
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Dernière intervention
16 juin 2010
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Arnaud16022
Messages postés
220
Date d'inscription
jeudi 30 mars 2006
Dernière intervention
26 octobre 2007
1
Merci
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²)
Commenter la réponse de lex1111
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Dernière intervention
4 mars 2008
0
Merci
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.
Commenter la réponse de unrealgun
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Dernière intervention
9 avril 2008
0
Merci
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 !
Commenter la réponse de Galmiza
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
0
Merci
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
);
Commenter la réponse de Ombitious_Developper
Messages postés
987
Date d'inscription
mardi 31 mai 2005
Dernière intervention
30 août 2012
Commenter la réponse de cs_laurent1024
Messages postés
2333
Date d'inscription
samedi 28 février 2004
Dernière intervention
26 juillet 2013
0
Merci
Salut:

C'est une nouvelle chose à apprendre. Merci
Commenter la réponse de Ombitious_Developper
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Dernière intervention
16 juin 2010
0
Merci
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
Commenter la réponse de Arnaud16022
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Dernière intervention
4 mars 2008
0
Merci
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.
Commenter la réponse de unrealgun
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Dernière intervention
16 juin 2010
0
Merci
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
Commenter la réponse de Arnaud16022
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Dernière intervention
4 mars 2008
0
Merci
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
Commenter la réponse de unrealgun
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Dernière intervention
4 mars 2008
0
Merci
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
Commenter la réponse de unrealgun
Messages postés
14297
Date d'inscription
lundi 11 juillet 2005
Dernière intervention
17 décembre 2018
0
Merci
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...
Commenter la réponse de BunoCS
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Dernière intervention
4 mars 2008
0
Merci
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.
Commenter la réponse de unrealgun
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Dernière intervention
9 avril 2008
0
Merci
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.
Commenter la réponse de Galmiza
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Dernière intervention
4 mars 2008
0
Merci
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 !
Commenter la réponse de unrealgun
Messages postés
87
Date d'inscription
mardi 16 décembre 2003
Dernière intervention
4 mars 2008
0
Merci
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+
Commenter la réponse de unrealgun
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Dernière intervention
9 avril 2008
0
Merci
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.

@+
Commenter la réponse de Galmiza

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.