我正在尝试从通常用于指定晶体学晶胞的参数生成一些轴矢量。这些参数包括三个轴的长度:a,b,c和它们之间的角度:alpha,beta,gamma。按照惯例,alpha是b和c轴之间的角度,beta是a和c之间的角度,gamma是a和b之间的角度。
现在获得前两个矢量表示很容易。我可以将a轴设置为x轴,因此a_axis = [a,0,0]。然后,我需要将b从a旋转一个角度gamma,这样我就可以停留在x-y平面中,并且b_axis = [b * cos(gamma),b * sin(γ),0]。
问题是第三个向量。我无法找出确定它的好方法。我想出了一些不同的解释,但都没有解决。一种是想象在轴axis_a和axis_b周围有两个圆锥体,它们的大小由角度α和beta规定。这些圆锥的相交会产生两条线,z轴正方向的一条线可以用作长度为c的axis_c的方向。
有人知道我应该如何确定axis_c吗?
谢谢。
最佳答案
已知长度的两个向量u,v之间的夹角alpha可以从它们的内部(点)乘积中找到:
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(alpha)= [cos(gamma)* x + sin(gamma)* y] / sqrt(x ^ 2 + y ^ 2 +1)
cos(beta)= x /(sqrt(x ^ 2 + y ^ 2 +1)
将第一个方程除以第二个方程(假设beta不是直角!),我们得到:
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β*(1 + r ^ 2))]
通过对方程求平方,我们引入了一个伪像根,对应于选择x的符号。因此,请在“原始”第二个方程式中检查由此获得的x的解,以确保获得正确的cos(beta)符号。
添加:
如果beta是直角,则比上面的简单。 x = 0是强制的,我们只需要求解y的第一个方程:
cos(α)= sin(γ)* y / sqrt(y ^ 2 +1)
对分母进行平方和乘法运算得到y的二次数,类似于我们之前所做的。请记住检查您选择的y符号:
cos ^2α*(y ^ 2 +1)= sin ^2γ(y ^ 2)
cos ^2α= [sin ^2γ-cos ^2α] * y ^ 2
y ^ 2 = cos ^2α/ [sin ^2γ-cos ^2α]
实际上,如果角度α,β,γ中的一个是直角,则最好标记该角度γ(在前两个向量A,B之间)以简化计算。
关于math - 角度分开的轴,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6605157/