Шаман, раз уж ты решаешь задачу по трассировке луча, то как начальные условия наверно лучше сразу задавать не то, что ты в прошлый раз задал (там есть лишние данные), а такие:
Координаты падающего на поверхность луча, координаты нормали, коэффицент преломления. Всего семь чисел. Ведь синусы сами собой не посчитаются, всеравно их из координат лучей и нормалей считать... Так что, имхо, синусы лучше тут сразу же считать.
Хм... Оценил масштабы решения проблемы моим методом. Пусть вектора у нас сразу будут все по модулю равные одному.
Сначала нам нужно соорудить оператор перехода от исходного базиса к вышеназванному мной базису. Это девять чисел. Три из них - координаты нормали, находятся автоматически. Еще три находятся путем решения таких уравнений:
(Х1, Х2, Х3 - искомые координаты вторго вектора. N1,N2,N3 - координаты нормали, Y1,Y2,Y3 - координаты падающего луча.)
Х1*Y1+X2*Y2+X3*Y3=0
X1*N1+X2*N2+X3*N3=0
Далее выбираем какой угодно оставшийся свободный член. Только, желательно, чтоб небыло переполнения чисел... Вообще, это не точное решение, и если быть крутым математиком, надо его исследовать на устойчивость... Но я что-то эту тему как-то не заботал...
Потом, значит, нормируем этот вектор. Таким образом у нас есть уже два ортонормированных вектора. Используя их, точно так же находим третий вектор(Z1,Z2,Z3). Получаем ортонормированный базис. Строим оператор перехода (матрица три на три) от исходного базиса к этому (это не сложно в плане вычислений).
При помощи построенного оператора переходим к новому базису. В новом базисе(N, Z, X) координаты падающего луча(а) такие(смотрим иллюстрацию Разиля):(cos(а), sin(a), 0). Считаем угол преломленного луча(в) по известной формуле с коэффициентом преломления. Задаем координаты преломленного луча: (-cos(в), -sin(в), 0).
Мы нашли координаты преломленного луча в новом базисе. Теперь нужно найти обратный оператор к ранее построенному для обратного перехода к исходному базису. Как это сделать, я не помню, но задача однозначно решается алгоритмически. После этого, как оператор найдем, используем его для возврата векторов к исходному базису. Применяем этот оператор к найденному вектору, получаем то, ради чего затеяли всю эту бодягу - координаты преломленного луча в старой системе координат.
Нда... подозреваю, будет тормозить... Это в видюхах есть специальные аппаратные приспособления для оперирования с векторами, а в самореализованные такие вещи будут достаточно медленно обрабатываться, наверно...
Шаман писал(а):
Не проходили ещё - я на химическом учусь...
Да это простая формула.
Если функция бесконечно дифференцируема, и известно ее значение в точке a, то значение функции в точке x такое:
f(x)=f(a)+f`(a)*(x-a)+(f``(a)*(x-a)^2)/2!+(f```(a)*(x-a)^3)/3!+... и так далее до бесконечности... Вроде бы так.