3

我正在尝试从通常用于指定晶体学单元的参数中生成一些轴向量。这些参数包括三个轴的长度: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,这样我就可以留在 xy 平面上这样做,并且 b_axis = [b*cos(gamma),b*sin(gamma),0]。

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

有人知道我应该如何确定axis_c吗?

谢谢。

4

3 回答 3

2

已知长度的两个向量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 之间)以简化计算。

于 2011-07-07T15:32:36.070 回答
1

这是一种查找所有 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(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 )
于 2011-07-07T05:41:07.813 回答
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(阿尔法)

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

于 2011-07-07T03:00:45.647 回答