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

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.kler.cn/news/306213.html

相关文章:

  • flask-sqlalchemy的模型类两个表,既有一对一又有一对多的情况时,解决方法
  • SAP HCM HR_ABS_ATT_TIMES_AT_ENTRY 跨夜班不生效问题
  • 【MyBatis精讲】从入门到精通的详细指南:简化Java持久层操作的艺术
  • 开源 AI 智能名片小程序:开启内容营销新境界
  • Harmony Next 文件命令操作(发送、读取、媒体文件查询)
  • 【最佳实践】配置类封装-Async异步注解以及自定义线程池
  • 对操作系统(OS)管理和进程的理解
  • 28 线性表 · 栈
  • golang的GC(三色标记法+混合写屏障)学习笔记
  • 第一篇---滑动窗口最大值、前 K 个高频元素
  • 初识爬虫2
  • Linux删除SSH生成的密钥对
  • 探索Python的Excel世界:openpyxl的魔法之旅
  • 【homebrew安装】踩坑爬坑教程
  • 路由策略原理与配置
  • C#笔记11 获取线程及其信息,什么是优先级、单元状态、线程状态、执行状态、线程名称以及其他属性?
  • 一文速通calcite结合flink理解SQL从文本变成执行计划详细过程
  • Kubernetes Pod镜像的3种状态
  • STM32-UART配置注释
  • 标准库标头 <bit>(C++20)学习
  • 计算机网络 --- 计算机网络性能【七大性能指标】
  • 如何精确统计Pytorch模型推理时间
  • c语言写的环形队列
  • emWin5的图片半透明之旅
  • 高级java每日一道面试题-2024年9月12日-架构篇[DDD领域驱动篇]-如何使用领域驱动设计(DDD)中的事务脚本模式?
  • Spring4-IoC2-基于注解管理bean
  • comfyui中,sam detector与yoloworld图像分割算法测试以及影响
  • [极客大挑战 2019]PHP
  • 1、常用的数据库、表操作
  • 蒸!--数据在内存中的存储