Collision de rectangles 2d

Soyez le premier à donner votre avis sur cette source.

Vue 18 906 fois - Téléchargée 1 085 fois

Description

Algorithmes de calcul d'intersection de rectangles.
Les rectangles sont définis par leur centre, leur hauteur, leur largeur et leur angle de rotation dans le sens trigonométrique.

Permet de déterminer si deux rectangles sont en contact et de récupérer suffisamment d'informations sur la collision (point de contact + profondeur de pénétration du point + normale au contact) pour faire un moteur physique.

L'interface graphique GLUT n'est pas beaucoup commentée (bien que bien présentée :D) car n'est pas le sujet de cette source (inclut dans le zip).
Elle permet de manipuler les rectangles intuitivement avec la souris.

Les algorithmes de calcul de collision sont dans la classe Rectangle.
Le fichier main.cpp contient exclusivement l'interface graphique.

Aller amusez-vous !

Source / Exemple :


// Un simple rectangle
class CRectangle  
{

public:

	CPoint2D Centre;
	float Hauteur;	// Hauteur
	float Largeur;	// Largeur
	float Angle;		// Angle en radian sens trigonométrique

	CPoint2D A,B,C,D;	// Les points (à jour moyennant un appel à UpdatePointPositions)

	// 2 FONCTIONS IMPORTANTES
	// Dit si le point P est dans le rectangle. Si oui et nX et nY != NULL, écrit dans nX,nY les composantes de la normale à la face la plus proche du point.
	BOOL IsPointIn(CPoint2D *P, float *nX, float *nY, float *depht);

	// Dit si le rectangle est en contact avec un autre. Si oui, écrit dans les paramètres le point de contact I et la normal au contact (nX,nY)
	BOOL GetCollision(CRectangle *rect, CPoint2D *I, float *nX, float *nY, float *depht);
	
	// 2 FONCTIONS MINEURES
	// Ecrit dans les paramètres les points extrêmes P1=(bas gauche) P2=(haut droite) de la boite englobante dont les cotés sont alignés aux axes du repère
	void GetAABB(CPoint2D *P1, CPoint2D *P2);

	// Met à jour les points A B C et D du rectangle en fonctions de ses paramètres
	void UpdatePointPositions(void);	
};

Conclusion :


Commandes:
Tout se fait avec la souris.
Cliquez gauche sur un rectangle et faites glisser pour le déplacer.
Cliquez droit sur un rectangle et faites glisser pour le faire tourner.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
pour GLUT : pas de paramétrisation possible, ça se code. Mais tu t'en fous c'est pas le but ici.

Pour Runge-Kutta : ouff ^^
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008

En fait, la source était au départ une réponse à une question posée sur le forum :D.
Il se peut qu'aucun des points des rectangles ne soient à l'intérieur d'un autre rectangle alors qu'il y a collision, met les en croix par exemple ;).
Je vais modifier l'algo pour éviter ce problème.

Une petite question: GLUT monopolise 100% du proc, comment paramétrer GLUT pour éviter ce problème sans mettre de pause dans le code ?

En fait, je me suis planté à propos Lagrange :$, la technique des multiplicateurs de Lagrange permet d'obtenir équations matricielles à coups d'étude énergétique des systèmes d'objets, je ne me souviens plus trop mais elle permet d'éviter d'avoir à intégrer angles et positions.... à vérifier.
Bref, ce n'est pas une technique d'intégration comme je l'ai peut-etre laissé entendre.

Pas de soucis sur les performances et la suprématie :D de Runge-Kutta. Je ne sais pas s'il y a mieux actuellement (mieux = plus rapide ET moins gourmand ET plus précis).
Messages postés
1329
Date d'inscription
vendredi 15 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
2
yop
sympa
par contre, tu vois, ca merdouille un peu dès que les rectangles sont un peu trop imbriqués les uns dans les autres.
Runge-Kutta est obsolète ?????!!!!!!?????
Vais aller me renseigner un peu sur ton Lagrange. BAC+2 j'y suis, mais j'ai quand même un doute sur la prise de tête hihi

Pour ta cinématique :
tu vas galérer.
Commence déjà par faire une classe pour que le client puisse avoir le plus d'infos possibles sur la collision.
et gère le cas ou l'un est dans l'autre, ici tu as subtilement évité le cas en mettant des dimension incompatibles ^^

Je ne mets pas de note avant que ça ne soit plus avancé, elle peut monter assez haut cette source ( et être utile à pas mal de monde ). Finalise la :)
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008

Oups post croisés ;)

Ok je passerais tout en C++ et ajouterais des classes pour le rapport de collision (regrouper contacts + normales aux contacts), ça sera plus facile de faire évoluer la source.
Il n'y a pas que les touches: maintenant on peut tout manipuler avec la souris: clique gauche ou clique droit sur rectangle + glisser.
Messages postés
573
Date d'inscription
samedi 16 novembre 2002
Statut
Membre
Dernière intervention
9 avril 2008

Pour gérer les mouvements ces rectangles c'est une autre paire de manche.

On peut faire de la simulation cinématique:
dès qu'on a contact, on inverse la vitesse de rotation du rectangle et on fait "rebondir" le vecteur vitesse du rectangle sur l'orthogonal à la normale au contact.
Il n'y a pas de notions d'efforts.

On peut faire de la simulation dynamique:
dès qu'on a contact, on applique l'effort résultant au rectangle.
On déduit l'accélération linéaire et angulaire que doit subit le rectangle (avec à son inertie et à sa masse) puis en intégrant deux fois on obtient sa position et son angle.
Pour intégrer il existe de nombreuses méthodes. Celles que je connais bien sont obsolètes (euler, euler modifié, runge kutta, ...). Pour ceux qui sont intéressés, la méthode actuellement employée par les moteurs physiques est celle des multiplicateurs de Lagrange, extrêmement puissante et accessible sans prise de tête pour des bac+2.
Afficher les 10 commentaires

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.