如何绘制围绕圆形抛物面的螺旋

How to plot spiral that goes around circular paraboloid

提问人:eln 提问时间:4/13/2023 最后编辑:Trenton McKinneyeln 更新时间:4/13/2023 访问量:125

问:

我有一个 3D 圆形抛物面表面,我想绘制一个螺旋,它从表面上的任意点开始,并在“拥抱”表面时向下移动。

这是我到目前为止的尝试:

import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = plt.axes(projection='3d')

# Surface ------------------
# Create the mesh in polar coordinates and compute corresponding Z
r0 = 5
r = np.linspace(0, r0, 50)
p = np.linspace(0, 2*np.pi, 50)
R, P = np.meshgrid(r, p)
Z = -R**2 + r0**2

# Express the mesh in the cartesian system
X, Y = R*np.cos(P), R*np.sin(P)

# Plot the surface
ax.plot_surface(X, Y, Z, linewidth=0, antialiased=False, alpha=0.2)

# Spiral -------------------
u = np.arange(0, 29, 0.1)
x = 0.17*u*np.cos(u)
y = 0.17*u*np.sin(u)
z = -0.15*u/np.pi*(x**2 + y**2) + r0**2

# Plot spiral
ax.plot3D(x, y, z, 'r')

plt.show()

Plot

然而,我的螺旋实际上并没有跟随表面。

我也试过这个:

x = []
y = []
z = []
for i in range(50):
    x.append(X[i,i])
    y.append(Y[i,i])
    z.append(-(X[i,i]**2 + Y[i,i]**2) + r0**2)
ax.plot3D(x, y, z, 'b')

Plot2

它绕着表面转,但我不知道如何让它绕着表面转更多的圈。有什么想法吗?

python matplotlib 图螺旋

评论


答:

2赞 lifezbeautiful 4/13/2023 #1

第二次尝试中的公式是正确的。如果我在你的第一次尝试中使用相同的公式,我就会得到你想要的。

该行需要替换为 。z = -0.15*u/np.pi*(x**2 + y**2) + r0**2-(x**2 + y**2) + r0**2

对于可重复性:

%matplotlib notebook
import numpy as np
import matplotlib.pyplot as plt

fig = plt.figure()
ax = plt.axes(projection='3d')

# Surface ------------------
# Create the mesh in polar coordinates and compute corresponding Z
r0 = 5
r = np.linspace(0, r0, 50)
p = np.linspace(0, 2*np.pi, 50)
R, P = np.meshgrid(r, p)
Z = -R**2 + r0**2

# Express the mesh in the cartesian system
X, Y = R*np.cos(P), R*np.sin(P)

# Plot the surface
ax.plot_surface(X, Y, Z, linewidth=0, antialiased=False, alpha=0.2)

# Spiral -------------------
# Attempt 1
u = np.arange(0, 29, 0.1)
x = 0.17*u*np.cos(u)
y = 0.17*u*np.sin(u)
z = -(x**2 + y**2) + r0**2
# z = -0.15*u/np.pi*(x**2 + y**2) + r0**2
# Plot spiral
ax.plot3D(x, y, z, 'r')


plt.show()

输出如下图所示:

enter image description here

1赞 user21508463 4/13/2023 #2

抛物面的隐式方程为

z = a - b r²

跟。r² = x² + y²

因此,对于极坐标中给出的任何曲线

r = f(Θ)

抛物面中的嵌入是

x = r cos(Θ)
y = r sin(Θ)
z = a - b r²

您可以通过使用三角函数的参数来调整转数,而不是作为三角函数的参数。Θ