AStar算法(大物件寻路)

news2024/11/20 14:43:29

前言

A星(物件大小为一格)寻路,都很熟悉了吧,网上源码一堆,随便抄;
这章需要讲述 大物件的A星寻路,何为大物件,就是 比如 物件 为4个格子;
这样,原来的A星 没法直接用了,必须得改装;
这里以22 格子为例 物件讲述 (上下左右 4个方向),33 4*4 等都一样

1:A星算法 核心
F = G + H
F 方块的总移动代价
G 开始点到当前方块的移动代价
H 当前方块到结束点的预估移动代价

2:计算步骤
首先将根节点放入队列中。
将根节点放入封闭列表
开始循环
从队列中找f值F值最小的节点current
如果找到目标,则结束搜寻并回传结果。
否则将它所有尚未检验过的所有相邻节点加入队列中(这里可以是4个方向或8个方向)
假如某邻近点既没有在开放列表或封闭列表里面,则计算出该邻近点的g值和h值,并设父节点为P,然后将其放入开放列表 消耗 横/竖10 斜14
gCost = current.gCost + GetDistance(current, neighbor);
hCost = GetDistance(end, neighbor);
直至没有节点可以访问.

3:大物件怎么计算
22格子物件
地图为30
30 1遮挡 0 可走 5 开始点 9 目标点
开始点左小角的4个5(), 28 row 1 col 2col
29row 1col 2col
目标为右上角偏左 一个9
在这里插入图片描述

取中心点
22 每有中间,有的 ,假如 22 物件 格子坐标 为 00, 01, 10 ,11 那么中心点为0.5 0.5 小数不计算,所以都放大 10倍 ,就是 5 5
其他跟 一格的一行,
主要说下 不一样的
1> 查找某点的周围4个点时, 一格 (上下左右)很好理解,22 格 周围有8格点,33 有12点
2>如果目标点只有1格点,那么判定是 只有2*2物件 4格中任何一格在这格目标点上,就算找到目标了;
上代码

bool  checkpoint(int newX, int newY, vector<vector<int>> &map,int mapXSize,int mapYSize) {
	if (newX < 0 || newX >= mapXSize) {
		return false;
	}
	if (newY < 0 || newY >= mapYSize) {
		return false;
	}
	if (map[newX][newY] == 1) {
		return false; // 不可达
	}
	return true;
}

list<PPoint> AStart::findAroundPoint4Half(PPoint curPoint, PPoint& endPoint) {
	list<PPoint> around;
const	int mapXSize = map.size();
const	int mapYSize = map[0].size();
const int curx = curPoint->x;
const int cury = curPoint->y;

const int endxR = endPoint->x/10; //还原到真实
const int endyR = endPoint->y/10; //还原到真实
int newX = 0;
int newY = 0;
int rx = 0;
int ry = 0;
int count = 0;
//const int TOTAL_DIR = 4;
//const int directions[TOTAL_DIR][2] = { {1, 0}, {0, 1}, {-1, 0}, {0, -1} };
//const int movedircollection[TOTAL_DIR] = { DIR_X_ADD ,DIR_Y_ADD ,DIR_X_SUB ,DIR_Y_SUB };

//const int directionsHalf[TOTAL_DIR][2][2] = { {{5,5},{5,-5}}, {{5,5},{-5,5}} , {{-5,5},{-5,-5}} ,{{5,-5},{-5,-5}} };

for (int i = 0; i < TOTAL_DIR; i++) {
	//
	count = 0;
	newX = curx + directions[i][0] * 10;
	newY = cury + directions[i][1] * 10;
	for (int j = 0; j < 2; j++) {
		int newX_t = newX + directionsHalf[i][j][0]; //curx + directionsHalf[i][j][0] + directions[i][0]*10;
		int newY_t = newY + directionsHalf[i][j][1];//cury + directionsHalf[i][j][1] + directions[i][1]*10;

		rx = newX_t / 10;// +directions[i][0];
		ry = newY_t / 10;// +directions[i][1];

		if (rx == endxR && ry == endyR) {

			around.clear();
			PPoint newPoint = new Point(endPoint->x, endPoint->y);
			around.push_back(newPoint);
			return around;
		}

		if (!checkpoint(rx, ry, map, mapXSize, mapYSize)) {
			break;
		}
		++count;
	}

	if (count > 1) {
		PPoint newPoint = new Point(newX, newY);
		around.push_back(newPoint);
	}

}
return around;
}

开始位置,目标位置 修改

 start->x = start->x * 10 + 5;  //中间点
 start->y = start->y * 10 + 5;  //中间点
 end->x = end->x * 10; //放大10倍
 end->y = end->y * 10; //放大10倍

计算G H 的消耗时 也需要放大10倍

4:测试
路劲打印的 7 为路劲 2*2物件
在这里插入图片描述
大概寻路路劲如下:手动画的比较粗略
在这里插入图片描述
5:DEMO工程
有需要再上传
如果觉得有用,麻烦点个赞,加个收藏

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

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

相关文章

【Java程序员面试专栏 算法思维】四 高频面试算法题:回溯算法

一轮的算法训练完成后,对相关的题目有了一个初步理解了,接下来进行专题训练,以下这些题目就是汇总的高频题目,本篇主要聊聊回溯算法,主要就是排列组合问题,所以放到一篇Blog中集中练习 题目关键字解题思路时间空间岛屿数量网格搜索分别向上下左右四个方向探索,遇到海洋…

微信小程序引入Vant插件

Vant官网&#xff1a;Vant Weapp - 轻量、可靠的小程序 UI 组件库 先查看官网的版本 新建一个package.json页面&#xff0c;代码写上&#xff1a;&#xff08;我先执行的npm安装没出package页面&#xff0c;所以先自己创建了一个才正常&#xff09; {"dependencies"…

【Spring底层原理高级进阶】基于Spring Boot和Spring WebFlux的实时推荐系统的核心:响应式编程与 WebFlux 的颠覆性变革

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《Spring 狂野之旅&#xff1a;底层原理高级进阶》 &#x1f680…

Bicycles(变形dijkstra,动态规划思想)

Codeforces Round 918 (Div. 4) G. Bicycles G. Bicycles 题意&#xff1a; 斯拉夫的所有朋友都打算骑自行车从他们住的地方去参加一个聚会。除了斯拉维奇&#xff0c;他们都有一辆自行车。他们可以经过 n n n 个城市。他们都住在城市 1 1 1 &#xff0c;想去参加位于城市…

c++实现栈和队列类

c实现栈和队列类 栈(Stack)Stack示意图Stack.cpp 队列(queue)queue 示意图queue.cpp 栈(Stack) Stack示意图 Stack.cpp #pragma once #include "ListStu.cpp"template<typename T> class Stack { public: /* * void push(T& tDate)* 参数一 &#xff1a;…

Android和Linux的开发差异

最近开始投入Android的怀抱。说来惭愧&#xff0c;08年就听说这东西&#xff0c;当时也有同事投入去看&#xff0c;因为恶心Java&#xff0c;始终对这玩意无感&#xff0c;没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业&#xff0c;所以只能回过头又来学。 首先还是…

硬盘销毁:如何彻底销毁硬盘 文件销毁 数据销毁 物料销

大家对于办公这个词并不陌生&#xff0c;大多数人都知道办公就是对公事的处理&#xff0c;不是私人的事情处理。办公中会出现很多文件&#xff0c;很多的资料&#xff0c;那么办公室的文件销毁是如何处理的呢&#xff1f; 办公文件对于办公的人来说都是非常重视的&#xff0c;…

AI学习(5):PyTorch-核心模块(Autograd):自动求导

1.介绍 在深度学习中&#xff0c;自动求导是一项核心技术&#xff0c;它使得我们能够方便地计算梯度并优化模型参数。PyTorch 提供了一个强大的自动求导模块(Autograd)&#xff0c;它可以自动计算张量的导数得出梯度信息&#xff0c;同时也支持高阶导数计算。 1.1 概念词 在学…

微服务-商城订单服务项目

文章目录 一、需求二、分析三、设计四、编码4.1 商品服务4.2 订单服务4.3 分布式事务4.4 订单超时 商品、购物车 商品服务&#xff1a; 1.全品类购物平台 SPU:Standard Product Unit 标准化产品单元。是商品信息聚合的最小单位。是一组可复用、易检索的标准化信息的集合&#x…

EMR StarRocks实战——Mysql数据实时同步到SR

文章摘抄阿里云EMR上的StarRocks实践&#xff1a;《基于实时计算Flink使用CTAS&CDAS功能同步MySQL数据至StarRocks》 前言 CTAS可以实现单表的结构和数据同步&#xff0c;CDAS可以实现整库同步或者同一库中的多表结构和数据同步。下文主要介绍如何使用Flink平台和E-MapRed…

【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson 16 At the Shoe Store 在鞋店

《美语从头学初级入门篇》 注意&#xff1a;被 删除线 划掉的不一定不正确&#xff0c;只是不是标准答案。 文章目录 Lesson 16 At the Shoe Store 在鞋店对话A对话B笔记会话A会话B替换 Lesson 16 At the Shoe Store 在鞋店 对话A A: Do you have these shoes in size 8? B:…

如何运行github上的项目

为了讲明白这个过程&#xff0c;特意做了一个相当来说比较好读懂的原理图&#xff0c;希望和我一样初学的小伙伴也能很快上手哈&#x1f60a; 在Github中找到想要部署的项目&#xff0c;这里以BartoszJarocki/CV&#xff08;线上简历&#x1f4c4;&#xff09;项目为例 先从头…

经典Go知识点总结

开篇推荐 来来来,老铁们,男人女人都需要的技术活 拿去不谢:远程调试,发布网站到公网演示,远程访问内网服务,游戏联机 推荐链接 1.无论sync.Mutex还是其衍生品都会提示不能复制,但是能够编译运行 加锁后复制变量&#xff0c;会将锁的状态也复制&#xff0c;所以 mu1 其实是已…

4核8G服务器并发数多少?性能如何?

腾讯云4核8G服务器支持多少人在线访问&#xff1f;支持25人同时访问。实际上程序效率不同支持人数在线人数不同&#xff0c;公网带宽也是影响4核8G服务器并发数的一大因素&#xff0c;假设公网带宽太小&#xff0c;流量直接卡在入口&#xff0c;4核8G配置的CPU内存也会造成计算…

React Switch用法及手写Switch实现

问&#xff1a;如果注册的路由特别多&#xff0c;找到一个匹配项以后还会一直往下找&#xff0c;我们想让react找到一个匹配项以后不再继续了&#xff0c;怎么处理&#xff1f;答&#xff1a;<Switch>独特之处在于它只绘制子元素中第一个匹配的路由元素。 如果没有<Sw…

[极客大挑战 2019]LoveSQL1 题目分析与详解

一、题目简介&#xff1a; 二、通关思路&#xff1a; 1、首先查看页面源代码&#xff1a; 我们发现可以使用工具sqlmap来拿到flag&#xff0c;我们先尝试手动注入。 2、 打开靶机&#xff0c;映入眼帘的是登录界面&#xff0c;首先尝试万能密码能否破解。 username: 1 or 11…

IDEA如何开启Dashboard

普通的面板 Run Dashboard面板 修改配置文件 找到项目的.idea文件夹 点击编辑workspace.xml文件 添加下方代码 <component name"RunDashboard"><option name"ruleStates"><list><RuleState><option name"name" valu…

雾锁王国服务器配置怎么选择?阿里云和腾讯云

雾锁王国/Enshrouded服务器CPU内存配置如何选择&#xff1f;阿里云服务器网aliyunfuwuqi.com建议选择8核32G配置&#xff0c;支持4人玩家畅玩&#xff0c;自带10M公网带宽&#xff0c;1个月90元&#xff0c;3个月271元&#xff0c;幻兽帕鲁服务器申请页面 https://t.aliyun.com…

通过QScrollArea寻找最后一个弹簧并且设置弹簧大小

项目原因&#xff0c;最近需要通过QScrollArea寻找其中最后一个弹簧并且设置大小和策略&#xff0c;因为无法直接调用UI指针&#xff0c;所以只能用代码寻找。 直接上代码&#xff1a; if (m_scrollArea){int iScrollWidth m_labelSelectedTitle->width();m_scrollArea-&g…

数据结构与算法(数组,栈,队列,链表,哈希表,搜索算法,排序算法,查找算法,策略算法,递归算法,二叉搜索树BST,动态规划算法)

文章目录 1 课程介绍1.1 前置知识1.2 为什么要学习算法1.3 大厂面试常见数据结构题目(基础)1.4 数据结构和算法的关系 2 数据结构2.1 数据结构概述2.1.1 数据结构是什么2.1.2 数据结构分类2.1.2.1 线性结构2.1.2.2 非线性结构2.1.2.3 小总结 2.1.3 数据结构范围 2.2 数组Array2…