如何在不引起“剪切”外观的情况下旋转气缸

2024-09-20 23:01:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在matplotlib中绘制了一个“泪滴”形状的圆柱体。为了得到泪滴形状,我画了一个从theta = 0theta = pi的普通圆柱体和从theta = pi到{}的椭圆。不过,我现在试着绕着圆柱的轴“旋转”,这是由z-axis方便地给出的。在

我试着用旋转矩阵来绕z轴旋转,Wikipedia给出如下: enter image description here

然而,当我试图通过-pi/3弧度旋转时,圆柱体变得非常不规则。enter image description here

有什么办法防止这种情况发生吗? 这是我的代码:

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

Tags: fromimportnppipltsincosax
1条回答
网友
1楼 · 发布于 2024-09-20 23:01:28

您的旋转有缺陷:要计算Y1[i],您需要X1[i]的旧值,但您已经更新了它。你可以试试

X1[i], Y1[i] = cos(a)*X1[i]-sin(a)*Y1[i], sin(a)*X1[i]+cos(a)*Y1[i]

如果您想让矩阵乘法变得更明显(并修复错误),您还可以执行以下操作(请再次检查矩阵是否正确以及乘法的顺序是否正确,我没有对此进行测试):

^{pr2}$

@在3.5中是新的,对于numpy数组,它被定义为矩阵乘法。如果您使用的是低于3.5的版本,则可以使用np.dot。在

zip(*...)是获取列表对而不是对列表列表所必需的。另请参见this answer

相关问题 更多 >

    热门问题