已知长度的两个向量u,v之间的角度 alpha可以从它们的内(点)积 <u,v> 中找到:
cos(alpha) = <u,v>/(||u|| ||v||)
也就是说,alpha 的余弦是两个向量的内积除以它们的长度的乘积。
所以你第三个的 z 分量可以是任何非零值。在获得正确的角度后缩放任何或所有轴矢量不会改变角度,所以让我们假设(比如说)Cz = 1。
现在前两个向量也可能是 A = (1,0,0) 和 B = (cos(gamma),sin(gamma),0)。它们的长度都是 1,因此选择 C 时要满足的两个条件是:
cos(alpha) = <B,C>/||C||
cos(beta) = <A,C>/||C||
现在我们只有两个未知数 Cx 和 Cy 需要求解。为了简单起见,我将它们称为 x 和 y,即 C = (x,y,1)。因此:
cos(alpha) = [cos(gamma)*x + sin(gamma)*y]/sqrt(x^2 + y^2 + 1)
cos(beta) = x/(sqrt(x^2 + y^2 + 1)
将第一个方程除以第二个方程(假设 beta 不是直角!),我们得到:
cos(alpha)/cos(beta) = cos(gamma) + sin(gamma)*(y/x)
这是求解比率 r = y/x 的线性方程。一旦你有了它,将 y = rx 代入上面的第二个等式并平方给出 x 的二次方程:
cos^2(beta)*((1+r^2)x^2 + 1) = x^2
cos^2(beta) = (1 - cos^2(beta)*(1 + r^2))x^2
x^2 = cos^2(beta)/[(1 - cos^2(beta)*(1 + r^2))]
通过对方程求平方,我们引入了伪根,对应于选择 x 的符号。所以检查你在“原始”第二个方程中得到的 x 的解,以确保你得到 cos(beta) 的正确符号。
添加:
如果 beta 是一个直角,那么事情就比上面的简单了。x = 0 是强制的,我们只需求解 y 的第一个方程:
cos(alpha) = sin(gamma)*y/sqrt(y^2 + 1)
对分母进行平方和乘以得到 y 的二次方,类似于我们之前所做的。请记住检查您为 y 选择的符号:
cos^2(alpha)*(y^2 + 1) = sin^2(gamma)*y^2
cos^2(alpha) = [sin^2(gamma) - cos^2(alpha)]*y^2
y^2 = cos^2(alpha)/[sin^2(gamma) - cos^2(alpha)]
实际上,如果角度 alpha、beta、gamma 之一是直角,则最好标记该角度 gamma(在前两个向量 A、B 之间)以简化计算。