【问题标题】:How to get the length of the entire 3d linear function in Python?如何在 Python 中获取整个 3d 线性函数的长度?
【发布时间】:2018-02-01 19:17:14
【问题描述】:

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

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()

这给了我以下输出:

我能得到整个螺旋的长度吗?是否可以在图形上标记一个点的位置,该点位于距离(例如5),从图形的开头点(x,y)=(0,0)开始,并拉出这些坐标?如有任何提示,我将不胜感激。

【问题讨论】:

  • 是的,尽管以编程方式进行会很困难。相反,请尝试使用线积分的解析解。
  • 我谦虚地希望我能以某种方式自动执行此操作,因为我想经常更改图表的初始条件。
  • 在这种情况下,我认为您可能必须以小步长近似线积分,以小间隔找到功能点并保持距离的总和。

标签: python math matplotlib spiral


【解决方案1】:

毕达哥拉斯也适用于 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")

【讨论】:

  • 启示录!非常感谢!
猜你喜欢
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多