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
相关推荐
badhope3 小时前
Mobile-Skills:移动端技能可视化的创新实践码云数智-园园4 小时前
微服务架构下的分布式事务:在一致性与可用性之间寻找平衡吴佳浩4 小时前
GPU 编号进阶:CUDA\_VISIBLE\_DEVICES、多进程与容器化陷阱C++ 老炮儿的技术栈4 小时前
volatile使用场景hz_zhangrl4 小时前
CCF-GESP 等级考试 2026年3月认证C++一级真题解析Liu628884 小时前
C++中的工厂模式高级应用IT猿手5 小时前
基于控制障碍函数的多无人机编队动态避障控制方法研究,MATLAB代码全栈凯哥5 小时前
18.Python中的导入类完全指南AI科技星5 小时前
全尺度角速度统一:基于 v ≡ c 的纯推导与验证sunwenjian8865 小时前
Java进阶——IO 流
