我正试图从通常用于指定晶体单位细胞的参数中生成一些轴向量。这些参数包括三个轴的长度:a,b,c和它们之间的角度:alpha,beta,gamma。按照惯例,是b轴和c轴之间的夹角,是a轴和c轴之间的夹角,是a轴和b轴之间的夹角。
现在得到前两个的向量表示很容易。我可以任意设置a轴到x轴,所以a_axis = [a,0,0]。然后我需要将b从a旋转角度,这样我就可以在x-y平面上这样做,b_axis = [b*cos(),b*sin(),0]。
问题是第三个向量。我想不出一个简洁的方法来确定它。我想出了一些不同的解释,但没有一个是正确的。一种是想象有两个锥体围绕着坐标轴axis_a和axis_b它们的大小由角度和确定。这些锥体相交形成两条线,正z方向的一条可以作为axis_c的方向,长度为c。
有人知道我应该如何去确定axis_c吗?
谢谢。
长度已知的两个向量u,v之间的角α可由它们的内(点)积<u,v>;
cos(alpha) = <u,v>/(||u|| ||v||)
也就是说,cos等于两个向量的内积除以它们长度的积
所以第三个的z分量可以是任何非零的值。在你得到正确的角度后,缩放任何或所有的轴向量不会改变角度,所以让我们假设(假设)Cz = 1。
现在,前两个向量可以是A =(1,0,0)和B = (cos(),sin(),0)。它们的长度都是1,所以选择C需要满足的两个条件是:
cos(alpha) = <B,C>/||C||
cos(beta) = <A,C>/||C||
现在我们只需要解两个未知数,Cx和Cy。为了简单起见,我将它们表示为x和y,即C = (x,y,1)因此:
cos(α)=(因为罪(γ)* x + y(γ)*)/√(x ^ 2 + y ^ 2 + 1)
cos() = x/(√2 (x²+ y²+ 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(β)* (1 + r ^ 2)))
通过平方方程,我们引入了一个伪根,对应于选择x的符号。所以检查从"原始"第二个方程中得到的x的解,以确保你得到cos(β)的正确符号。
补充道:
如果是直角,事情就比上面的简单了。X = 0是强制的,我们只需要解y的第一个方程:
cos() = sin()*y/根号(y^2 + 1)
分母的平方和相乘得到y的二次函数,和我们之前做的类似。记得检查y的符号选择:
cos^2()*(y^2 + 1) = sin^2()*y^2
cos ^ 2(α)=[罪^ 2(γ)——因为^ 2(α)]* y ^ 2
y ^ 2 = cos ^ 2(α)/(罪^ 2(γ)——因为^ 2(α)]
实际上,如果角中的一个是直角,最好将这个角标记为(在前两个向量a, B之间)以简化计算。
这是一种找到所有Cx, Cy, Cz(前两个与另一个答案相同)的方法,给定a = (Ax,0,0), B = (Bx, By, 0),并假设|C| = 1
1) cos(β)= AC/(| | | |) =处理完了/| | => Cx = |A|cos(beta)/Ax = cos(beta)
2)因为(α)= BC/B (| | | |) = (BxCx + ByCy)/B | | => Cy = (|B|cos(alpha)-Bx cos(beta))/By
3)求出Cz,设0为点(0,0,0),T为点(Cx,Cy,Cz), p为点T在y上的投影,Q为点T在x上的投影,所以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 )
我不确定这是否正确,但我不妨试试。希望我不会得到10亿张反对票…
我懒得将向量按必要的量进行缩放,所以我假设它们都被标准化为长度为1。您可以对计算进行一些简单的修改,以适应不同的大小。另外,我将使用*来表示点积。
A = (1,0,0)
B = (cos(g), sin(g), 0)C = (Cx, Cy, Cz)
A * C = cos(beta)//这只是点积的一个定义。我假设大小是1,所以我可以跳过这部分,你说是A和c之间的夹角
A * C = Cx//我通过乘以每个对应的值来做这个,并且Cy和Cz被忽略,因为它们被乘以0
cos(beta) = Cx//结合前面两个方程
B * C = cos(alpha)
B * C =残雪* cos (g) + Cy * sin (g) = cos(β)* cos (g) + Cy * sin (g)
(cos(α)- cos(β)* cos (g))/(sin (g)) = Cy
老实说,我不确定如何得到向量C的z分量,但我希望这是一个相对简单的步骤。如果我能想出办法,我就修改我的帖子。