当前位置: 首页 > news >正文

python绘制3d建筑

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

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

http://www.lryc.cn/news/439493.html

相关文章:

  • 机器学习实战21-基于XGBoost算法实现糖尿病数据集的分类预测模型及应用
  • ElasticSearch数据类型和分词器
  • 【云原生监控】Prometheus之PushGateway
  • sqlalchemy JSON 字段写入时中文序列化问题
  • C++ 类域+类的对象大小
  • QT开发:深入详解QtCore模块事件处理,一文学懂QT 事件循环与处理机制
  • 小米,B站网络安全岗位笔试题目+答案
  • 微信小程序中巧妙使用 wx:if 和 catchtouchmove 实现弹窗禁止页面滑动功能
  • 唯徳知识产权管理系统 DownloadFileWordTemplate 文件读取漏洞复现
  • 我在高职教STM32——准备HAL库工程模板(2)
  • 数字化转型的实战法则:全面剖析《数字化专业知识体系》中的落地策略与最佳实践
  • 远程桌面内网穿透是什么?有什么作用?
  • 【算法专场】分治(上)
  • 腾讯云软件工程师面试问题收集记录-数据库
  • Sourcetree安装教程及使用
  • TryHackMe 第1天 | Introduction to Cyber Security
  • ASP.NET MVC 迅速集成 SignalR
  • [数据集][目标检测]葡萄成熟度检测数据集VOC+YOLO格式1123张3类别
  • 【Python 数据分析学习】Matplotlib 的基础和应用
  • HarmonyOS应用开发者基础认证
  • gin基本使用
  • 【VUE】pinia持久化存储
  • 【Java基础】泛型
  • STL-vector练习题
  • Leetcode 165. 比较版本号(Medium)
  • Android 12 Launcher3 去掉Hotseat
  • Nginx实用篇:实现负载均衡、限流与动静分离
  • python | Python中的类多态:方法重写和动态绑定
  • Rust编写Windows服务
  • MATLAB 从 R2024B 开始支持树莓派 5