Угол альфа между двумя векторами u, v известной длины можно найти по их внутреннему (точечному) произведению:
cos (alpha) =/ (|| u || || v ||)
То есть косинус альфа является внутренним произведением двух векторов, деленным на произведение их длин.
Таким образом,z-компонент вашего третьего может иметь любое ненулевое значение.Масштабирование любого или всех векторов осей после правильного определения углов не приведет к изменению углов, поэтому предположим, скажем, Cz = 1.
Теперь первые два вектора также могут быть A = (1, 0,0) и B = (cos (гамма), sin (гамма), 0).Оба имеют длину 1, поэтому при выборе C необходимо выполнить два условия:
cos (alpha) =/ || C ||
cos (бета) =/ || C ||
Теперь у нас есть только два неизвестных, Cx и Cy, для решения которых.Для простоты я буду называть их x и y, то есть C = (x, y, 1).Таким образом:
cos (альфа) = [cos (гамма) * x + sin (гамма) * y] / sqrt (x ^ 2 + y ^ 2 + 1)
cos (бета) = x / (sqrt (x ^ 2 + y ^ 2 + 1)
Разделив первое уравнение на второе (предполагая, что бета не под прямым углом!), мы получим:
cos(альфа) / cos (бета) = cos (гамма) + sin (гамма) * (y / x)
, который представляет собой линейное уравнение для решения отношения r = y / x. Как только вы получите этоподстановка y = rx во втором приведенном выше уравнении и возведение в квадрат дает квадратное уравнение для x:
cos ^ 2 (бета) * ((1 + r ^ 2) x ^ 2 + 1) = x ^ 2
cos ^ 2 (бета) = (1 - cos ^ 2 (бета) * (1 + r ^ 2)) x ^ 2
x ^ 2 = cos ^ 2 (бета)/ [(1 - cos ^ 2 (beta) * (1 + r ^ 2))]
Приведя в квадрат уравнение, мы ввели корень артефакта, соответствующий выбору знака x. Проверьте решения дляx вы получаете из этого во «оригинальном» втором уравнении, чтобы убедиться, что вы получили правильный знак для cos (бета).
Добавлено:
Если бета являетсяПрямой угол, все проще, чем выше. х = 0 дляced, и нам нужно только решить первое уравнение для y:
cos (alpha) = sin (гамма) * y / sqrt (y ^ 2 + 1)
Возведение в квадрат и умножениезнаменатель дает квадратичное значение для y, аналогичное тому, что мы делали раньше.Не забудьте проверить ваш выбор знака для y:
cos ^ 2 (alpha) * (y ^ 2 + 1) = sin ^ 2 (gamma) * y ^ 2
cos ^2 (альфа) = [sin ^ 2 (гамма) - cos ^ 2 (альфа)] * y ^ 2
y ^ 2 = cos ^ 2 (альфа) / [sin ^ 2 (гамма) - cos^ 2 (альфа)]
На самом деле, если один из углов альфа, бета, гамма является прямым углом, лучше всего обозначить эту угловую гамму (между первыми двумя векторами A, B), чтобы упроститьвычисление.