什么是使矢量垂直于另一个矢量的公式?

Mai*_*tor 8 math vector algebra formula

使三维矢量B位于垂直于矢量A的平面上的公式是什么?

也就是说,给定矢量A,什么是公式f(角度,模数),其给出垂直于A的矢量,具有所述模数并旋转角度θ.

Pet*_*hev 11

如果两个矢量是垂直的,则它们的点积为零.

所以:v1(x1, y1, z1), v2(x2, y2, z2).

=> x1 * x2 + y1 * y2 + z1 * z2 = 0
Run Code Online (Sandbox Code Playgroud)

你知道(x1, y1, z1).放任意x2,y2你会收到相应的z2:

z1 * z2 = -x1 * x2 - y1 * y2
=> z2 = (-x1 * x2 - y1 * y2) / z1
Run Code Online (Sandbox Code Playgroud)

要知道,如果z10.那你就在飞机上.

  • 是.你有一个给定`v1(x1,y1,z1)`的向量. (4认同)

Hen*_*rik 7

用另一个不共线的矢量计算叉积 .AxCCA

在垂直于平面的平面上有许多可能的方向A.如果你真的不在乎,选择哪一个,只需创建一个C不共线的任意向量A:

if (A2 != 0 || A3 != 0)
    C = (1, 0, 0);
else
    C = (0, 1, 0);
B = A x C; 
Run Code Online (Sandbox Code Playgroud)


gol*_*pot 7

function (a,b,c)
{
    return (-b,a,0)
}
Run Code Online (Sandbox Code Playgroud)

但是当a,b接近0时,这个答案不是数值稳定的.

为避免这种情况,请使用:

function (a,b,c) 
{
    return  c<a  ? (b,-a,0) : (0,-c,b) 
}
Run Code Online (Sandbox Code Playgroud)

上面的答案是数值稳定的,因为在c < a那时max(a,b) = max(a,b,c),然后vector(b,-a,0).length() > max(a,b) = max(a,b,c),因为max(a,b,c)不应该接近零,所以矢量也是如此.该c > a情况是相似的.

  • 仅供参考,我遍历了 10,000 个随机单位向量,并确保所有向量的 `dot(vec, above_func(vec)) == 0`(我懒得尝试分析验证稳定性,所以这是我的下一个最佳选择)。它工作得很好。 (2认同)
  • 如果矢量是例如(a = 0,b = 0,c = -1),则c <a,因此结果将是0,0,0,它不是单位矢量.这对我来说看起来不正确 (2认同)
  • @GiovanniFunchal确实,正如您提到的那样,即使对于“好”向量,“max(a,b,c) 不应接近零”的陈述也可能是错误的。应该使用 L-infinity 范数而不是 max 来更正解释,并且 c&lt;a 应该用 |c|&lt;|a| 改变。 (2认同)

sir*_*ton 6

我相信这应该产生一个垂直于给定向量的任意向量,vec同时保持数值稳定,无论 的角度如何vec(假设 的大小vec不接近于零)。假设Vec3D是任意数值类型的三维向量。

Vec3D arbitrary_orthogonal(Vec3D vec)
{
  bool b0 = (abs(vec[0]) <  abs(vec[1])) && (abs(vec[0]) <  abs(vec[2]));
  bool b1 = (abs(vec[1]) <= abs(vec[0])) && (abs(vec[1]) <  abs(vec[2]));
  bool b2 = (abs(vec[2]) <= abs(vec[0])) && (abs(vec[2]) <= abs(vec[1]));

  return cross(vec, Vec3D(int(b0), int(b1), int(b2)));
}
Run Code Online (Sandbox Code Playgroud)

非正式解释

恰好 1 个且仅 1 个布尔值被设置;如果维度的大小严格小于所有后续维度且不大于所有先前维度,bN则设置。N然后我们就有了一个具有单个非零维度的单位向量,它对应于 中最小量值的维度vec。该叉积与叉积的定义正交vecvec现在考虑一下,只有当两个向量非常紧密地对齐时,叉积在数值上才不稳定。考虑我们的单位向量仅在一个维度上很大,并且该维度对应于vec较小的维度。vec因此,在进行叉积之前,可以保证 是松散正交的,在 的所有维度都vec相等的情况下,正交性最小。在这种最不正交的情况下,我们仍然是相当正交的,因为我们的单位向量除了一维 0 之外的所有维度都为 0,而vec所有维度都相等。因此,我们避免了对两个几乎对齐的向量进行叉积的不稳定情况。

感谢 Goularou 发现错误。