如何在Python中获取整个3d线性函数的长度?

How to get the length of the entire 3d linear function in Python?

我创建了一个 spring 形式的对数螺线图。我正在使用以下参数方程:

x=a*exp(b*th)*cos(th)
y=a*exp(b*th)*sin(th)

这是我的代码:

from mpl_toolkits.mplot3d import Axes3D
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['legend.fontsize'] = 10

fig = plt.figure(figsize=(10,10))
ax = fig.gca(projection='3d')

a=0.6
b=0.2
th=np.linspace(0, 25, 1000)
x=a*np.exp(b*th)*np.cos(th)
y=a*np.exp(b*th)*np.sin(th)
z = np.linspace(0, 2, len(th))
ax.plot(x, y, z)

ax.plot(x, y, zdir='z', zs=0)
ax.plot(x, z, zdir='y', zs=100)

ax.set_xlim([-100, 100])
ax.set_ylim([-100, 100])
ax.set_zlim([-0, 2.5])

plt.show()

这给了我以下输出:

我能得到整个螺旋的长度吗?能不能在图上标记一个点的位置,从图的起点(x,y)=(0,0)开始,在距离(比如5)处,把这些坐标拉出来?如果有任何提示,我将不胜感激。

毕达哥拉斯在 3 个维度上也适用。任意线段 si 的长度为

si = sqrt(xi**2+yi**2+zi**2)

因此,

a=0.6
b=0.2
th=np.linspace(0, 25, 1000)
x=a*np.exp(b*th)*np.cos(th)
y=a*np.exp(b*th)*np.sin(th)
z = np.linspace(0, 2, len(th))

diffs = np.sqrt(np.diff(x)**2+np.diff(y)**2+np.diff(z)**2)
length = diffs.sum()
print length # prints 451.011712939

行的长度是 451。
请注意,直线在 z 方向的延伸比 x 和 y 方向的延伸小得多,所以我们不妨完全省略 z,这样做的错误是 0.0250.006% .

另一个目的是在直线上找到长度为 l=5 的点。当然,由于我们使用的是数值数据,因此我们找不到恰好 5 个单位长的点,但是例如而不是长度小于 5 但最接近它的那个点。我们可以计算发生这种情况的索引,

l = 5 # length to find coordinate of
cumlenth = np.cumsum(diffs)
s = np.abs(np.diff(np.sign(cumlenth-l))).astype(bool)
c = np.argwhere(s)[0][0]

然后在原始数组中找到该索引。

print c   # index of coordinate, here 192
print x[c], y[c], z[c] # 0.144750230412 -1.56183108038 0.384384384384

然后我们可能会用散点图标记那个点,

ax.scatter([x[c]], [y[c]], [z[c]], color="crimson")