Estoy revisando este bonito tutorial de Raycasting en http://lodev.org/cgtutor/raycasting.html y tengo una pregunta matemática probablemente muy simple.
En el algoritmo DDA, tengo problemas para comprender el cálculo de las variables deltaDistX y deltaDistY, que son las distancias que tiene que recorrer el rayo desde el lado x al siguiente lado x, o desde el lado y al siguiente lado y, en la cuadrícula cuadrada que forma el mapa mundial (ver la captura de pantalla a continuación).
En el tutorial se calculan de la siguiente manera, pero sin mucha explicación:
//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 y rayDirX son la dirección de un rayo que se ha emitido.
¿Cómo se obtienen estas fórmulas? Parece que el teorema de Pitágoras es parte de él, pero de alguna manera hay división involucrada aquí. ¿Alguien puede darme una idea de qué conocimiento matemático me estoy perdiendo aquí, o "probar" la fórmula mostrando cómo se deriva?
fuente
Respuestas:
Ahh si. Le lancé mis cálculos y creo que lo acerté. Estás en lo cierto, implica el teorema de Pitágoras y algo de escala.
Comienzas con tu vector normalizado que representa tu rayo.
Tiene un
x
componente y uny
componente. Primero, queremos ver cuánto dura cuando viaja una unidad en lax
dirección. ¿Asi que que hacemos? Queremos escalar todo el vector para que elx
componente sea igual1
. Para averiguar por qué escalarlo, hacemos lo siguiente:Escribir eso en matemáticas es realmente solo
Entonces podemos llamarlo así
1
.Luego para el
y
componente:Así que ahora tenemos nuestros componentes escalados como
(1, rayDirY/rayDirX)
Ahora, queremos saber la longitud. Ahora entra en juego Pitágoras. Cual es
Al conectar nuestros componentes escalados obtenemos:
Aplica un poco de álgebra y simplifica y obtenemos:
Lo mismo ocurre con la longitud cuando el
y
componente viaja una unidad, excepto que tendremos(rayDirX/rayDirY, 1)
qué resultados enAhí tenemos sus dos ecuaciones de su pregunta. Con buena pinta. Gracias por el ejercicio de álgebra.
fuente
Suponiendo que la unidad de longitud de cada distancia de cuadrícula es 1.
El triángulo (Triángulo 1) en el diagrama publicado (pregunta OP) que consiste
deltaDistX
en la hipotenusa, tiene el mismo valor coseno de su ángulo que el valor coseno del ángulo formado en el triángulo formado por los constituyentes delrayDir# Vector
(Triángulo 2)Entonces lo siguiente puede ser equiparado ( magnitudes vectoriales a continuación ) y simplificar (1-3)
Recuerde: cos = Base / Hipotenusa
De manera similar,
deltaDistY
se puede derivar la ecuación para .fuente