Math 得到一个向量垂直于另一个向量的公式是什么?
得到垂直于向量a的平面上的三维向量B的公式是什么 也就是说,给定一个向量a,公式f(角度,模数)是什么,它给出了一个垂直于a的向量,该向量具有所述模数并旋转了一个角度?使用另一个与Math 得到一个向量垂直于另一个向量的公式是什么?,math,vector,formula,algebra,Math,Vector,Formula,Algebra,得到垂直于向量a的平面上的三维向量B的公式是什么 也就是说,给定一个向量a,公式f(角度,模数)是什么,它给出了一个垂直于a的向量,该向量具有所述模数并旋转了一个角度?使用另一个与a不共线的向量C计算AxC 在垂直于A的平面上有许多可能的方向。如果你真的不在乎选择哪一个,只需创建一个任意向量C,而不是与A共线: if (A2 != 0 || A3 != 0) C = (1, 0, 0); else C = (0, 1, 0); B = A x C; 如果两个向量垂直,则它们的
a不共线的向量C
计算AxC
在垂直于A
的平面上有许多可能的方向。如果你真的不在乎选择哪一个,只需创建一个任意向量C
,而不是与A
共线:
if (A2 != 0 || A3 != 0)
C = (1, 0, 0);
else
C = (0, 1, 0);
B = A x C;
如果两个向量垂直,则它们的点积为零
所以:v1(x1,y1,z1),v2(x2,y2,z2)
你知道(x1,y1,z1)
。放置任意的x2
和y2
,您将收到相应的z2
:
z1 * z2 = -x1 * x2 - y1 * y2
=> z2 = (-x1 * x2 - y1 * y2) / z1
注意z1
是否为0
。然后你就在平面上了。一种方法是找到从正z轴(或任何其他轴)到给定向量的旋转变换。然后使用此变换变换
def getvertical(v1,模数,角度):
v2=向量(0,0,1)
v1_len=v2.length()
轴=v1.交叉乘积(v2)
sinAngle=axis.length()/v1#u len | u x v |=| u |*| v |*sin(角度)
cosAngle=v1.dot_乘积(v2)/v1_len#u。v=| u |*| v |*cos(角度)
axis=axis.normalize()
#atan2(sin(a),cos(a))=a,-pi
要计算旋转矩阵,请参阅本文:
另一种方法是使用。这是一个稍微有点绕你的头,但它的数字少跟踪
function (a,b,c)
{
return (-b,a,0)
}
但当a,b接近0时,这个答案在数值上并不稳定
要避免这种情况,请使用:
function (a,b,c)
{
return c<a ? (b,-a,0) : (0,-c,b)
}
功能(a、b、c)
{
返回c max(a,b)=max(a,b,c)
,以及自max(a,b,c)
不应该接近零,向量也不应该接近零。c>a
的情况类似。我认为这应该产生一个任意向量,垂直于给定向量vec
,同时保持数值稳定,而不管vec
(假设vec
的大小不接近零)。假设Vec3D是任意数值类型的三维向量
Vec3D arbitrary_orthogonal(Vec3D vec)
{
bool b0 = (vec[0] < vec[1]) && (vec[0] < vec[2]);
bool b1 = (vec[1] <= vec[0]) && (vec[1] < vec[2]);
bool b2 = (vec[2] <= vec[0]) && (vec[2] <= vec[1]);
return cross(vec, Vec3D(int(b0), int(b1), int(b2)));
}
Vec3D任意正交(Vec3D-vec)
{
boolb0=(vec[0] bool b1=(vec[1]q4w56几乎是一个稳健的解决方案。问题:1)没有考虑缩放。2)没有在应该的时候比较两个变量之间的大小
scale = |x| + |y| + |z|
if scale == 0:
return (0,0,0)
x = x/scale
y = y/scale
z = z/scale
if |x| > |y|:
return (z, 0,-x)
else:
return (0, z,-y)
在处理非常大或非常小的数字时,缩放非常重要。另外,一般情况下,最好对0到1之间的值进行浮点运算。只有一个向量,我想要一个公式,它给出一个向量,该向量与它的角度和长度成函数。Dokkat,这就是为什么你一直使用两个向量的原因描述是因为给定第一个向量V1,有许多向量V2垂直于V1。在2D空间中,至少有两个这样的向量长度为1。在3D空间中,有无限多个向量垂直于V1!您要查找的是任意一个V2(每个V2到V1),或者要检测(V1,V2)是的。你有一个向量给定了v1(x1,y1,z1)
。正如你所提到的,如果z1
为0,这将失败,但是在这种情况下,这个问题在数学上仍然完全有效。例如,找到一个与[1,0,0]垂直的向量。z1
为0,但是[0,1,0]绝对是垂直于[1,0,0]的向量。另一种方法见我的答案。两件事:第一,我们是在二维中操作吗?三?n
?第二,你的标题是“垂直”,但问题主体是“旋转一个角度”-这个角度会不是90度吗?在三维空间中,垂直于给定向量的向量(二维向量空间)是无限多的。公式不会生成单个向量。仅供参考,我循环了10000个随机单位向量,并确保dot(vec,高于_func(vec))==0
对于所有向量(我懒得尝试分析验证稳定性,所以这是我的下一个最佳选择)。它工作得很好。例如,如果向量是(a=0,b=0,c=-1),c@GiovanniFunchal事实上,“max(a,b,c)不应接近于零”的说法即使是“good”也可能是错误的向量,正如你提到的。这个解释应该用L无穷范数而不是最大值来修正,还有一个解释,希望能有所帮助。
scale = |x| + |y| + |z|
if scale == 0:
return (0,0,0)
x = x/scale
y = y/scale
z = z/scale
if |x| > |y|:
return (z, 0,-x)
else:
return (0, z,-y)