python绘制3d建筑

embedded/2024/9/24 2:48:21/

python">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)

python">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)

3dbd4401f67a.png" width="361" />


http://www.ppmy.cn/embedded/112781.html

相关文章

【刷题】Day3--错误的集合

hello!又见面啦~~~ 一道习题,要长脑子了...... 【. - 力扣(LeetCode)】 【思路】 /*** Note: The returned array must be malloced, assume caller calls free().*/void Bubble_sort(int arr[], int size) {int temp;for (int i…

html限制仅有一个音/视频可播放

html限制仅有一个音/视频可播放 /** 多个音频仅能播放一个 */ function audiosPlay() {const audios document.getElementsByTagName(audio);const videos document.getElementsByTagName(video);function pauseAll() {var self this;[].forEach.call(audios, function (i) …

前端深拷贝

什么是 structuredClone()? structuredClone() 是 2022 年引入的全局函数,支持深度克隆 JavaScript 对象。与 JSON.stringify() 和 JSON.parse() 等传统方法不同,它们难以处理复杂的结构和循环引用,而 structuredClone() 可以毫不…

GVIM常用命令

Gvim常用命令 1.操作文件 1.1 gvim比较两个文件的不同 gvim -d file1 file2 2.操作文件内容 2.1全文替换 :1,$s/旧字符/新字符/g 2.2多行插入 步骤一:ctrlv进入visual模式 步骤二:选中要插入的行 步骤三:ctrlI进入insert模式 步骤…

Unity中InputField一些属性的理解

先看代码: using UnityEngine; using UnityEngine.UI;public class TestInput : MonoBehaviour {[SerializeField]InputField inputField;void Start(){Debug.Log(inputField.text);Debug.Log(inputField.text.Length);Debug.Log(inputField.preferredWidth);Debug…

HTML/CSS/JS学习笔记 Day4(CSS--C1 选择器声明)

跟着该视频学习,记录笔记:【黑马程序员pink老师前端入门教程,零基础必看的h5(html5)css3移动端前端视频教程】https://www.bilibili.com/video/BV14J4114768?p12&vd_source04ee94ad3f2168d7d5252c857a2bf358 Day4 内容梳理:…

Golang | Leetcode Golang题解之第400题第N位数字

题目: 题解: func findNthDigit(n int) int {d : 1for count : 9; n > d*count; count * 10 {n - d * countd}index : n - 1start : int(math.Pow10(d - 1))num : start index/ddigitIndex : index % dreturn num / int(math.Pow10(d-digitIndex-1)…

WPS如何删除表格下的空白页

WPS Office(12.1.0.17827) ① 鼠标右键,选择段落 ② 行距:固定值;设置值:1磅;取消勾选,确定即可~