我想画一个旋转的抛物线柱面。比如用两个手指握住对称平面的一个点,让这个平面围绕这个点旋转。
这就是rotation matrix (对于y轴)。
参数化曲面为:
(u,v,u**2)
我已经绘制了绕x轴旋转的曲面:

下面是修改后的(!)绘制绕y轴旋转的代码。
from math import cos,sin,pi
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.auto_scale_xyz([0, 500], [0, 500], [0, 0.15])
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
Us = np.arange(-1, 1, 0.005)
Vs = np.arange(-1, 1, 0.005)
for ch in [0.2*i*pi for i in range(3)]:
Xs = Us*cos(ch) + sin(ch)*(Us**2)
Ys = Vs
Xs, Ys = np.meshgrid(Xs, Ys)
Zs = -Us*sin(ch) + cos(ch)*(Us**2)
Axes3D.plot3D(ax,Xs,Ys,Zs, alpha=0.05)但它不起作用。它会产生无稽之谈。这是我得到的输出:

这些操作都是相同的,所以我真的不明白为什么它不能工作。有人能告诉我我哪里做错了吗?
我需要做这项工作,以便仅查看代数曲面在受到特定旋转时的变换方式。上面的代码是我目前正在调试的代码的一个粗略的简化片段。所以我希望得到的答案是关于这个特定的代码的。
发布于 2012-09-18 21:26:45
这是另一个版本,它使用你的显式旋转方程:
import matplotlib as mpl
mpl.use('TkAgg')
from math import cos,sin,pi
import numpy as np
from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.auto_scale_xyz([0, 500], [0, 500], [0, 0.15])
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
U = np.arange(-1, 1, 0.005)
V = np.arange(-1, 1, 0.005)
def animate():
for ch in [0.2*i*pi for i in range(3)]:
Us, Vs = np.meshgrid(U, V)
Xs = Us*cos(ch) + sin(ch)*(Us**2)
Ys = Vs
Zs = -Us*sin(ch) + cos(ch)*(Us**2)
tmp = ax.plot_surface(Xs,Ys,Zs, alpha=0.05)
fig.canvas.draw()
tmp.remove()
win = fig.canvas.manager.window
fig.canvas.manager.window.after(100, animate)
plt.show()发布于 2012-09-18 20:40:12
对于ax.view_init,rotate_axes3d_demo是这样做的:
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import axes3d
plt.ion()
sin = np.sin
cos = np.cos
pi = np.pi
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.auto_scale_xyz([0, 500], [0, 500], [0, 0.15])
ax.set_xlabel('X')
ax.set_ylabel('Y')
ax.set_zlabel('Z')
Us, Vs = np.meshgrid(np.linspace(-1, 1, 200), np.linspace(-1, 1, 200))
ax.plot_surface(Us,Vs,Us**2)
for angle in range(0, 360):
ax.view_init(angle, 30)
plt.draw()https://stackoverflow.com/questions/12476539
复制相似问题