如何计算倾斜的3D矢量的上升?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何计算倾斜的3D矢量的上升?相关的知识,希望对你有一定的参考价值。

我有一个数据,显示3D空间中矢量的起点和终点的坐标,它们围绕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

看起来像这样:Representation of vectors in space

for i in range(xyz_coords.shape[0]):
    if i == 0:
        ax.plot(xyz_coords['x'].loc[0:1], xyz_coords['y'].loc[0:1], xyz_coords['z'].loc[0:1])
    elif i%2 == 0 and i!=0:
        ax.plot(xyz_coords['x'].loc[i:i+1], xyz_coords['y'].loc[i:i+1], xyz_coords['z'].loc[i:i+1])

我想计算向量相对于下一个向量的每个起始位置和结束位置之间的上升和角度,并且这些值对于每个vn和vn + 1应该是相似的。问题是矢量移位与z轴不平行 - 否则确定上升是非常简单的任务。 v1(start)和v2(start)之间的距离给出了它们之间的距离。将上面给出的数据加载为pandas DataFrame,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(tilt_angle) * d来计算上升。有没有简单的方法来纠正倾斜并获得正确的z值?

答案

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

以上是关于如何计算倾斜的3D矢量的上升?的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 如何从3D矢量计算轴旋转或旋转矩阵

如何在 3D 空间中旋转矢量? P5.js

Python:以kivy旋转3D对象(不需要的倾斜)

计算垂直于由点和真北航向描述的平面的 3d 矢量

arcmap矢量图倾斜的怎么办

倾斜摄影测量单体化思路