四叉树实现四边形网格

article/2025/9/8 20:52:55
import matplotlib.pyplot as plt
import matplotlib.patches as patches
import numpy as np
# 四叉树节点
class QuadNode:def __init__(self, x, y, width, height, depth):self.x = xself.y = yself.width = widthself.height = heightself.depth = depthself.children = []self.id = None  # 单元编号def is_leaf(self):return len(self.children) == 0# 四叉树
class Quadtree:def __init__(self, x, y, width, height, max_depth):self.root = QuadNode(x, y, width, height, 0)self.max_depth = max_depthdef subdivide(self, node):if node.depth >= self.max_depth:returnw, h = node.width / 2, node.height / 2d = node.depth + 1node.children = [QuadNode(node.x,       node.y,       w, h, d),QuadNode(node.x + w,   node.y,       w, h, d),QuadNode(node.x,       node.y + h,   w, h, d),QuadNode(node.x + w,   node.y + h,   w, h, d)]for child in node.children:self.subdivide(child)def get_leaf_nodes(self, node=None):if node is None:node = self.rootif node.is_leaf():return [node]else:leaves = []for child in node.children:leaves.extend(self.get_leaf_nodes(child))return leaves# 编号 & 绘图函数
def draw_quadtree_with_numbering(quadtree):fig, ax = plt.subplots(figsize=(8, 8))leaves = quadtree.get_leaf_nodes()# 单元编号排序:先按y排,再按x排(自底向上、左到右)leaves.sort(key=lambda n: (n.y, n.x))# 给单元编号for i, node in enumerate(leaves, 1):node.id = i# 统计所有节点坐标,去重node_coords = set()for node in leaves:corners = [(node.x, node.y),(node.x + node.width, node.y),(node.x, node.y + node.height),(node.x + node.width, node.y + node.height)]node_coords.update(corners)# 节点编号排序:按 y, x 排序(自底向上、左到右)sorted_nodes = sorted(list(node_coords), key=lambda p: (p[1], p[0]))node_id_map = {coord: idx+1 for idx, coord in enumerate(sorted_nodes)}# 画单元格和编号for node in leaves:rect = patches.Rectangle((node.x, node.y), node.width, node.height,linewidth=1, edgecolor='black', facecolor='none')ax.add_patch(rect)# 单元编号(圆圈 + 数字)center_x = node.x + node.width / 2center_y = node.y + node.height / 2circle = patches.Circle((center_x, center_y), radius=node.width * 0.08,edgecolor='blue', facecolor='lightyellow', linewidth=1)ax.add_patch(circle)ax.text(center_x, center_y, str(node.id), fontsize=8, color='red', ha='center', va='center')# 画节点及编号for coord in sorted_nodes:ax.plot(coord[0], coord[1], 'ko', markersize=3)ax.text(coord[0], coord[1], str(node_id_map[coord]), fontsize=7, color='green',ha='center', va='center', bbox=dict(boxstyle="circle,pad=0.15", fc="white", ec="green", lw=0.8))ax.set_xticks([])ax.set_yticks([])ax.set_xticklabels([])ax.set_yticklabels([])ax.axis('off')plt.show()# 生成单元编号,顺序为左下、左上、右上、右下(逆时针)# 生成单元顶点编号数组,顺序为逆时针elements = []for node in leaves:ll = (node.x, node.y)  # 左下ul = (node.x, node.y + node.height)  # 左上ur = (node.x + node.width, node.y + node.height)  # 右上lr = (node.x + node.width, node.y)  # 右下cell_ids = [node_id_map[ll], node_id_map[lr], node_id_map[ur], node_id_map[ul]]elements.append(cell_ids)elements = np.array(elements)  # NC x 4nodes = np.array(sorted_nodes)  # NN x 2return elements, nodesif __name__ == "__main__":tree = Quadtree(0, 0, 1, 1, max_depth=1)tree.subdivide(tree.root)elements, nodes = draw_quadtree_with_numbering(tree)print(f"单元数量: {len(elements)}")print(f"节点数量: {len(nodes)}")# 打印前5个单元和节点print("前5个单元:")for e in elements[:5]:print(e)print("前5个节点:")for n in nodes[:5]:print(n)

在这里插入图片描述
cells
[1 2 4 3]
Nodes
[0 0]
[1 0]
[0 1]
[1 1]

在这里插入图片描述


http://www.hkcw.cn/article/sCPuViFrDX.shtml

相关文章

园区智能化集成平台汇报方案

该方案为园区智能化集成平台设计,依据《智能建筑设计标准》等 20 余项国家与行业规范,针对传统园区信息孤岛、反应滞后、经验流失、管理粗放等痛点,构建可视化智慧园区管理平台,实现大屏数据可视化、三维设备监控、智慧运维(含工单管理、巡检打卡)、能源能耗分析、AI 安防…

C#中的BeginInvoke和EndInvoke:异步编程的双剑客

文章目录 引言1. BeginInvoke和EndInvoke的基本概念1.1 什么是BeginInvoke和EndInvoke1.2 重要概念解释 2. 委托中的BeginInvoke和EndInvoke2.1 BeginInvoke方法2.2 EndInvoke方法2.3 两者的关系 3. 使用方式与模式3.1 等待模式3.2 轮询模式3.3 等待句柄模式3.4 回调模式 4. 底…

基于通义千问的儿童陪伴学习和成长的智能应用架构。

1.整体架构概览 我们的儿童聊天助手将采用典型的语音交互系统架构,结合大模型能力和外部知识库: 2. 技术方案分解 2.1. 前端应用/设备 选择: 移动App(iOS/Android)、Web应用,或者集成到智能音箱/平板等硬件设备中。技术栈: 移动App: React Native / Flutter (跨平台…

【STIP】安全Transformer推理协议

Secure Transformer Inference Protocol 论文地址:https://arxiv.org/abs/2312.00025 摘要 模型参数和用户数据的安全性对于基于 Transformer 的服务(例如 ChatGPT)至关重要。虽然最近在安全两方协议方面取得的进步成功地解决了服务 Transf…

MyBatisPlus(1):快速入门

我们知道,MyBatis是一个优秀的操作数据库的持久层框架(优秀持久层框架——MyBatis),其基于底层的JDBC进行高度封装,极大的简化了开发。但是对于单表操作而言,我们需要重复地编写简单的CRUD语句。这其实是不…

【ARM】【FPGA】【硬件开发】Chapter.1 AXI4总线协议

Chapter.1 AXI4总线协议 作者:齐花Guyc(CAUC) 一、总线介绍 AXI4总线 AXI4总线就像是SoC内部的“高速公路”,负责在不同硬件模块之间高效传输数据。 AXI4协议通过 5个独立通道 传输数据和控制信号,每个通道都有自己的信号线,互…

.NET 7 AOT 使用及 .NET 与 Go 语言互操作详解

.NET 7 AOT 使用及 .NET 与 Go 语言互操作详解 目录 .NET 7 AOT 使用及 .NET 与 Go 语言互操作详解 一、背景与技术概述 1.1 AOT 编译技术简介 1.2 Go 语言与 .NET 的互补性 二、.NET 7 AOT 编译实践 2.1 环境准备 2.2 创建 AOT 项目 2.3 AOT 编译流程 2.4 调试信息处…

Shortest path 代码

Project https://graphics.cs.utah.edu/research/projects/shortest-path-to-boundary/ Build and Debug Fork:(在Win10上) https://github.com/chunleili/Shortest-Path-to-Boundary-for-Self-Intersecting-Meshes commit hash d3160168d2b6a58188d12e6cd959da…

Spring框架学习day1--基础概念

Spring基础部分**轻量级的**IOC:控制反转(对象由自己管理变成交给框架管理)AOP:面向切面编程一站式BaenSpring体系结构 Spring Hello World 搭建 Spring基础部分 Spring是一个轻量级的IOC、AOP的一站式java开发框架,为…

立志成为一名优秀测试开发工程师(第九天)——使用fiddler工具、request库进行接口测试

接口测试学习 目录 一、接口测试的介绍 二、抓包软件Fiddler的使用 三、使用Python的Request库发送get、post请求: 1.get请求 2.post请求 四、总结 登录接口实现 认证请求处理 异常处理 高级配置 接口测试工具类封装 测试用例设计规范 Cookie处理方案 …

【面板数据】各地区新型数字基础设施数据集(2002-2025年)

新型数字基础设施是利用新一代信息技术(如5G、人工智能、物联网、大数据、区块链等)构建的基础设施体系,主要服务于信息传输、计算存储、智能分析和融合应用等环节。新型数字基础设施作为引领经济社会数字化转型的重要支撑,在各地…

小程序 - 视图与逻辑

个人简介 👨‍💻‍个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言: “心有多大,舞台就有多大。” 📚推荐学习: 🍉Vue2 🍋Vue3 🍓Vue2/3项目实战 🥝Node.js实战 🍒T…

zynq ad7616 调试笔记

环境 zynq7020 ps端的spi外接硬件的ad7616模块(非ip核) 1 下载 https://github.com/analogdevicesinc/no-OS/blob/2019_R1/ad7616-sdz/ad7616_sdz.c 2 在zynq的sdk中新建ad7616的app程序,将上图方框中的文件拷贝过来并编译 3 移植 ad7616…

如何轻松将 iPhone 备份到外部硬盘

当您的iPhone和电脑上的存储空间有限时,您可能希望将iPhone备份到外部硬盘上,这样可以快速释放iPhone上的存储空间,而不占用电脑上的空间,并为您的数据提供额外的安全性。此外,我们还提供 4 种有效的解决方案&#xff…

从Homebrew找到openssl.cnf文件并拷贝到Go项目下使用

安装OpenSSL 在 macOS 上下载和安装 OpenSSL 最常见和推荐的方式是使用 Homebrew,这是一个 macOS 缺失的包管理器。 如果您还没有安装 Homebrew,请先安装它。安装 Homebrew 后,安装 OpenSSL 只需要一条命令。 步骤 1:安装 Home…

Socket编程基础

这篇博客我们主要用来讲解TCP和UDP的socket编程。 概念 大多数网络协议都是由软件实现的(特别是协议栈中的高层协议),而且绝大多数计算机系统都将运输层以下的网络协议在操作系统的内核中进行实现。应用程序要想执行网络操作,必…

什么是物化视图(Materialized View)?

分析师和工程师经常面临一个共同的困境:随着数据量激增,查询性能急剧下降。一个看似简单的多表联合查询可能需要耗时数分钟甚至数小时,一个常规的实时大屏可能因数据处理缓慢而失去时效价值。当数据规模从 GB 级增长到 TB 甚至 PB 级时&#…

USB Redirector对比国产USB Server方案:软硬之争与技术突围

在远程设备共享领域,‌USB Redirector‌以其轻量级跨平台特性长期占据国际主流市场,支持Windows/Linux系统下的无缝USB设备网络共享。然而,随着国产化替代需求的爆发,以‌朝天椒USB Server‌为代表的软硬一体化方案,凭…

PP-OCRv5 C++封装DLL C#调用源码分享

目录 说明 效果 C#调用效果 项目 C# C 头文件 源文件 C#调用 下载 说明 C封装DLL&#xff0c;C#调用源码分享 效果 C#调用效果 项目 C# C 头文件 #include <windows.h> #include <iostream> #include <opencv2/opencv.hpp> #include <stri…

RISC-V PMA、PMP机制深入分析

1 PMA PMA&#xff08;Physical Memory Attributes&#xff09;&#xff0c;物理内存属性&#xff0c;顾名思义就是用来设置物理内存属性的&#xff0c;但这里说“设置”&#xff0c;并不合理&#xff0c;因为一般情况下各存储的属性&#xff0c;在芯片设计时就固定了&#xf…