在确定两个向量之间的角度时,有没有办法选择你开始的方向?
Is there a way to choose the direction that you start from when determining the angle between two vectors?
我有两个源自原点的 3-d 矢量
v1 = array([ 0.20297736, -0.19208957, -0.63320655])
v2 = array([-0.63721771, 0.17457218, 0.12666251])
这两个向量正交于向量axis_vector = array([ 0.21708059, 0.95127211, -0.21899175])
我试图确定v1和v2之间的角度,条件是我总是从v1开始。这意味着 V1 将是 0 度存在的点。从v1逆时针移动,我想确定v1和v2之间的角度。
目前,我一直在使用:
angle=np.arccos(np.dot(vec2,vec1)/(np.linalg.norm(vec1)*np.linalg.norm(vec2))) *180/np.pi
但是这行特定的代码不允许我指定哪个向量优先作为起始向量。因此,无论我希望从哪个矢量开始,它总是 returns 相同的角度。
如有任何帮助,我们将不胜感激!
这个技巧似乎是要理解正交轴矢量也代表一个平面。明白了这一点,你就可以解决这个问题了:
import numpy as np
import math
v2 = np.array([0.20297736, -0.19208957, -0.63320655])
v1 = np.array([-0.63721771, 0.17457218, 0.12666251])
axis_vector = np.array([ 0.21708059, 0.95127211, -0.21899175])
def find_angle(v1, v2, vn):
x1 = v1[0]
y1 = v1[1]
z1 = v1[2]
x2 = v2[0]
y2 = v2[1]
z2 = v2[2]
xn = vn[0]
yn = vn[1]
zn = vn[2]
dot = x1 * x2 + y1 * y2 + z1 * z2
det = x1 * y2 * zn + x2 * yn * z1 + xn * y1 * z2 - z1 * y2 * xn - z2 * yn * x1 - zn * y1 * x2
angle = math.atan2(det, dot)*180/np.pi
return angle
angle = find_angle(v1, v2, axis_vector)
此答案基于:Direct way of computing clockwise angle between 2 vectors
编辑:为了完整起见,如果您必须使用多个向量和平面多次执行此计算。
def find_angle(v1, v2, vn):
if v1.shape[0] == 1:
x1 = v1[0]
y1 = v1[1]
z1 = v1[2]
x2 = v2[0]
y2 = v2[1]
z2 = v2[2]
xn = vn[0]
yn = vn[1]
zn = vn[2]
dot = x1 * x2 + y1 * y2 + z1 * z2
det = x1 * y2 * zn + x2 * yn * z1 + xn * y1 * z2 - z1 * y2 * xn - z2 * yn * x1 - zn * y1 * x2
angle = m.atan2(det, dot) * 180 / np.pi
angle = np.array([angle])
else:
elementWiseConcat = np.asarray(list((zip(v1, v2, vn))))
dot = np.einsum('ij, ij->i', v1, v2)
det = np.linalg.det(elementWiseConcat)
angle = np.arctan2(det, dot) * 180 / np.pi
return angle
我有两个源自原点的 3-d 矢量
v1 = array([ 0.20297736, -0.19208957, -0.63320655])
v2 = array([-0.63721771, 0.17457218, 0.12666251])
这两个向量正交于向量axis_vector = array([ 0.21708059, 0.95127211, -0.21899175])
我试图确定v1和v2之间的角度,条件是我总是从v1开始。这意味着 V1 将是 0 度存在的点。从v1逆时针移动,我想确定v1和v2之间的角度。
目前,我一直在使用:
angle=np.arccos(np.dot(vec2,vec1)/(np.linalg.norm(vec1)*np.linalg.norm(vec2))) *180/np.pi
但是这行特定的代码不允许我指定哪个向量优先作为起始向量。因此,无论我希望从哪个矢量开始,它总是 returns 相同的角度。
如有任何帮助,我们将不胜感激!
这个技巧似乎是要理解正交轴矢量也代表一个平面。明白了这一点,你就可以解决这个问题了:
import numpy as np
import math
v2 = np.array([0.20297736, -0.19208957, -0.63320655])
v1 = np.array([-0.63721771, 0.17457218, 0.12666251])
axis_vector = np.array([ 0.21708059, 0.95127211, -0.21899175])
def find_angle(v1, v2, vn):
x1 = v1[0]
y1 = v1[1]
z1 = v1[2]
x2 = v2[0]
y2 = v2[1]
z2 = v2[2]
xn = vn[0]
yn = vn[1]
zn = vn[2]
dot = x1 * x2 + y1 * y2 + z1 * z2
det = x1 * y2 * zn + x2 * yn * z1 + xn * y1 * z2 - z1 * y2 * xn - z2 * yn * x1 - zn * y1 * x2
angle = math.atan2(det, dot)*180/np.pi
return angle
angle = find_angle(v1, v2, axis_vector)
此答案基于:Direct way of computing clockwise angle between 2 vectors
编辑:为了完整起见,如果您必须使用多个向量和平面多次执行此计算。
def find_angle(v1, v2, vn):
if v1.shape[0] == 1:
x1 = v1[0]
y1 = v1[1]
z1 = v1[2]
x2 = v2[0]
y2 = v2[1]
z2 = v2[2]
xn = vn[0]
yn = vn[1]
zn = vn[2]
dot = x1 * x2 + y1 * y2 + z1 * z2
det = x1 * y2 * zn + x2 * yn * z1 + xn * y1 * z2 - z1 * y2 * xn - z2 * yn * x1 - zn * y1 * x2
angle = m.atan2(det, dot) * 180 / np.pi
angle = np.array([angle])
else:
elementWiseConcat = np.asarray(list((zip(v1, v2, vn))))
dot = np.einsum('ij, ij->i', v1, v2)
det = np.linalg.det(elementWiseConcat)
angle = np.arctan2(det, dot) * 180 / np.pi
return angle