Я проверяю этот хороший учебник по лучевой трансляции по адресу http://lodev.org/cgtutor/raycasting.html и у меня, вероятно, очень простой математический вопрос.
В алгоритме DDA у меня возникают проблемы с пониманием вычисления переменных deltaDistX и deltaDistY, которые представляют собой расстояния, которые должен пройти луч от 1 стороны x до следующей стороны x, или от 1 стороны y до следующей у, в квадратной сетке, которая составляет карту мира (см. скриншот ниже).
В учебнике они рассчитываются следующим образом, но без особых пояснений:
//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 и rayDirX - это направление луча.
Как вы получаете эти формулы? Похоже, теорема Пифагора является ее частью, но каким-то образом здесь происходит деление. Может кто-нибудь подсказать мне, какие математические знания мне здесь не хватает, или «доказать» формулу, показав, как она получается?
источник
Ответы:
Ааа да Я бросил свою математику в это, и я думаю, что ударил это. Вы правы, это включает в себя теорему Пифагора и некоторое масштабирование.
Вы начинаете с вашего нормализованного вектора, который представляет ваш луч.
Он имеет
x
компонент иy
компонент. Во-первых, мы хотим увидеть, сколько времени проходит одна единица вx
направлении. Так что же нам делать? Мы хотим масштабировать весь вектор так, чтобыx
компонент был равен1
. Чтобы выяснить, что его масштабировать, мы делаем следующее:Записать это в математике это действительно просто
Так что мы можем просто назвать это
1
.Тогда для
y
компонента:Так что теперь у нас есть наши масштабированные компоненты как
(1, rayDirY/rayDirX)
Теперь мы хотим знать длину. Теперь пифагорейец вступает в игру. Который
Итак, подключив наши масштабированные компоненты, мы получим:
Применим некоторую алгебру и упростим, и мы получим:
То же самое касается длины, когда
y
компонент перемещается на одну единицу, за исключением того, что мы получим,(rayDirX/rayDirY, 1)
что приводит кТам у нас есть два уравнения из вашего вопроса. Довольно аккуратно. Спасибо за упражнение алгебры.
источник
Предполагая, что единичная длина каждого расстояния сетки равна 1.
Треугольник (Треугольник 1) в размещенной диаграмме (вопрос ОП), состоящий из
deltaDistX
гипотенузы, имеет то же значение косинуса своего угла, что и значение косинуса угла, образованного в треугольнике, образованном составляющимиrayDir# Vector
(Треугольник 2)Таким образом, следующее может быть приравнено ( векторные величины ниже ) и упрощено (1-3)
Помните: cos = Base / Hypotenuse
Аналогичным образом
deltaDistY
можно вывести уравнение для .источник