Je travaille actuellement sur un projet informatique pour lequel j'ai besoin de quelques notions mathématiques qui me font défaut.
Soit une "map" rectangulaire, que l'on pourrait représenter sous forme de grille, dont chaque case serait remplie soit par des 0 (espace vide), soit par des 1 (murs), et un joueur, caractérisé par une position (x, y) et une direction, toutes deux connues.
Exemple de map:

Je veux obtenir la distance entre le joueur et le premier mur rencontré
Je vérifie donc à chaque intersection entre deux cases de la grille si je suis sur un mur ou pas, je peux obtenir les coordonnées du mur le plus proche.
Par soucis de simplicité, je traite séparément les intersections verticales et les intersections horizontales entre deux cases.
C'est à partir de là que je me perds, je pense avoir les mauvaises formules.
Je sais que je vais devoir trouver les coordonnées d'un premier point d'intersection, A(X1, Y1) puis calculer deux constantes Xa et Ya, que j'ajouterait à A pour obtenir le point suivant et faire le test de collision tant que je ne trouve pas de mur.
Considérons que les cases de ma grille sont de taille 1x1.
Pour les intersections sur l'axe vertical :
On calcule les coordonnées du premier point A(X1, Y1):
X1 = Partie entière de PosJoueur.x si la direction du joueur est comprise entre pi/2 et 3*pi/2, Partie entière de PosJoueur.x + 1 sinon.
Y1 = PosJoueur.y + (PosJoueur.x - X1) * tan(DirJoueur)
Maintenant que nous avons notre premier point, il faut trouver les valeurs Xa et Ya telles que B(X1 + Xa ; Y1 + Ya) soit le prochain point d'intersection entre deux cases de la grille sur l'axe vertical.
Si le joueur regarde vers la droite (pi/2 < DirJoueur < 3*pi/2) : Xa = 1, sinon Xa = -1.
Ya = tan(DirJoueur) <--- J'ai beaucoup plus de doutes sur cette "formule"
Une fois ces valeurs calculées je saurait récupérer les coordonnées de la collision avec le mur et en déduire la distance, c'est vraiment cette partie ci dessus qui me pose problème.
Même chose pour les intersections sur l'axe horizontal :
Calcul de A(X1;Y1) :
Y1 = Partie entière de PosJoueur.y s'il regarde vers le haut, partie entière de PosJoueur.y + 1 sinon.
X1 = PosJoueur.x + (PosJoueur.y - Y1) / tan(DirJoueur) <-- Gros doutes aussi
calcul des constantes Xa et Ya :
Ya = -1 si le joueur regarde vers le haut, 1 sinon
Xa = 1 / tan(DirJoueur) <-- Egalement soupconnée
Voilà, après avoir calculé les points d'impacts et les distances, je prends la plus courte des deux pour avoir la distance finale Joueur, mur.
J'espère que quelqu'un pourra m'aider, j'espère avoir été aussi clair que possible, n'hésitez pas à me poser des questions si quelque chose est mal expliqué ou quoi que ce soit d'autre, j'ai besoin de ces formules afin de modéliser une map 2D en 3D via un algorithme de Ray-casting, mais je n'ai pas les notions nécéssaires.
Plus d'explications sur le ray-Casting :
http://projet-moteur-3d.e-monsite.com/pages/raycasting/raycasting.html
Le site ou j'ai trouvé les formules, qui ne semblent pas fonctionner: (Mais c'est ce que j'ai trouvé de mieux)
http://zupi.free.fr/PTuto/index.php?ch=ptuto&p=ray#54
Merci beaucoup !

