Показать сообщение отдельно
Старый 01.02.2011, 02:11
semenyakinVS вне форума Посмотреть профиль Отправить личное сообщение для semenyakinVS Найти все сообщения от semenyakinVS
  № 5  
Ответить с цитированием
semenyakinVS

Регистрация: Mar 2010
Сообщений: 137
i.o., спасибо за код. Но...

Цитата:
Не мудрите с углами — синусы и косинусы в разы тяжелее умножений и сложений
В пять раз. Я проверял. А в последнем приведённом коде шесть умножений, а ещё разницы и суммы. Понимаю, у меня тоже будут разницы углов...

Но проблема в том, что зеркало не нормализировано.

Добавлено через 1 час 16 минут
И, кстати, что такое -2.0 ?

Добавлено через 1 час 38 минут
Глянул на сайте (ссылка чего-то побилась, а источник уже не помню). Понял, откуда формула.

Да, верно. Способ мне нравится. Он универсальный.

В 2Д-случае всё-таки косинус рулит, но для 3Д - только вектора. Иначе запарюсь всё считать.
Буду думать.

Добавлено через 70 часов 46 минут
Что ж... Написал я алгоритм.

Во-первых, вот этот код:

Код AS1/AS2:
var m:Number = -2.0 * (this.x * mirrorVec.y - this.y * mirrorVec.x);
this.x += m * mirrorVec.y;
this.y -= m * mirrorVec.x;
Не будет работать. Там нету нормали, значит он уже не правильный. Погарячился, извините. Не заметил, что вы вшили нормализацию в расчёт новых координат.
Правильность проверю.

Во-вторых, подумал я, и решли, что с углом работать всё-таки логичнее. По нескольким причинам:

1. Для оптики естественнее работа с углами. Они там везде фигурируют.
2. Расчёт одного косинуса и синуса будет быстрее, чем действия, необходимые для векторного решения. И, если подумать, его можно перенести на 3D.
3. Задавать луч точкой и углом логичнее, чем двумя точками. Заодно орт считать удобнее.

Короче, буду опять мучить себя поисками углового решения...

Код того, что есть пока (не работает, но можно составить общее впечатление по кол-ву действий):

Код AS3:
var mul:Number = updateRay.Norm.X*updateRay.Norm.Y+updateRay.DeltaX*updateRay.DeltaY;
 
var newX:Number = updateRay.End.X+updateRay.DeltaX-updateRay.Norm.X*2*mul;
var newY:Number = updateRay.End.Y+updateRay.DeltaY-updateRay.Norm.Y*2*mul;
 
res.push(new Ray2d(updateRay.End, Math.atan2(newY,newX)));
(Информацию брал здесь: Хорошая статья по трассировке)


Последний раз редактировалось semenyakinVS; 04.02.2011 в 01:05. Причина: Убрал немотивированный наезд