Python 3.x 在3D空间中使用Python定义向量和查找角度?
我在三维空间中有一组点,我定义了一个从一个点到另一个点的向量。我想找到每个向量相对于定义为参考的向量的角度 定义为参考的向量位于这两点之间Python 3.x 在3D空间中使用Python定义向量和查找角度?,python-3.x,numpy,vector,computational-geometry,Python 3.x,Numpy,Vector,Computational Geometry,我在三维空间中有一组点,我定义了一个从一个点到另一个点的向量。我想找到每个向量相对于定义为参考的向量的角度 定义为参考的向量位于这两点之间 head = [0.5806 0.50239 0.54057] tail = [0.5806 0.50239 0. ] 参考向量定义为: v_reference = head - tail 我定义了从一个点到另一个点的向量的点集如下 x y z 0 0.722950
head = [0.5806 0.50239 0.54057]
tail = [0.5806 0.50239 0. ]
参考向量定义为:
v_reference = head - tail
我定义了从一个点到另一个点的向量的点集如下
x y z
0 0.722950 0.611143 0.154976
1 0.722887 0.611518 0.152955
2 0.722880 0.612001 0.150593
3 0.722910 0.612509 0.148238
4 0.723049 0.613053 0.146069
5 0.723113 0.613583 0.143714
6 0.722763 0.613838 0.141321
7 0.721956 0.613876 0.138467
8 0.721638 0.614167 0.136008
9 0.720665 0.614093 0.133143
10 0.719612 0.613956 0.130317
11 0.718672 0.613882 0.127562
12 0.717771 0.613870 0.124638
13 0.716533 0.613668 0.121512
我定义了从一个点到另一个点的向量,用于定义这些向量的点如上表所示
为了定义向量,我使用了以下方法
vector[i] = data[i+1] - data[i]
我想找到每个向量相对于参考向量(v_reference)的角度
我使用以下方法计算角度
def dotproduct(v1, v2):
"""This function computes dot product of two vectors."""
return sum((a*b) for a, b in zip(v1, v2))
def mag(v):
"""This function computes magnitude of two vectors."""
return math.sqrt(dotproduct(v, v))
def angle(v1, v2):
"""This function computes angle between two vectors."""
return (np.arccos(dotproduct(v1, v2) / (mag(v1) * mag(v2))))*(180/math.pi)
角度应该持续增加,但它会波动。我想你的问题可能是如何定义向量。如果我做的每件事都像你在问题中描述的那样,那么我也会得到一系列波动的角度:
import pandas as pd
import numpy as np
def ang(u, v):
# see https://stackoverflow.com/a/2827466/425458
c = np.dot(u/np.linalg.norm(u), v/np.linalg.norm(v))
return np.rad2deg(np.arccos(np.clip(c, -1, 1)))
d = ''' x y z
0 0.722950 0.611143 0.154976
1 0.722887 0.611518 0.152955
2 0.722880 0.612001 0.150593
3 0.722910 0.612509 0.148238
4 0.723049 0.613053 0.146069
5 0.723113 0.613583 0.143714
6 0.722763 0.613838 0.141321
7 0.721956 0.613876 0.138467
8 0.721638 0.614167 0.136008
9 0.720665 0.614093 0.133143
10 0.719612 0.613956 0.130317
11 0.718672 0.613882 0.127562
12 0.717771 0.613870 0.124638
13 0.716533 0.613668 0.121512'''
df = pd.read_csv(pd.compat.StringIO(d), sep='\s+')
xyz = df.values
u = np.diff(xyz, axis=0)
head = np.array([0.5806, 0.50239, 0.54057])
tail = np.array([0.5806, 0.50239, 0. ])
v = head - tail
ang(u, v)
# output:
# array([101.96059029, 104.01677172, 103.97438663, 102.85092705,
# 103.97438663, 104.20457158, 107.01708978, 104.604926 ,
# 107.08468905, 106.84512875, 106.40978005, 107.44768844,
# 108.69610224])
但是,如果您将xyz
点列表视为向量(即从原点开始到每个点的向量),那么您确实会看到参考向量和向量序列之间的角度不断增加,如您所预期的:
ang(xyz, v)
# output:
# array([87.51931013, 87.55167997, 87.58951053, 87.62722792, 87.66196546,
# 87.69968089, 87.73800388, 87.78370828, 87.82308596, 87.8689639 ,
# 87.91421599, 87.95832992, 88.0051486 , 88.05520021])
这可能是解释/分析数据的正确方法吗