gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 02:13:28 25 4
gpt4 key购买 nike

我创建了一个 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()

这给了我以下输出:

graph of a logarithmic spiral in the form of a spring

我能得到整个螺旋的长度吗?是否可以在图形上标记一个点的位置,该点位于从图形开头的点 (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 但最接近 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")

enter image description here

关于python - 如何在Python中获取整个3d线性函数的长度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48570180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com