一个多边形,是由点和面组成,先有点,再有面,点好确认,面的问题可能多数人第一时间不是很理解(这里不多说代码,只说点与面的关系)。
效果图: 这是一个3d的十字(➕号)
图中,蓝色的是点,红色部分是面,3点个构成一个面;这里是方体,所以是4个点一个面.
坐标不在多说
先把底部的面,与顶层的面画出来,中间的面就出来了
- 第一步先把蓝色的点找好,在图中画出来
- 第二步:面
- 确认好每个点,用于确认面
- 先把底部的面给画出来,从0开始,4个点,所以数组第一个列表是 [0,1,2,3] 效果图如下:
- 第二个列表 [3, 4, 5, 6] 以此类推,把下面所有的点全部连起来, 中心点 [0, 3, 6, 9]
- 顶部:为负数,与底部相反,倒着来,0对应的位置为-12,所以[-12. -11, -10, -9],以此类推
- 中间:底部的两个点,与顶部的两个点
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d.art3d import Poly3DCollection, Line3DCollection
fig = plt.figure()
ax = fig.gca(projection='3d')
verts = [ # x y z
(0, 0, 0), (0, 1, 0), (1, 1, 0), (1, 0, 0), (2, 0, 0), (2, -1, 0), (1, -1, 0),
(1, -2, 0), (0, -2, 0), (0, -1, 0), (-1, -1, 0), (-1, 0, 0),
(0, 0, 8), (0, 1, 8), (1, 1, 8), (1, 0, 8), (2, 0, 8), (2, -1, 8), (1, -1, 8),
(1, -2, 8), (0, -2, 8), (0, -1, 8), (-1, -1, 8), (-1, 0, 8)
]
faces = [
[0, 1, 2, 3], [3, 4, 5, 6], [6, 7, 8, 9], [9, 10, 11, 0], [0, 3, 6, 9], # 底层
[-12, -11, -10, -9], [-9, -8, -7, -6], [-6, -5, -4, -3], [-3, -2, -1, -12], [-12, -9, -6, -3], # 顶层
[0, 1, -11, -12], [1, 2, -10, -11], [2, 3, -9, -10], [3, 4, -8, -9], [4, 5, -7, -8], # 中间
[5, 6, -6, -7], [6, 7, -5, -6], [7, 8, -4, -5], [8, 9, -3, -4], [9, 10, -2, -3],
[10, 11, -1, -2], [11, 0, -12, -1]
]
# 获得每个面的顶点
poly3d = [[verts[vert_id] for vert_id in face] for face in faces]
# 绘制顶点
x, y, z = zip(*verts)
ax.scatter(x, y, z)
# 绘制多边形面
ax.add_collection3d(Poly3DCollection(poly3d, facecolors='w', linewidths=1, alpha=1, color='y'))
# 绘制对变形的边
# ax.add_collection3d(Line3DCollection(poly3d, colors='k', linewidths=0.5, linestyles=':'))
# 设置图形坐标,坐标范围
ax.set_xlabel('X')
ax.set_xlim3d(-2, 2)
ax.set_ylabel('Y')
ax.set_ylim3d(-2, 2)
ax.set_zlabel('Z')
ax.set_zlim3d(-2, 9)
plt.show()