我正在尝试从通常用于指定晶体学单位细胞的参数生成一些轴向量。这些参数由三个轴的长度组成:a,b,c和它们之间的角度:alpha,beta,gamma。按惯例,alpha是b和c轴之间的角度,beta是a和c之间的角度,a和b之间是gamma。
现在获取前两个的矢量表示很容易。我可以任意设置a轴到x轴,所以a_axis = [a,0,0]。然后我需要旋转b远离a角度伽玛,所以我可以留在xy平面中这样做,并且b_axis = [b * cos(gamma),b * sin(gamma),0]。
问题是第三个向量。我无法找出一个很好的清洁方法来确定它。我已经找到了一些不同的解释,但没有一个已经淘汰出局。一个是想象围绕轴axis_a和axis_b有两个锥体,其大小由角度α和β指定。这些锥体的交点产生两条线,正z方向的一条线可以用作长度为c的axis_c的方向。
有人知道我应该如何确定axis_c吗?
感谢。
答案 0 :(得分:2)
已知长度的两个向量 u,v 之间的角度α可以从它们的内部(点)乘积< 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)
将第一个等式除以第二个等式(假设β不是直角!),我们得到:
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)]
实际上,如果角度α,β,γ之一是直角,那么最好标记角度伽玛(在前两个矢量A,B之间)以简化计算。
答案 1 :(得分:1)
这是一种找到所有Cx,Cy,Cz(前两个与其他答案相同)的方法,假设A =(Ax,0,0),B =(Bx,By,0),并假设| C | = 1
1)cos(beta)= AC /(| A || C |)= AxCx / | A | =&GT; Cx = |A|cos(beta)/Ax = cos(beta)
2)cos(alpha)= BC /(| B || C |)=(BxCx + ByCy)/ | B | =&GT; Cy = (|B|cos(alpha)-Bx cos(beta))/By
3)为了找到Cz,让O为(0,0,0)处的点,T为(Cx,Cy,Cz)处的点,P为T on Oxy的投影,Q为T的投影牛。所以P是(Cx,Cy,0)处的点,Q是(Cx,0,0)处的点。因此,从直角三角形OQT我们得到
tan(beta)= | QT | / || OQ | = | QT | / Cx
从右三角形TPQ得到| TP | ^ 2 + | PQ | ^ 2 = | QT | ^ 2。所以
Cz = |TP| = sqrt(|QT|^2 - |PQ|^2) = sqrt( Cx^2 tan(beta)^2 - Cy^2 )
答案 2 :(得分:0)
我不确定这是否正确,但我不妨一试。希望我不会得到十亿美元的投票......
我懒得按照必要的数量缩放向量,所以我假设它们都被标准化为长度为1.您可以对计算进行一些简单的修改以考虑不同的大小。另外,我将使用*来表示点积。
A =(1,0,0)
B =(cos(g),sin(g),0)
C =(Cx,Cy,Cz)
A * C = cos(beta)//这只是点积的定义。我假设幅度是1,所以我可以跳过那个部分,你说beta是A和C之间的角度。
A * C = Cx //我通过乘以每个相应的值来做到这一点,而Cy和Cz被忽略,因为它们被乘以0
cos(beta)= Cx //合并前两个方程式
B * C = cos(alpha)
B * C = Cx * cos(g)+ Cy * sin(g)= cos(beta)* cos(g)+ Cy * sin(g)
(cos(alpha) - cos(beta)* cos(g))/(sin(g))= Cy
老实说,我不确定如何获得向量C的z分量,但我希望它是一个相对简单的步骤。如果我能搞清楚,我会编辑我的帖子。