我在matplotlib中绘制了一个“泪滴”形状的圆柱体。为了得到泪滴形状,我画了一个从theta = 0
到theta = pi
的普通圆柱体和从theta = pi
到{z-axis
方便地给出的。在
我试着用旋转矩阵来绕z轴旋转,Wikipedia给出如下:
然而,当我试图通过-pi/3
弧度旋转时,圆柱体变得非常不规则。
有什么办法防止这种情况发生吗? 这是我的代码:
import numpy as np
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from math import sin, cos, pi
import math
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
theta = np.linspace(0,2*pi, 1200)
Z = np.linspace(0,5,1000+600)
Z,theta = np.meshgrid(Z, theta)
X = []
Y = []
R = 0.003
#calculate the x and y values
for i in theta:
cnt = 0
tempX = []
tempY = []
for j in i:
#circle
if(i[0]<=pi):
tempX.append(R*cos(j))
tempY.append(R*sin(j))
cnt+=1
#ellipse
else:
tempX.append(R*cos(j))
tempY.append(0.006*sin(j))
X.append(tempX)
Y.append(tempY)
X1 = np.array(X)
Y1 = np.array(Y)
#rotate around the Z axis
a = -pi/3
for i in range(len(X)):
X1[i] = cos(a)*X1[i]-sin(a)*Y1[i]
Y1[i] = sin(a)*X1[i]+cos(a)*Y1[i]
#plot
ax.plot_surface(X1,Y1,Z,linewidth = 0, shade = True, alpha = 0.3)
ax.set_xlim(-0.01,0.01)
ax.set_ylim(-0.01, 0.01)
azimuth = 173
elevation = 52
ax.view_init(elevation, azimuth)
plt.show()
您的旋转有缺陷:要计算
Y1[i]
,您需要X1[i]
的旧值,但您已经更新了它。你可以试试如果您想让矩阵乘法变得更明显(并修复错误),您还可以执行以下操作(请再次检查矩阵是否正确以及乘法的顺序是否正确,我没有对此进行测试):
^{pr2}$@
在3.5中是新的,对于numpy数组,它被定义为矩阵乘法。如果您使用的是低于3.5的版本,则可以使用np.dot
。在zip(*...)
是获取列表对而不是对列表列表所必需的。另请参见this answer相关问题 更多 >
编程相关推荐