Python 如何计算倾斜的三维矢量的上升?

Python 如何计算倾斜的三维矢量的上升?,python,pandas,matplotlib,3d,trigonometry,Python,Pandas,Matplotlib,3d,Trigonometry,我有一个数据,它显示了三维空间中矢量的起点和终点坐标,这些矢量是围绕3倍螺旋轴定向的: x y z 0 38.522003 5.600998 129.203995 # start of v1 1 23.854996 66.576996 112.487000 # end of v1 2 4.417000 40.182999 121.309998 # start of v2 3 65.761993

我有一个数据,它显示了三维空间中矢量的起点和终点坐标,这些矢量是围绕3倍螺旋轴定向的:

            x          y           z
0   38.522003   5.600998  129.203995  # start of v1
1   23.854996  66.576996  112.487000  # end of v1
2    4.417000  40.182999  121.309998  # start of v2
3   65.761993  27.550995  104.285004  # end of v2
4   50.272003  56.473999  112.857010  #...
5   12.574997   6.202995   96.598007
6   45.192993   8.042999  105.147995
7   15.934998  63.490005   88.347992
8    3.613998  33.112991   97.102997
9   66.244003  35.949997   80.309006
10  44.052994  59.996002   89.057999
11  19.916000   2.125000   72.294998
12  51.201996  11.974998   81.044998
13   9.035995  58.367996   64.238998
14   4.529999  25.854996   72.759003
15  64.563004  44.283997   56.357998
16  37.153000  62.003998   65.026001
17  28.061996   0.000000   48.126995
看起来是这样的:

我想计算向量的每个起始和结束位置之间相对于下一个位置的上升和角度,对于每个vn和vn+1,这些值应该是相似的。问题是矢量的位移不平行于z轴,否则确定上升将是一项非常简单的任务。v1(开始)和v2(开始)之间的距离给出了它们之间的距离。加载上述数据作为数据帧,v1和v2起点之间的距离:

d = np.sqrt((xyz_coords['x'][0] - xyz_coords['x'][2])**2 + (xyz_coords['y'][0] - xyz_coords['y'][2])**2 + (xyz_coords['z'][0] - xyz_coords['z'][2])**2)

您可能还注意到,z差约为8.95,但如前所述,z差不是合适的上升值,因为它受倾斜的影响。如果我知道如何确定倾斜角度,我将能够通过使用
z_prop=sin(倾斜角度)*d
计算上升。有没有简单的方法来校正倾斜并获得正确的z值?

我认为没有任何简单的方法来解决这个问题。在我看来,你必须建立一个由6个非线性方程组成的系统来求解3个旋转角度和3个平移量,假设你的向量经历刚体旋转和平移,从而给出下一个向量的位置。我们可以使用
scipy.optimize.fsolve
来求解非线性系统。获得旋转角度后,可以找到相对于z轴的倾斜。但是代码并不琐碎,因此我无法在这里全部编写。

可能是我,但我没有得到您期望的输出。您能否提供前三个向量的预期输出?您可以将其想象为比萨斜塔:您想要计算窗口之间的距离(v1(开始)到v2(开始)),但由于塔是倾斜的,您不能使用z轴值差,因为距离将小于实际距离。现在我有一个像这座塔一样的东西,它是倾斜的,有不同方向的窗户,但它们不只是在彼此上方,而是每120度旋转一次,并随着上升而移动。
d = np.sqrt((xyz_coords['x'][0] - xyz_coords['x'][2])**2 + (xyz_coords['y'][0] - xyz_coords['y'][2])**2 + (xyz_coords['z'][0] - xyz_coords['z'][2])**2)