pythonimport matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d.art3d import Poly3DCollection # 随机生成建筑块数据 def generate_building_blocks(num_blocks, grid_size=100, height_range=(5, 50), base_size_range=(10, 30)): buildings = [] for _ in range(num_blocks): # 随机选择建筑的底面起点 x = np.random.uniform(0, grid_size) y = np.random.uniform(0, grid_size) # 随机生成建筑的高度和底面大小 dx = np.random.uniform(*base_size_range) dy = np.random.uniform(*base_size_range) dz = np.random.uniform(*height_range) buildings.append([x, y, dx, dy, dz]) return buildings # 绘制建筑块 def plot_buildings(buildings, color='skyblue'): fig = plt.figure(figsize=(8, 8)) ax = fig.add_subplot(111, projection='3d') for building in buildings: x, y, dx, dy, dz = building # 每个建筑的顶点坐标 # vertices = [ # [(x, y, 0), (x + dx, y, 0), (x + dx, y + dy, 0), (x, y + dy, 0)], # 底面 # [(x, y, dz), (x + dx, y, dz), (x + dx, y + dy, dz), (x, y + dy, dz)], # 顶面 # ] vertices = [ [(x, y, 0), (x + dx, y, 0), (x + dx, y + dy, 0), (x, y + dy, 0)], # 底面 [(x, y, dz), (x + dx, y, dz), (x + dx, y + dy, dz), (x, y + dy, dz)], # 顶面 [(x, y, 0), (x + dx, y, 0), (x + dx, y, dz), (x, y, dz)], # 侧面1 [(x + dx, y, 0), (x + dx, y + dy, 0), (x + dx, y + dy, dz), (x + dx, y, dz)], # 侧面2 [(x, y + dy, 0), (x + dx, y + dy, 0), (x + dx, y + dy, dz), (x, y + dy, dz)], # 侧面3 [(x, y, 0), (x, y + dy, 0), (x, y + dy, dz), (x, y, dz)] # 侧面4 ] # 构建面 for v in vertices: ax.add_collection3d(Poly3DCollection([v], color=color, alpha=0.7)) # 绘制立方体的竖直边 for i in range(4): ax.plot([vertices[0][i][0], vertices[1][i][0]], [vertices[0][i][1], vertices[1][i][1]], [vertices[0][i][2], vertices[1][i][2]], color=color) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') ax.set_box_aspect([1, 1, 0.5]) # 控制显示比例 plt.show() # 生成随机建筑数据 buildings = generate_building_blocks(num_blocks=50, grid_size=200) # 绘制随机建筑 plot_buildings(buildings)
pythonimport matplotlib.pyplot as plt import numpy as np from mpl_toolkits.mplot3d.art3d import Poly3DCollection # 随机生成建筑块数据 def generate_building_blocks(num_blocks, grid_size=100, height_range=(5, 50), base_size_range=(10, 30)): buildings = [] for _ in range(num_blocks): # 随机选择建筑的底面起点 x = np.random.uniform(0, grid_size) y = np.random.uniform(0, grid_size) # 随机生成建筑的高度和底面大小 dx = np.random.uniform(*base_size_range) dy = np.random.uniform(*base_size_range) dz = np.random.uniform(*height_range) buildings.append([x, y, dx, dy, dz]) return buildings # 绘制建筑块 # def plot_buildings(buildings, color='skyblue'): def plot_buildings(buildings, color='skyblue', edge_color='gray', alpha=0.8): fig = plt.figure(figsize=(8, 8)) ax = fig.add_subplot(111, projection='3d') ax.view_init(elev=50, azim=60) # 设置视角,elev 为俯仰角,azim 为方位角 for building in buildings: x, y, dx, dy, dz = building # 每个建筑的顶点坐标 # vertices = [ # [(x, y, 0), (x + dx, y, 0), (x + dx, y + dy, 0), (x, y + dy, 0)], # 底面 # [(x, y, dz), (x + dx, y, dz), (x + dx, y + dy, dz), (x, y + dy, dz)], # 顶面 # ] vertices = [ [(x, y, 0), (x + dx, y, 0), (x + dx, y + dy, 0), (x, y + dy, 0)], # 底面 [(x, y, dz), (x + dx, y, dz), (x + dx, y + dy, dz), (x, y + dy, dz)], # 顶面 [(x, y, 0), (x + dx, y, 0), (x + dx, y, dz), (x, y, dz)], # 侧面1 [(x + dx, y, 0), (x + dx, y + dy, 0), (x + dx, y + dy, dz), (x + dx, y, dz)], # 侧面2 [(x, y + dy, 0), (x + dx, y + dy, 0), (x + dx, y + dy, dz), (x, y + dy, dz)], # 侧面3 [(x, y, 0), (x, y + dy, 0), (x, y + dy, dz), (x, y, dz)] # 侧面4 ] # 构建面 # for v in vertices: # ax.add_collection3d(Poly3DCollection([v], color=color, alpha=0.7)) # 构建面,带有透明度和边框 for v in vertices: poly = Poly3DCollection([v], facecolors=color, edgecolors=edge_color, linewidths=0.2, alpha=alpha) ax.add_collection3d(poly) # 绘制立方体的竖直边 for i in range(4): ax.plot([vertices[0][i][0], vertices[1][i][0]], [vertices[0][i][1], vertices[1][i][1]], [vertices[0][i][2], vertices[1][i][2]], color=color) ax.set_xlabel('X') ax.set_ylabel('Y') ax.set_zlabel('Z') ax.set_box_aspect([1, 1, 0.5]) # 控制显示比例 # 设置视角和比例 # ax.set_box_aspect([1, 1, 0.3]) # ax.set_axis_off() # 隐藏轴以增加美观 plt.show() # 生成随机建筑数据 buildings = generate_building_blocks(num_blocks=50, grid_size=200) # 绘制随机建筑 plot_buildings(buildings)
python绘制3d建筑
hxxjxw2024-09-12 13:58
相关推荐
skywalk81631 分钟前
copyparty 是一款使用单个 Python 文件实现的内网文件共享工具,具有跨平台、低资源占用等特点,适合需要本地化文件管理的场景BYSJMG6 分钟前
计算机毕设选题:基于Python+MySQL校园美食推荐系统【源码+文档+调试】Zz_waiting.11 分钟前
案例开发 - 日程管理 - 第七期writeone11 分钟前
9-10关于JS初学产生的问题索迪迈科技1 小时前
Flink Task线程处理模型:Mailbox太阳的后裔2 小时前
随笔一些用C#封装的控件tianyuanwo2 小时前
Rust语言组件RPM包编译原理与Cargo工具详解CodeCraft Studio7 小时前
PDF处理控件Aspose.PDF教程:使用 Python 将 PDF 转换为 Base64零点零一7 小时前
VS+QT的编程开发工作:关于QT VS tools的使用 qt的官方帮助困鲲鲲8 小时前
Python中内置装饰器