Math 以角度分隔的轴

Math 以角度分隔的轴,math,vector,linear-algebra,rotatetransform,Math,Vector,Linear Algebra,Rotatetransform,我试图从通常用于指定晶体学单位细胞的参数中生成一些轴向量。这些参数包括三个轴的长度:a、b、c以及它们之间的角度:α、β、γ。按照惯例,α是b轴和c轴之间的角度,β是a轴和c轴之间的角度,γ是a轴和b轴之间的角度 现在获取前两个的向量表示很容易。我可以任意设置a轴到x轴,所以a_轴=[a,0,0]。然后我需要将b从a旋转gamma角,这样我就可以在x-y平面上旋转,b_轴=[b*cos(gamma),b*sin(gamma),0] 问题是第三个向量。我想不出一个干净的方法来确定它。我已经想出了一

我试图从通常用于指定晶体学单位细胞的参数中生成一些轴向量。这些参数包括三个轴的长度:a、b、c以及它们之间的角度:α、β、γ。按照惯例,α是b轴和c轴之间的角度,β是a轴和c轴之间的角度,γ是a轴和b轴之间的角度

现在获取前两个的向量表示很容易。我可以任意设置a轴到x轴,所以a_轴=[a,0,0]。然后我需要将b从a旋转gamma角,这样我就可以在x-y平面上旋转,b_轴=[b*cos(gamma),b*sin(gamma),0]

问题是第三个向量。我想不出一个干净的方法来确定它。我已经想出了一些不同的解释,但没有一个能解释清楚。一种是想象在轴a和轴b周围有两个圆锥体,其大小由角度α和β指定。这些圆锥体的交点创建两条直线,正z方向的一条直线可用作长度为c的轴_c的方向

有人知道我应该如何确定轴c吗


谢谢。

我不确定这是否正确,但我还是试试看。希望我不会得到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//I是通过将每个对应的值相乘来实现的,而Cy和Cz被忽略,因为它们被乘以0

cos(beta)=Cx//组合前两个方程

B*C=cos(α)

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分量,但我希望这是一个相对简单的步骤。如果我能弄明白,我会编辑我的帖子。

这里有一种方法可以找到所有的Cx,Cy,Cz(前两个与另一个答案相同),假设a=(Ax,0,0),B=(Bx,By,0),并假设| C |=1

1) cos(beta)=AC/(A | | | C |)=AxCx/| A |=>
Cx=| A | cos(beta)/Ax=cos(beta)

2) cos(alpha)=BC/(|B | C |)=(BxCx+ByCy)/|B |=>
Cy=(|B | cos(alpha)-Bx cos(beta))/By

3) 为了求Cz,设O是(0,0,0)处的点,T是(Cx,Cy,Cz)处的点,p是T在Oxy上的投影,Q是T在Ox上的投影,所以p是(Cx,Cy,0)处的点,Q是(Cx,0,0)处的点。因此,从直角三角形OQT我们得到

tan(β)=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 )

已知长度的两个矢量u、v之间的角度α可从其内积(点)中找到:

cos(alpha)=/(u | | | | | | | v | |)

也就是说,α的余弦是两个向量的内积除以其长度的乘积

第三个的z分量可以是任何非零值。在获得正确的角度后缩放任何或所有轴向量不会改变角度,因此假设(假设)Cz=1

现在前两个向量也可以是A=(1,0,0)和B=(cos(gamma),sin(gamma),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)

将第一个方程除以第二个方程(假设β不是直角!),我们得到:

cos(α)/cos(β)=cos(γ)+sin(γ)*(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)的正确符号

添加:

如果β是直角,事情比上面简单。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(α)/[sin^2(γ)-cos^2(α)]


实际上,如果其中一个角度α,β,γ是直角,最好标记该角度γ(在前两个向量a,B之间)为了简化计算。

是的,z是个杀手……我已经能够计算出c_轴投影到xy平面上的“阴影”会击中的x/y坐标,但没有取得任何进展。谢谢!我已经把它复杂化了。我必须记住,对方程进行分割是可以的!我想这就是我应该做的重复这种方法。再次感谢。欢迎!我们可以通过平方两个方程并清除分母,然后求解两个未知的线性方程来避免方程的分割