Désormais le samedi (oui il reste un quart d'heure!) sera la journée de la démo. En effet, avec les interviews et les tests, on s'adresse à un peu tout le monde, mais au final on n'a rien de spécifiquement dev. Alors on s'est bougé un peu, chaque samedi on vous proposera une démo «technique».
Je commence avec une démo de collision, mais des collisions un peu particulières : rectangle qui tourne contre rectangle qui tourne. A quoi cela sert me direz-vous? Eh bien ça peut toujours servir...
Bon je vous laisse regarder cette démo et ses sources.
ExplicationJusqu'à présent, faire des collisions entre deux rectangles, c'est simple, on compare les abscisses, les ordonnées, puis on sait si ils se touchent. Mais dès que les rectangles pivotent, c'est une toute autre histoire.
Donc pour savoir si les deux rectangles, après avoir appliqué une rotation, sont en collision, on va d'abord regarder si leurs zones (les rectangles bleus) se chevauchent, ce qui évitera de faire des tests inutiles si ce n'est pas le cas.
Ensuite, pour tester plus précisément, on a besoin d'une fonction qui détermine si un point (P) est à l'intérieur du rectangle. Un point est dans le rectangle si il est à droite des vecteurs AB, BC, CD et DA. Alors pour savoir si ce point P est à droite, on utilise le produit vectoriel.
Pour deux vecteurs u et v, la composante Z du produit vectoriel de u et v se note uxvy - uyvx. Donc si cette composante Z est à droite, ce sera négatif, sinon ce sera positif. C'est donc le signe que l'on regarde pour savoir si le point est à droite d'un vecteur.
Par exemple avec le point P et le vecteur AB, on en revient au vecteur u = AP et au vecteur v = AB.
Donc une fois cela déterminé, il sera assez simple de savoir quand deux rectangles se touchent : on vérifie en premier lieu si ils sont dans la même zone, ensuite on regarde si les points A,B,C et D sont dans l'autre rectangle, puis si le centre d'un rectangle est dans l'autre et enfin si les diagonales se croisent.