【python】通行网格地图四叉树化 (leeccode 427)

【python】通行网格地图四叉树化

受到Leecode 427题的启发,427. 建立四叉树
想将由0和1组成的网格地图绘制为四叉树地图,0表示可通行网格,1表示不可通行网格。

import matplotlib.pyplot as plt  
import matplotlib.patches as patches  
import numpy as np  
from matplotlib import colors  
  
  
class Node:  
    def __init__(self, x0, y0, w, h, data):  
        self.x0 = x0  
        self.y0 = y0  
        self.width = w  
        self.height = h  
        self.data = data  
        self.children = []  
        self.passable = np.sum(data == 1) / (w * h) <= 0.9  # 障碍物比例<= 0.2 可通行  
  
  
class QuadTree:  
    def __init__(self, x, y, w, h, data):  
        self.root = Node(x, y, w, h, data)  
        self.root.passable = True  
        if self.root.passable:  
            self.subdivide(self.root)  
  
    def subdivide(self, node):  
		x, y, w, h = node.x0, node.y0, node.width // 2, node.height // 2
		# Divide the node's data into quadrants
        data_quadrants = [  
            node.data[0:h, 0:w],  
            node.data[h: node.height, 0:w],  
            node.data[0:h, w:node.width],  
            node.data[h:node.height, w:node.width]  
        ]  
  
        for i, data in enumerate(data_quadrants):  
            width = w  
            height = h  
            if (i // 2):  
                width = node.width - w  
            if (i % 2):  
                height = node.height - h  
            child = Node(x + (i // 2) * w, y + (i % 2) * h, width, height, data)  
            node.children.append(child)  
            if len(np.unique(data)) > 1 and w > 1 and h > 1:  
                self.subdivide(child)  
  
    def draw(self, ax):  
        def _draw(node):  
            color = 'black' if not node.passable else 'white'  
            # ax.add_patch(patches.Rectangle((node.x0, node.y0), node.width, node.height, facecolor=color, edgecolor='black'))  
            ax.add_patch(  
                patches.Rectangle((node.x0, node.y0), node.width, node.height, facecolor=color, edgecolor='black'))  
            for child in node.children:  
                if child is not None:  
                    _draw(child)  
  
        _draw(self.root)  
  
  
    def print_leaves(self, node=None):  
        if node is None:  
            node = self.root  
        if all(child is None for child in node.children):  
            print(  
                f"Leaf Node: x={node.x0}, y={node.y0}, width={node.width}, height={node.height}, passable={node.passable}")  
        else:  
            for child in node.children:  
                if child is not None:  
                    self.print_leaves(child)  
  
  
# Create a 32x32 grid map with random obstacles  
map_data = np.loadtxt("./map_txt/Random_32x32_.2.txt")  
  
width, height = map_data.shape  
  
# Create a quadtree  
qt = QuadTree(0, 0, width, height, map_data)  
  
cmap = colors.ListedColormap(['white', 'black', ])  
  
# Draw the original map  
fig, axs = plt.subplots(1, 2, figsize=(10, 5))  
axs[0].imshow(map_data, cmap=cmap, origin='lower')  
axs[0].set_title('Original Map')  
  
# Draw the quadtree  
axs[1].set_xlim(0, width)  
axs[1].set_ylim(0, height)  
qt.draw(axs[1])  
axs[1].set_title('Quadtree Map')  
  
plt.show()

运行结果
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/706322.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【ARM Cache 与 MMU/MPU 系列文章 1.2 -- Data Cache 和 Unified Cache 的区别是什么?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Data Cache and Unified Cache数据缓存 (Data Cache)统一缓存 (Unified Cache)数据缓存与统一缓存的比较小结 Data Cache and Unified Cache 在 ARM架构中&#xff0c;缓存&#xff08…

第3章 Unity 3D着色器系统

3.1 从一个外观着色器程序谈起 新建名为basic_diffuse.shader的文件&#xff0c;被一个名为basic_diffuse.mat的材质文件所引用&#xff0c;而basic_diffuse.mat文件则被场景中名为Sphere的game object的MeshRenderer组件所使用。 basic_diffuse.shader代码文件的内容如下所示…

15.RedHat认证-Ansible自动化运维(上)

15.RedHat认证-Ansible自动化运维(上) RHCE8-RH294 Ansible自动化&#xff08;Ansible版本是2.8.2&#xff09; Ansible介绍 1.Ansible是什么&#xff1f; Ansible是一个简单的强大的无代理的自动化运维工具&#xff08;Ansible是自动化运维工具&#xff09;Ansible特点 简…

Java——LinkedList

1、链表 1.1 链表的概念及结构 链表在逻辑层面上是连续的&#xff0c;在物理层面上不一定是连续的 链表结构可分为&#xff0c;单向或双向、带头或不带头、循环或非循环&#xff0c;组合共计8种 重点&#xff1a;无头单向非循环链表、无头双向链表 1.2 模拟实现无头单向非…

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 探测效果(地图探测、地图窥探)

ArcGIS JSAPI 高级教程 - ArcGIS Maps SDK for JavaScript - 探测效果&#xff08;地图探测、地图窥探&#xff09; 实现原理 ArcGIS Maps SDK for JavaScript 从 4.29 开始增加 RenderNode 类&#xff0c;可以添加数据以及操作 FBO&#xff08;ManagedFBO&#xff09;&#xf…

影响数字本振信噪比的因素

2048 点 -66 4096 点-72 8192 点-77 16384 点-84

弃用Docker Desktop:在WSL2中玩转Docker之Docker Engine 部署与WSL入门

Docker技术概论 在WSL2中玩转Docker之Docker Engine部署 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://bl…

Java开发规范

1.接口命名规范–Restful API 原本格式是动词资源by传参&#xff0c;后来进化为Restful API&#xff0c;思想是以资源为中心。 动词用get,post,put,delete请求方法代替&#xff0c;by后面的名词用传参代替。 并且GET方法传参资源ID采用路径传参&#xff0c;除了资源ID外的GET…

区间合并——Acwing.803区间合并

区间合并 定义 区间合并是指将一组有重叠或相邻的区间合并成一个或多个更大的区间。 运用情况 图像处理&#xff1a;在图像的区域分析中&#xff0c;可能需要将相邻的具有相似特征的区域进行合并。时间区间处理&#xff1a;比如将多个连续时间段进行合并。行程规划&#xf…

nodejs湖北省智慧乡村旅游平台-计算机毕业设计源码00232

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;旅游行业当然也不能排除在外。智慧乡村旅游平台是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;采…

探索JavaScript逆向工程与风控等级

探索JavaScript逆向工程与风控等级 在当今的网络安全领域&#xff0c;JavaScript逆向工程&#xff08;简称JS逆向&#xff09;已成为许多开发者和安全专家关注的焦点。JS逆向主要涉及对JavaScript代码的分析与理解&#xff0c;以发现其内部逻辑、数据流及潜在漏洞。这种技术常用…

【GIS】全球范围气象站点的逐年平均气温数据(1929-2023年)

数据简介&#xff1a;气象数据包括气象站点温度、湿度、光照等等。提供自1929-2023年以来的全球逐年平均气温数据气象数据下载。数据源为NCDC&#xff08;美国国家气候数据中心&#xff0c;National Climatic Data Center&#xff09;&#xff0c;隶属于NOAA&#xff08;美国国…

软件测试之购物车的用例设计

功能 正向case&#xff1a; 1、商品添加到购物车->选中添加的商品->点击结算->支付成功&#xff0c;验证购物车中订单是否清楚&#xff1b; 2、购物车中搜索商品&#xff0c;能够查询到对应的商品信息&#xff1b; 3、选中不同商家的商品&#xff0c;购物车中商品按照…

springboot热贡文化旅游APP的设计与实现-计算机毕业设计源码69932

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

bugku---misc---赛博朋克

1、下载附件解压之后是一个txt文本&#xff0c;查看文本的时候看到头部有NG的字样 2、把txt改为png后缀得到一张图片 3、binwalk没发现奇怪的地方&#xff0c;分离出来还是图片 4、stegslove分析&#xff0c;切换图片没有发现奇怪地方 5、将通道rgb置为0。出现了flag但是flag不…

Gi标签管理

文章目录 前言理解标签创建标签操作标签总结 前言 理解标签 标签&#xff0c;可以理解为对某次commit的一次标识&#xff0c;相当于起起了一个别名。 例如&#xff0c;在项目发布某个版本时候&#xff0c;针对最后一次commit起一个v1.0这样的标签来标识里程碑的意义。 这有什…

6.13.1 使用残差神经网络堆叠集成进行乳腺肿块分类和诊断的综合框架

计算机辅助诊断 (CAD) 系统需要将肿瘤检测、分割和分类的自动化阶段按顺序集成到一个框架中&#xff0c;以协助放射科医生做出最终诊断决定。 介绍了使用堆叠的残差神经网络 (ResNet) 模型&#xff08;即 ResNet50V2、ResNet101V2 和 ResNet152V2&#xff09;进行乳腺肿块分类…

郑州企业水污染防治乙级资质申请,时长预估

针对郑州企业水污染防治乙级资质申请&#xff0c;时长预估如下&#xff1a; 一、前期准备阶段 时间预估&#xff1a;约1-2个月 了解并熟悉最新的水污染防治乙级资质申请政策和标准。评估企业在技术人员配置、过往业绩、管理制度等方面的现状&#xff0c;确定是否满足申请条件。…

景芯SoC A72的时钟树分析

innovus的ctslog中的Clock DAG信息可以报出来CTS主要运行步骤的关键信息&#xff0c;比如clustering&#xff0c;balancing做完后的clock tree的长度&#xff0c;clock tree上所用的buffer、inverter&#xff0c;icg cell数量&#xff0c;clock skew等信息。我们以景芯SoC A72 …

美创科技入选“2024网络安全提供商创新排行榜”

近日&#xff0c;DBC德本咨询公布了“2024网络安全提供商创新排行榜”&#xff0c;美创科技凭借近20年的数据安全创新耕耘&#xff0c;荣誉上榜。 此次&#xff0c;与360、华为、腾讯等互联网、网络安全头部厂商并肩上榜&#xff0c;是行业对美创的再次认可。 数据安全的发展离…