我试图找到给定两个向量的平均向量。 当我说“平均”时,我并不是指我添加2个向量并除以2的基本平均值 - 而是指向平均值。例如:
V1 = {1, 0}
V2 = {-1, 0}
AverageVector = {0, 1} or {0, -1}
我想我正在寻找的更多是在角度领域。如果angle1 = 0,并且angle2 = 180,则平均角度为90°,垂直于两者。如果angle1 = 90且angle2 = 110,则平均角度为100等
找到“平均”向量的解决方案不使用向量进行角度转换(如atan2,sin,cos),这一点很重要。我正在寻找一种方法来单独使用矢量数学找到“平均”矢量。
注意:所有矢量都是2D。
关于投票结束的注意事项:链接为“已经回答”的问题不回答此问题。如上所述,我必须在不使用sin,cos或atan2将矢量转换为角度的情况下完成此操作。链接的问题仅涉及使用此类转换的解决方案。
答案 0 :(得分:2)
给定v0 =(x0,y0)和v1 =(x1,y1),您正在寻找v =(x,y),使得v0和v之间的角度等于v和v1之间的角度。正如您所正确观察的那样,总会有两种解决方案。
我们知道两个向量的点积等于它们的大小和它们分开的角度的乘积 - 即,我们知道v0。 v = x.x0 + y.y0 = | v || v0 | cos(z)和v1。 v = x.x1 + y.y1 = | v || v1 | cos(z)。注意,角度z保持不变;我们不妨为v取一个单位向量,所以| v | = 1.现在,我们得到两个方程:
x.x0 + y.y0 = |v0|cos(z)
x.x1 + y.y1 = |v1|cos(z)
我们可以解决第一个cos(z)并替换第二个:
x.x1 + y.y1 = (|v1|/|v0|)(x.x0 + y.y0)
记住,我们可以为v取一个单位向量,所以我们知道x * x + y * y = 1.用y(或x表示x)求解x的上述等式,将其插入x * x + y * y = 1,然后使用二次方程求解变量。注意:二次方程产生零,一或两个解 - 但你应该总是属于两个解决方案。
注意:我们的解决方案需要知道矢量/角度关系,但程序不需要执行任何转换。虽然我们使用cos(z)来导出程序的数学,但我们最终表达只依赖于矢量'组件。
根据评论更新
找出哪个向量是"最接近"对于原始的两个,注意以下内容是有用的:从上面的表达式得到的两个向量将指向相反的方向。换句话说,将它们分开180度。
所以,假设我们发现"平均"原始向量X和Y的向量A和B.A或B中的哪一个是"更接近"到X和Y?好吧,我们知道
Ax * Xx + Ay * Xy = |A||X|cos(Az)
Bx * Xx + By * Xy = |B||X|cos(Bz)
现在,角度为0时余弦最大,角度增加时余弦变大(绝对值)。由于我们希望角度接近0,我们需要更大的余弦。分别求解cos(Az)和cos(Bz)的上述等式中的每一个;评估(所有其他数量已知),然后你知道余弦最大的矢量是"最接近"向量X(因此也向量Y.练习 - 为什么必须这是真的?)
当然,如果cos(Az)= cos(Bz),那么A和B是"等距的"从矢量X(以及Y) - 在这种情况下,X和Y将是平行的,A和B将是平行的,A / B将与X / Y平行。