IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> A*算法在三维空间实现C++(1)——图的相关定义 -> 正文阅读

[数据结构与算法]A*算法在三维空间实现C++(1)——图的相关定义

之前做过二维平面,基于网格的A*算法,地图采用硬编码的方式,用一个二维数组存下来整个地图的情况。

现在因为项目原因,需要升维到三维空间的寻路算法,如果还使用硬编码的方式将三维空间的场景保存下来,确实太不友好了....!!!所以现在考虑使用图的有关知识来实现A*算法。

1、三维空间寻路,有哪些可能的方向呢?

在二维平面,一个点可能向周围8个点移动,但是在三维空间,变成了26个点。可以想象以下三阶魔方,就是那个样子。所以需要现将26个方向进行一个记录。

typedef typename std::tuple<double, double, double> Point;
// 想象魔方
std::set<Point> directions =
{
	// 平面的8个点
	Point(0, 1, 0),		//North    正上
	Point(1, 1, 0),		//NorthEast
	Point(1, 0, 0),		//East     正右
	Point(1, -1, 0),	//SouthEast
	Point(0, -1, 0),	//South    正下
	Point(-1, -1, 0),	//SouthWest
	Point(-1, 0, 0),	//West     正左
	Point(-1, 1, 0),	//NorthWest

	// 按左手坐标系
	// 后面的9个点
	Point(0, 0, 1),		//UpMiddle   正后
	Point(0, 1, 1),		//UpNorth
	Point(1, 1, 1),		//UpNorthEast
	Point(1, 0, 1),		//UpEast     
	Point(1, -1, 1),	//UpSouthEast
	Point(0, -1, 1),	//UpSouth
	Point(-1, -1, 1),	//UpSouthWest
	Point(-1, 0, 1),	//UpWest
	Point(-1, 1, 1),	//UpNorthWest

	//前面的9个点 
	Point(0, 0, -1),	//DownMiddle
	Point(0, 1, -1),	//DownNorth
	Point(1, 1, -1),	//DownNorthEast
	Point(1, 0, -1),	//DownEast
	Point(1, -1, -1),	//DownSouthEast
	Point(0, -1, -1),	//DownSouth
	Point(-1, -1, -1),	//DownSouthWest
	Point(-1, 0, -1),	//DownWest
	Point(-1, 1, -1),	//DownNorthWest
};

2、如何描述图呢?

图的数据结构就不复习了,要有顶点,和边。

对于顶点的定义,需要描述该点的id、位置、以及g? h? f值。(GVertex是为了和DirectX中的Vertex区分开)

//定义图中的节点
struct GVertex
{
	GVertex() {};
	GVertex(int id) :id{ id }
	{
		this->cost_g = 1;
		this->cost_h = 0;
		this->cost_f = cost_g + cost_h;
		this->coord = Point(0, 0, 0);
	}

	……  //其他构造函数


	int id;

	double cost_g = 0;
	double cost_h = 0;
	double cost_f = 0;

	Point coord;

	void calc_f(double g, double h) { this->cost_f = g + h; }
};

对于边的描述,记录其id和权重即可。

//定义图中的边
struct Edge
{
	Edge() {};
	……  //其他构造函数
	int id;
	double edge_weight;
};

最后,就可以定义Graph类。

class Graph
{
public:
	Graph() {};

	//图中的节点<id,GVertex>
	std::unordered_map<int, std::shared_ptr<GVertex>> vertex_map;

	//图中的边<id,Edge>
	std::unordered_map<int, std::shared_ptr<Edge>> edge_map;

	// 邻接表  <节点的id,vector<边的id,邻接点id> >
	std::unordered_map<int, std::vector<std::pair<int, int>> > adjacency_map;

	std::vector<int> sources;             //起点
	std::vector<int> destinations;        //终点

	//获取一些参数
	……
	// 获取坐标分量
	……

	// 获取和设置f,g,h值
	……

	// 插入节点,插入边,插入邻接关系
	……

private:

};

(未完待续...)

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-28 12:04:59  更:2022-04-28 12:06:33 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 6:55:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码