TEST DE COLLISION ENTRE 2 RECTANGLES

f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 - 5 déc. 2005 à 06:33
Mokost Messages postés 48 Date d'inscription jeudi 18 décembre 2003 Statut Membre Dernière intervention 29 mars 2010 - 27 oct. 2006 à 11:47
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/34916-test-de-collision-entre-2-rectangles

Mokost Messages postés 48 Date d'inscription jeudi 18 décembre 2003 Statut Membre Dernière intervention 29 mars 2010
27 oct. 2006 à 11:47
Je l'ai testé plusieurs fois et j'ai remarqué qu'elle ne fonctioné pas trés bien !
Elle a quelques bugs cette fonction. Si vous trouvez le comment du pourquoi prevenez moi.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
6 déc. 2005 à 19:12
lol, merci mokost, mais cela reste TA source! loin de moi l'idée de m'approprier celle ci!

par contre n'oublis pas de preciser qu'elle necessite l'unité MATH pour la fonction InRange().

on pourrais egalement en dire que c'est grace a l'utilisation des operateurs logiques sur les booleens (inrange renvois true ou false) qui permet d'obtenir le resultat rapidement.

preciser egalement qu'il ne faut pas oublier les parentheses pour separarer les deux condition sur X et Y ...
attention : R+L.T+B <> (R+L).(T+B)

l'avantage egalement c'est que cette methode peu s'appliquer a d'autre utilisation pour gerer par exemple un depot Drag&Drop sur une fiche ou un deplacement d'objet ou encore simplement verifier ou est le curseur de souris par rapport a un objet sur la fiche.

Je pense que a partir de cela, tu pourrais nous ecrire quelques methodes sympathique, toujours dans la meme optique, et completer ainsi ton code source avec c'est nouvelles fonctions.
mais la, libre a toi... ^^
Mokost Messages postés 48 Date d'inscription jeudi 18 décembre 2003 Statut Membre Dernière intervention 29 mars 2010
5 déc. 2005 à 23:21
de ce pas je la change, du coup ce n'est plus ma source mais celle de f0xi
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
5 déc. 2005 à 22:47
hihi, ben disons qu'a force de vous lire et d'avoir vos conseils, je suis trés inspiré pour ecrire du code leger, propre et performant. d'ou le "indirectement inspiré".
f0xi > Ah bon, je t'ai inspiré cette méthode ? Ca devait être mon clone :lol:
Sinon, Mokost, penses à modifier ta source. Ce serait bête de garder ce code alors que f0xi t'a donné quelque chose de mieux.

... ++ Flo
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
5 déc. 2005 à 19:10
de rien Mokost, c'est le but de partager nos avis et connaissances.

tu peu remercier egalement beaucoup de membres actif de delphifr qui m'ont indirectement inspiré cette methode, tel Florenth, GrandVizir, DelphiProg, Jlen100 et j'en passe...

ta methode merite quand meme une petite note, au moins pour l'effort de l'avoir ecrite.
meme si au final elle est "bricolage" :p

As tu tester mon exemple ? si oui, fonctionne t'il correctement ?
Mokost Messages postés 48 Date d'inscription jeudi 18 décembre 2003 Statut Membre Dernière intervention 29 mars 2010
5 déc. 2005 à 17:00
merci pour les remarque et pour le niveau j'ai pas du faire attention lors de la mise en ligne
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
5 déc. 2005 à 06:49
par contre, je pense que tu devrais passer ce code en "debutant".

cela ne me semble pas vraiment difficile, ni a comprendre ni a apprendre.

et j'en profite pour preciser que dans ma table de veritée il faut lire

(b+b).(b+b)=r , et non: b+b.b+b=r

pour ceux qui on fait l'etude des operateurs logique en electro ça leur rapelleras des souvenirs ^^
+ : ou (or)
. : et (and)

voila j'espere que cela te seras utile et que sa rendras tes prog plus clair et moins lourd.
f0xi Messages postés 4205 Date d'inscription samedi 16 octobre 2004 Statut Modérateur Dernière intervention 12 mars 2022 35
5 déc. 2005 à 06:33
hola ... y'a l'air d'y avoir beaucoup trop de condition la dedans ...

je pense que tu peu facilement resumer ton test colision a cela :
(inrange est dans l'unité Math)


function TestCollide(const r1,r2 : TRect) : boolean;
begin
// r1X dans r2Xmin, r2Xmax
if inrange(r1.left, r2.left,r2.right) or
inrange(r1.right,r2.left,r2.right) then begin

// r1Y dans r2Ymin, r2Ymax
if inrange(r1.top, r2.top ,r2.bottom) or
inrange(r1.bottom, r2.top, r2.bottom) then begin

result := true;
end else begin

result := false;
end;
end;
end;


deja remplacer les condition X >= X1 and <= X2 par Inrange(X,X1,X2) plus court et plus lisible.

ensuite, pourquoi tester la colision R2 > R1 puisqu'on a deja tester la colision R1 > R2.
si la colision R1 > R2 est bonne, l 'inverse serat bon egalement.
donc cela ne sert a rien de confirmer la condition une deuxieme fois.
9 > 5 > 2 est forcement aussi vrai que 2 < 5 < 9!


on pourrais meme ecrire si je ne fais pas d'erreur :

result :=
(inrange(r1.left, r2.left,r2.right) or inrange(r1.right,r2.left,r2.right))
and
(inrange(r1.top, r2.top ,r2.bottom) or inrange(r1.bottom, r2.top, r2.bottom));


petite table de veritée vite fait :

0+0.0+0 = 0
0+0.0+1 = 0
0+0.1+0 = 0
0+0.1+1 = 0

0+1.0+0 = 0
0+1.0+1 = 1
0+1.1+0 = 1
0+1.1+1 = 1

1+0.0+0 = 0
1+0.0+1 = 1
1+0.1+0 = 1
1+0.1+1 = 1

1+1.0+0 = 0
1+1.0+1 = 1
1+1.1+0 = 1
1+1.1+1 = 1


nickel, donc je disais que ta fonction peu se reduire a cela :

function TestCollide(const r1, r2 : TRect) : boolean;
begin
result :=
(InRange(r1.left,r2.left,r2.right) OR InRange(r1.right,r2.left,r2.right))
AND
(InRange(r1.top,r2.top,r2.bottom) OR InRange(r1.bottom,r2.top,r2.bottom));
end;
Rejoignez-nous