如何用Python在3D空间绘制指定倾斜角度的圆形?
在3D空间绘制带指定倾斜角度的圆形
我想用Python在3D空间中绘制带有指定倾斜角度的圆形,效果类似目标图。目前已能绘制2D圆形,参考相关内容修改了程序,但无法实现想要的倾斜角度。
现有代码:
import numpy as np import matplotlib.pyplot as plt r = 5.0 a, b, c = (0.0, 0.0, 0.0) angle = np.pi / 6 # 圆形的倾斜角度 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') ax.set_xlim(-10,10) ax.set_ylim(-10,10) ax.set_zlim(-10,10) phirange = np.linspace(0, 2 * np.pi, 300) # 生成完整圆形的角度序列 x = a + r * np.cos(phirange) y = b + r * np.sin(phirange) z= c ax.plot(x, y, z ) plt.show()
我尝试修改z轴代码:
z = c + r * np.cos(phirange) * np.sin(angle)
但得到的效果不符合预期。是否需要同时修改X和Y部分?该如何操作?
另外还需要实现圆形沿其他轴倾斜的效果。
解决方法
要实现3D空间中圆形的倾斜,本质是对原始XY平面上的圆形做空间旋转变换,只修改z轴坐标是不够的,需要同时调整x、y、z三个轴的坐标。
1. 沿X轴倾斜(绕X轴旋转)
绕X轴旋转θ角时,坐标变换公式为:
- y' = ycosθ - zsinθ
- z' = ysinθ + zcosθ
- x' = x
对应代码修改:
import numpy as np import matplotlib.pyplot as plt r = 5.0 center = (0.0, 0.0, 0.0) tilt_angle = np.pi / 6 # 绕X轴的倾斜角度 fig = plt.figure() ax = fig.add_subplot(111, projection='3d') ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') ax.set_xlim(-10,10) ax.set_ylim(-10,10) ax.set_zlim(-10,10) phirange = np.linspace(0, 2 * np.pi, 300) # 生成原始XY平面的圆形 x = center[0] + r * np.cos(phirange) y = center[1] + r * np.sin(phirange) z = np.full_like(phirange, center[2]) # 绕X轴旋转变换实现倾斜 y_rot = y * np.cos(tilt_angle) - z * np.sin(tilt_angle) z_rot = y * np.sin(tilt_angle) + z * np.cos(tilt_angle) ax.plot(x, y_rot, z_rot) plt.show()
2. 沿Y轴倾斜(绕Y轴旋转)
绕Y轴旋转θ角时,坐标变换公式为:
- x' = xcosθ + zsinθ
- z' = -xsinθ + zcosθ
- y' = y
对应代码修改(替换上述旋转变换部分):
# 绕Y轴旋转变换 x_rot = x * np.cos(tilt_angle) + z * np.sin(tilt_angle) z_rot = -x * np.sin(tilt_angle) + z * np.cos(tilt_angle) ax.plot(x_rot, y, z_rot)
3. 沿Z轴倾斜(绕Z轴旋转)
绕Z轴旋转只会让圆形在XY平面内转动,不会产生空间倾斜效果,若需要平面内旋转可使用:
# 绕Z轴旋转变换 x_rot = x * np.cos(tilt_angle) - y * np.sin(tilt_angle) y_rot = x * np.sin(tilt_angle) + y * np.cos(tilt_angle) ax.plot(x_rot, y_rot, z)
通用旋转方法(任意轴倾斜)
如果需要绕任意自定义轴倾斜,可以使用旋转矩阵来实现,比如绕向量(u,v,w)旋转θ角,可通过构建对应的旋转矩阵完成坐标变换。
内容的提问来源于stack exchange,提问作者Gojigu
相关产品推荐
相关产品推荐

