QGraphicsView实现简易地图8『缓存视口周边瓦片』

前文链接:QGraphicsView实现简易地图7『异步加载-多瓦片-无底图』
前7篇的地图加载,都采用最少瓦片数量的算法,即用最少数量的瓦片覆盖视口,以获得最快的加载速度。但是这样会带来一个问题,那就是每当移动地图时,视口周边的瓦片才会加载,这样会造成地图的延时甚至卡顿,而这会令用户感到非常反感。为此,需要在之前的算法上进行改进:加载覆盖视口的最少瓦片后,立即加载视口周边瓦片;加载过的瓦片离开视口后不再删除,以加快下次进入视口后的渲染。
1、动态演示效果

2、获取视口及周边瓦片代码:以视口宽高的一半向四周扩展

QRect CommonUtility::getViewAndAroundTileCoords(int tempTileTop, int tileLeft, int tempTileBottom, int tileRight, int level, vector<TileCoord> &vecTileCoord)
{// <1> 视口for (int row = tempTileTop; row <= tempTileBottom; ++row){for (int col = tileLeft; col <= tileRight; ++col){vecTileCoord.push_back(TileCoord(col, row));}}int mapSize = pow(2, level);int tileW = tileRight - tileLeft + 1;int tileH = tempTileBottom - tempTileTop + 1;int tempTileT, tempTileL, tempTileB, tempTileR;int tileT, tileL, tileB, tileR;// <2> 上侧tileT = tempTileT = qMax(tempTileTop - tileH / 2, 0);tempTileB = tempTileTop - 1;tempTileL = qMax(tileLeft - tileW / 2, 0);	tempTileR = qMin(tileRight + tileW / 2, mapSize - 1);for (int row = tempTileT; row <= tempTileB; ++row){for (int col = tempTileL; col <= tempTileR; ++col){vecTileCoord.push_back(TileCoord(col, row));}}// <3> 下侧tempTileT = tempTileBottom + 1;tileB = tempTileB = qMin(tempTileBottom + tileH / 2, mapSize - 1);tempTileL = qMax(tileLeft - tileW / 2, 0);tempTileR = qMin(tileRight + tileW / 2, mapSize - 1);for (int row = tempTileT; row <= tempTileB; ++row){for (int col = tempTileL; col <= tempTileR; ++col){vecTileCoord.push_back(TileCoord(col, row));}}// <4> 左侧tileL = tempTileL = qMax(tileLeft - tileW / 2, 0);tempTileR = tileLeft - 1;for (int row = tempTileTop; row <= tempTileBottom; ++row){for (int col = tempTileL; col <= tempTileR; ++col){vecTileCoord.push_back(TileCoord(col, row));}}// <5> 右侧tempTileL = tileRight + 1;tileR = tempTileR = qMin(tileRight + tileW / 2, mapSize - 1);for (int row = tempTileTop; row <= tempTileBottom; ++row){for (int col = tempTileL; col <= tempTileR; ++col){vecTileCoord.push_back(TileCoord(col, row));}}return QRect(tileL, tileT, (tileR - tileL + 1), (tileB - tileT + 1));
}


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代理ip的用途及是否可以降低延迟

代理IP具有广泛的应用领域&#xff0c;包括但不限于以下方面&#xff1a; 1. 匿名浏览和隐私保护 通过使用代理IP&#xff0c;您可以隐藏自己的真实IP地址&#xff0c;从而在网络上保持匿名。这对于维护个人隐私和保护个人身份非常重要。 2. 访问限制网站 代理IP可以绕过地理位…

免费开源,无需 GPU,本地化部署大语言模型的对话系统

免费开源&#xff0c;无需 GPU&#xff0c;本地化部署大语言模型的对话系统 分类 编程技术 项目名: FreeAskInternet -- 本地化部署大语言模型的对话系统 Github 开源地址&#xff1a; https://github.com/nashsu/FreeAskInternet FreeAskInternet 是一个免费开源的工具&am…

【小菜鸟之---Linux网络配置】

文章目录 1【子网和网关】2【网络连接模式】3【ifconfig-查看网络接口信息】3.1 查询网络接口信息3.2 ifconfig——设置网络接口参数【**设置网络参数的方式**】【**临时设置**】**【永久设置】** 4【hostname-主机信息】4.1 查看主机名4.2 主机名修改4.3 查看本机ip 5【route-…

Kotlin: Expecting a ‘>‘

数组值为任意类型&#xff0c;声明报错: Kotlin: Expecting a > var anyArr1: Array<Any?> arrayOf("a", "b", "c", true, 34)原因是&#xff1a; // var anyArr1: Array<Any?> arrayOf("a", "b", "c…

发电厂智能巡检机器人:让发电厂更安全、更高效

在发电厂的众多应用场景中&#xff0c;升压站、化学车间、空冷塔、输煤皮带、综合管廊等&#xff0c;一直以来都是人工巡检的主战场。然而&#xff0c;这些场所环境极为复杂&#xff0c;人工巡检面临着诸多难题&#xff0c;强度大、频率低、间隔长等问题突出。这使得设备在运行…

c++多线程基础

简介 c多线程基础需要掌握这三个标准库&#xff1a;std::thread, std::mutex, and std::async。 1. Hello, world #include <iostream> #include <thread>void hello() { std::cout << "Hello Concurrent World!\n"; }int main() {std::thread…

[NSSCTF]prize_p2

题目 打开是一段js代码 // 导入所需的模块 const { randomBytes } require(crypto); // 导入 crypto 模块&#xff0c;用于生成随机字节 const express require(express); // 导入 Express.js 模块&#xff0c;用于构建 Web 应用程序 const fs require(fs); // 导入文件系…

论文笔记:(Security 22) 关于“二进制函数相似性检测”的调研

个人博客链接 注&#xff1a;部分内容参考自GPT生成的内容 [Security 22] 关于”二进制函数相似性检测“的调研&#xff08;个人阅读笔记&#xff09; 论文&#xff1a;《How Machine Learning Is Solving the Binary Function Similarity Problem》&#xff08;Usenix Securi…

Golang中实现调用Windows API向指定目标发送ARP请求

简介 Go库中很多实现的arp都是支持osx/linux/bsd之类的&#xff0c; 但几乎没有支持windows的&#xff0c; 也试了一些方式&#xff0c; 目前还是选用调用windows的API&#xff0c; 记录一下这一次windows的API的调用经验。 实现 代码 package main/* #cgo CFLAGS: -I. #cgo …

Reactor模型详解

目录 1.概述 2.Single Reactor 3.muduo库的Multiple Reactors模型如下 1.概述 维基百科对Reactor模型的解释 The reactor design pattern is an event handling pattern for handling service requests delivered concurrently to a service handler by one or more inputs.…

自定义redisTemplate实现自定义序列化

由于我们使用springboot集成的redis工具的时候&#xff0c;redisTemplate内部是采用了jdk默认的序列化工具来对我们存储的数据进行序列化的&#xff0c;这会导致我们在redis中存储的序列化后的数据和我们原来的数据格式在查看的时候会有偏差&#xff0c;所以我们需要自定义redi…

「PHP系列」PHP7 新特性:use语句、intdiv() 函数、Session 选项

文章目录 一、use语句1. 导入类2. 导入函数3. 导入多个类或函数4. 为类或函数提供别名 二、intdiv() 函数三、Session 选项1. 设置会话保存路径2. 自定义会话处理程序3. 设置会话名 四、相关链接 一、use语句 在 PHP 7 中&#xff0c;use 语句通常与命名空间&#xff08;names…

OpenCV如何模板匹配(59)

返回:OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV如何实现背投(58) 下一篇 &#xff1a;OpenCV在图像中寻找轮廓(60) 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用 OpenCV 函数 matchTemplate()搜索图像贴片和输入…

批量生成sql语句

批量生成sql语句 利用表格直接生成 # 例&#xff1a;A2 表示 A列第二行 公式表示为 ,A2,# 新增 CONCATENATE("insert into users (id,code,name) values (null,",A2,",",B2,");")# 修改 CONCATENATE("update users set name ",B3,&…

c++ 继承与派生的简单理解

继承与派生概念&#xff1a; 派生是一种创建新类的方式&#xff0c;在原来已有被继承类的基础上&#xff0c;不影响原来的类&#xff0c;不改变原来类的代码&#xff0c;实现对于功能的扩展&#xff0c;在原有被继承类的基础上快速增加新的功能&#xff1b;新创建的类可以来源…

第四篇:记忆的迷宫:探索计算机存储结构的奥秘与创新

记忆的迷宫&#xff1a;探索计算机存储结构的奥秘与创新 1 引言 1.1 计算机存储系统的发展与重要性 在现代计算技术中&#xff0c;存储系统承担着非常关键的角色&#xff0c;它不仅负责信息的持久保存&#xff0c;同时确保高效的数据访问速度&#xff0c;影响着整体系统性能的…

《Fundamentals of Power Electronics》——基础交流建模方法

PWM整流器小信号交流模型建模的主要步骤为&#xff1a; (a)利用小纹波近似的动态版本&#xff0c;建立与电感和电容波形的低频平均值有关的方程&#xff1b; (b)平均方程的扰动和线性化&#xff1b; (c)交流等效电路模型的建立。 以下图buck-boost电路为例进行分析。 首先测…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑碳捕集和电转气的综合能源系统优化调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

SpringBoot与SpringMVC的区别

SpringBoot与SpringMVC的区别是什么&#xff1f; SpringBoot和SpringMVC是Java开发中常用的两个框架&#xff0c;它们都是由Spring框架所提供的&#xff0c;但在功能和使用方式上有着一些区别。本文将分别介绍SpringBoot和SpringMVC的特点和区别。 一、SpringBoot的特点&#…

Qt服务器端与客户端交互

Qt做客户端与服务器端交互第一步引入network 第一步引入network后继续编程首先界面设计 创建server和socket 引入QTcpServer&#xff0c;QTcpSocket MainWindow.h代码如下 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QTcpServer&…