Je vérifie ce joli tutoriel de raycasting sur http://lodev.org/cgtutor/raycasting.html et j'ai une question mathématique probablement très simple.
Dans l'algorithme DDA, j'ai du mal à comprendre le calcul des variables deltaDistX et deltaDistY, qui sont les distances que le rayon doit parcourir de 1 côté x au côté x suivant, ou de 1 côté y au suivant côté y, dans la grille carrée qui compose la carte du monde (voir capture d'écran ci-dessous).
Dans le tutoriel, ils sont calculés comme suit, mais sans trop d'explications:
//length of ray from one x or y-side to next x or y-side
double deltaDistX = sqrt(1 + (rayDirY * rayDirY) / (rayDirX * rayDirX));
double deltaDistY = sqrt(1 + (rayDirX * rayDirX) / (rayDirY * rayDirY));
rayDirY et rayDirX sont la direction d'un rayon qui a été lancé.
Comment obtenez-vous ces formules? Il semble que le théorème de Pythagore en fasse partie, mais d'une manière ou d'une autre, la division est impliquée ici. Quelqu'un peut-il me donner des informations sur les connaissances mathématiques qui me manquent ici, ou «prouver» la formule en montrant comment elle est dérivée?
la source
Réponses:
Ahh oui. J'ai jeté mes maths dessus et je pense que je l'ai frappé. Vous avez raison, cela implique le théorème de Pythagore et une certaine mise à l'échelle.
Vous commencez avec votre vecteur normalisé qui représente votre rayon.
Il a un
x
composant et uny
composant. Nous voulons d'abord voir combien de temps il est quand il voyage d'une unité dans lax
direction. Alors que faisons-nous? Nous voulons mettre le vecteur entier à l'échelle de sorte que lax
composante soit égale1
. Pour savoir par quoi le mettre à l'échelle, nous procédons comme suit:Écrire cela en mathématiques c'est vraiment juste
Nous pouvons donc simplement appeler cela
1
.Ensuite pour le
y
composant:Alors maintenant, nous avons nos composants mis à l'échelle comme
(1, rayDirY/rayDirX)
Maintenant, nous voulons connaître la longueur. Maintenant, Pythagore entre en jeu. Lequel est
Ainsi, en connectant nos composants à l'échelle, nous obtenons:
Appliquez une algèbre et simplifiez et nous obtenons:
Il en va de même pour la longueur lorsque le
y
composant parcourt une unité, sauf que nous aurons(rayDirX/rayDirY, 1)
ce qui se traduira parNous avons là vos deux équations de votre question. Génial. Merci pour l'exercice d'algèbre.
la source
En supposant que la longueur unitaire de chaque distance de grille est de 1.
Le triangle (Triangle 1) dans le diagramme affiché (question OP) consistant
deltaDistX
en l'hypoténuse, a la même valeur de cosinus de son angle que la valeur de cosinus de l'angle formé dans le triangle formé par les constituants durayDir# Vector
(Triangle 2)Ainsi, les éléments suivants peuvent être assimilés ( magnitudes vectorielles ci-dessous ) et simplifiés (1-3)
Rappelez-vous: cos = Base / Hypotenuse
De même, l'équation pour
deltaDistY
peut être dérivée.la source