CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Collision de 2 rectangles, meilleur algo

fil_razorback
fil_razorback
Niveau 10
29 octobre 2005 à 11:11:15

(Pas la place de mettre le ? dans le nom du sujet)

Après plusieurs petits déjeuners passés à réfléchir, j´ai trouvé ce qui me semble être la réponse à la question "Comment déterminer le plus rapidement possible si deux rectangles dont on connait les coordonnées sont se chevauchent ?"

Note 1 :d) Un des deux rectangles (le rectangle1) à des cooronnées constantes, son aire est égale à A1.
Note 2 :d) Pour parler des coordonnées des rectangles j´emploie ce système : Coordonnée-Coin-rectangle
Par exemple la coordonnée Y du deuxieme coin du premier rectangle se dit y2-1. Les coins se lisent en partant de celui en haut à gauche et en tournant dans le sens des aiguilles d´une montre.

Ma solution :
:d) Calculer l´aire A2 du rectangle 2
:d)
-Si A2 >= A1 ==>
Si x1-2 ou x2-2 compris entre x1-1 et x2-1 il y a collision
OU
Si y1-2 ou y2-2 compris entre y1-1 et y2-1 il y a collision
-Si A2 < A1 ==>
Si x1-1 ou x2-1 compris entre x1-2 et x2-2 il y a collision (meme test avec les y)
OU
Si y1-1 ou y2-1 compris entre y1-2 et y2-2 il y a collision

Voilà, si quelqu´un à mieux à me proposer je suis tout ouïe...

Lapintade
Lapintade
Niveau 30
29 octobre 2005 à 11:48:07

Ils ne peuvent pas tourner tes rectangles ?

fil_razorback
fil_razorback
Niveau 10
29 octobre 2005 à 11:51:09

Tourner?
A priori non puisque le rectangle 1 c´est l´aire de jeu et le rectangle 2 un bloc de tiles...enfin je suis pas sur d´avoir bien compris la question.

Lapintade
Lapintade
Niveau 30
29 octobre 2005 à 12:01:54

Ok, ca tourne pas donc.

Ma formule de collision dans DNA, c´est :

Collision si et seulement si :

if (ie1_x <= ie2_x1 &&
ie2_x <= ie1_x1 &&
ie1_y <= ie2_y1 &&
ie2_y <= ie1_y1 )
{
return true;
}

e1 c´est le rectangle 1
e2 c´est le rectangle 2

x c´est le point a droite, x1 a gauche, etc ...

Lapintade
Lapintade
Niveau 30
29 octobre 2005 à 12:33:10

Dans cette formule, tu utilise que les 2 points du haut de tes rectanlge.

Avec juste 4 comparaison, tu determine si il y a collision ou pas. Classe :)

tomtomclancy
tomtomclancy
Niveau 9
29 octobre 2005 à 16:19:19

Sinon tu peux te servire comme en 3D de bounding box, etant donnée que se sont deja des rectangle, tu calcule la distance entre les dexu centre de tes rectangle. et tu verifie que la distance obtenue n´est pas inferieur a la somme de la moitier des longueurs, ou largeur ca depends dans quel sens ils sont.

Ou avec les bounding sphere c´est la meme chose.

fil_razorback
fil_razorback
Niveau 10
29 octobre 2005 à 16:41:57

Lapintade :d) Et ca marche si c´est pas un (ou deux ou trois) coin de chaque rectngle qui est impliqué dans la collision?

Tomtom==> meme question :question:

tomtomclancy
tomtomclancy
Niveau 9
29 octobre 2005 à 16:54:20

Pour ma solution tu regarde meme pas les coins, il te suffit de connaitre le centre (x,y) et la longeur, largeur des objets.

et vu que tu dis que tes objets ne tourne pas c´est encore plus simple.

En fait l´algo consiste juste a verifier qu´un des objets ne traverse l´autre.

Lapintade
Lapintade
Niveau 30
29 octobre 2005 à 17:13:29

Ca marche dans tous les cas. Essaies.

fil_razorback
fil_razorback
Niveau 10
29 octobre 2005 à 18:16:35

Jvais essayer les deux :p)

Tomtom => "ma somme de la moitier des longueurs, ou largeur ca depends dans quel sens ils sont. "
:d) c´est à dire qu´on prend le plus grand coté de chaque rectangle et qu´on divise le tout par 2 ?

tomtomclancy
tomtomclancy
Niveau 9
29 octobre 2005 à 22:23:54

Heu... non pas vraiment.

[explication]
"J´invente plein de nom de variable mais c´est pour donner une idee"
RECT rect1, rect2;
float centre1, centre2;
centre1.x = rect1.x + rect1.longueur/2;
centre1.y = rect1.y + rect1.largeur/2;
centre2.x = rect2.x + rect2.longueur/2;
centre2.y = rect2.y + rect2.largeur/2;
UINT dist.x = abs(centre2.x - centre1.x);
UINT dist.y = abs(centre2.y - centre1.y);

if(dist.x < (rect1.longueur+rect2.longueur)/2) && dist.y < (rect1.largeur+rect2.largeur)/2) {
....// collision
}

fil_razorback
fil_razorback
Niveau 10
30 octobre 2005 à 11:32:38

Merci ^^

fil_razorback
fil_razorback
Niveau 10
31 octobre 2005 à 13:02:01

Hop un autre petit probleme du meme style, si je veux savoir si le rectangle 2 est entièrement dans le rectangle 1 je fais comment?

(vais pas me casser la tête vu ce que ca a donné la dernière fois :rire: )

Remarque : finalement j´ai utilisé l´algo de tomtom qui d´apres mes tests est plus rapide de quelques ms. Par contre tu t´etais trompé, c´etait pas and mais or dans la condition finale, enfin je crois :gni:

Lapintade
Lapintade
Niveau 30
31 octobre 2005 à 13:06:34

Je vois pas trop comment on peut faire plus rapide que quelques comparaison :) Enfin a partir du moment ou tu as trouvé quelquechose qui fonctionne, c´est l´essentiel.

Pour un rectangle contenu dans un autre, je dirais que tu tests le signe des difference des absisses et ordonnées des points.

fil_razorback
fil_razorback
Niveau 10
31 octobre 2005 à 13:10:27

C´est la solution je pense la plus simple maisje suis sur que y´a un truc à faire avec les aires encore une fois ^^

playerpg
playerpg
Niveau 10
31 octobre 2005 à 13:11:28

ça devient un topic de maths ici !
je m´en vais tout de suite :-p

tomtomclancy
tomtomclancy
Niveau 9
31 octobre 2005 à 13:12:58

non c´est bien && qui le fait, avec un || tu aura colision meme quand ils se croiseront.

si tes deux rectangles ont la meme taille suffit de savoir si la distance entre leur centre est null.

Lapintade
Lapintade
Niveau 30
31 octobre 2005 à 13:25:33

"maisje suis sur que y´a un truc à faire avec les aires encore une fois ^^"

Ca me rappelle la celebre devise Shadocl : "Pourquoi faire simple quand on peut faire compliqué ?" :)

fil_razorback
fil_razorback
Niveau 10
31 octobre 2005 à 13:32:54

"Ca me rappelle la celebre devise Shadocl : "Pourquoi faire simple quand on peut faire compliqué ?" "

:d) Parce que quand on a un "moteur revolutionnaire semi art-based semi tile-based" qui bouffe à mort on a interêt à gagner des ressources sur le scrolling ^^

fil_razorback
fil_razorback
Niveau 10
05 décembre 2005 à 21:20:42

"Pour un rectangle contenu dans un autre, je dirais que tu tests le signe des difference des absisses et ordonnées des points."

Après avoir bossé sur ces foutus JI, je reviens à Phen;

Donc en fait on dit que :
si (X_petit_rect - X_grand_rect) > 0
&
si (Y_petit_rect - Y_grand_rect) > 0
&
si (Xdroite_petit_rect - Xdroite_grand_rect) < 0
si (Ybas_petit_rect - Ybas_grand_rect) < 0
:d) inclusion

Dis j´ai bon? j´ai bon :question: :p)

Sous forums
  • Aide à l'achat Mac
  • Steam Deck
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Macintosh
  • Hardware
La vidéo du moment