Ich schaue mir dieses nette Raycasting-Tutorial unter http://lodev.org/cgtutor/raycasting.html an und habe eine wahrscheinlich sehr einfache mathematische Frage.
Im DDA-Algorithmus habe ich Probleme, die Berechnung der Variablen deltaDistX und deltaDistY zu verstehen. Dies sind die Entfernungen, die der Strahl von 1 x-Seite zur nächsten x-Seite oder von 1 y-Seite zur nächsten zurücklegen muss y-Seite, im quadratischen Raster, aus dem die Weltkarte besteht (siehe Abbildung unten).
Im Tutorial werden sie wie folgt berechnet, jedoch ohne viel Erklärung:
//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 und rayDirX sind die Richtung eines gestrahlten Strahls.
Wie bekommt man diese Formeln? Es sieht so aus, als ob der Satz von Pythagoras Teil davon ist, aber irgendwie geht es hier um Spaltung. Kann mich jemand darauf hinweisen, welches mathematische Wissen mir hier fehlt, oder die Formel "beweisen", indem er zeigt, wie sie abgeleitet ist?
quelle
Antworten:
Ahh ja. Ich warf meine Mathematik darauf und ich denke, ich habe es geschlagen. Sie haben Recht, es beinhaltet den Satz von Pythagoras und einige Skalierungen.
Sie beginnen mit Ihrem normalisierten Vektor, der Ihren Strahl darstellt.
Es hat eine
x
Komponente und einey
Komponente. Zuerst wollen wir sehen, wie lange es dauert, wenn eine Einheit in diex
Richtung fährt . Also, was machen wir? Wir wollen den gesamten Vektor so skalieren, dass diex
Komponente gleich ist1
. Um herauszufinden, nach was skaliert werden soll, gehen wir wie folgt vor:Das in Mathe zu schreiben ist wirklich gerecht
Also können wir das einfach so nennen
1
.Dann für die
y
Komponente:Jetzt haben wir unsere skalierten Komponenten als
(1, rayDirY/rayDirX)
Jetzt wollen wir die Länge wissen. Jetzt kommt Pythagorean ins Spiel. Welches ist
Wenn wir also unsere skalierten Komponenten anschließen, erhalten wir:
Wenden Sie etwas Algebra an und vereinfachen Sie und wir erhalten:
Gleiches gilt für die Länge, wenn die
y
Komponente eine Einheit zurücklegt, außer wir haben(rayDirX/rayDirY, 1)
die ErgebnisseDort haben wir Ihre beiden Gleichungen aus Ihrer Frage. Ziemlich ordentlich. Danke für die Algebraübung.
quelle
Angenommen, die Einheitslänge jedes Gitterabstands beträgt 1.
Das Dreieck (Dreieck 1) im veröffentlichten Diagramm (OP-Frage), das aus
deltaDistX
der Hypotenuse besteht, hat den gleichen Kosinuswert seines Winkels wie der Kosinuswert des Winkels, der in dem Dreieck gebildet wird, das durch die Bestandteile desrayDir# Vector
(Dreieck 2) gebildet wird.Das Folgende kann also gleichgesetzt ( Vektorgrößen unten ) und vereinfacht (1-3) werden.
Denken Sie daran: cos = Base / Hypotenuse
In ähnlicher Weise kann die Gleichung für
deltaDistY
abgeleitet werden.quelle