Estou consultando este bom tutorial sobre raycasting em http://lodev.org/cgtutor/raycasting.html e tenho uma pergunta matemática provavelmente muito simples.
No algoritmo DDA, estou tendo problemas para entender a calibração das variáveis deltaDistX e deltaDistY, que são as distâncias que o raio deve percorrer de 1 lado x para o próximo lado x, ou de 1 lado y para o próximo lado y, na grade quadrada que compõe o mapa do mundo (veja a captura de tela abaixo).
No tutorial, eles são calculados da seguinte forma, mas sem muita explicação:
//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 e rayDirX são a direção de um raio que foi lançado.
Como você obtém essas fórmulas? Parece que o teorema de Pitágoras faz parte dele, mas de alguma forma há divisão envolvida aqui. Alguém pode me informar sobre o conhecimento matemático que estou perdendo aqui ou "provar" a fórmula, mostrando como ela é derivada?
fonte
Respostas:
Ah sim. Joguei minha matemática e acho que acertou. Você está correto, pois envolve o teorema de Pitágoras e algumas escalas.
Você começa com seu vetor normalizado que representa seu raio.
Tem um
x
componente e umy
componente. Primeiro, queremos ver quanto tempo demora quando ele viaja uma unidade nax
direção. Então, o que fazemos? Queremos escalar o vetor inteiro para que ox
componente seja igual1
. Para descobrir em que escala, fazemos o seguinte:Escrevendo isso em matemática é realmente apenas
Então podemos chamar assim
1
.Depois, para o
y
componente:Então agora temos nossos componentes dimensionados como
(1, rayDirY/rayDirX)
Agora, queremos saber o comprimento. Agora Pitágoras entra em jogo. Qual é
Então, conectando nossos componentes em escala, obtemos:
Aplique alguma álgebra e simplifique e obtemos:
O mesmo vale para o comprimento quando o
y
componente viaja uma unidade, exceto que teremos(rayDirX/rayDirY, 1)
quais resultados emAí temos suas duas equações da sua pergunta. Muito arrumado. Obrigado pelo exercício de álgebra.
fonte
Supondo que o comprimento da unidade de cada distância da grade seja 1.
O triângulo (Triângulo 1) no diagrama publicado (questão OP), que consiste
deltaDistX
na hipotenusa, tem o mesmo valor de cosseno de seu ângulo que o valor de cosseno de ângulo formado no triângulo formado pelos constituintes dorayDir# Vector
(Triângulo 2)Portanto, o seguinte pode ser equacionado ( magnitudes do vetor abaixo ) e simplificado (1-3)
Lembre-se: cos = Base / Hipotenusa
Da mesma forma, a equação para
deltaDistY
pode ser derivada.fonte