[A*算法03]不重复二维坐标和A_star类设计

Posted AIplusX

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[A*算法03]不重复二维坐标和A_star类设计相关的知识,希望对你有一定的参考价值。

写在前面

昨天生成障碍物,起点和终点的方法比较随意,今天重新想了个办法实现了生成不重复的二维坐标,将在后面进行介绍,同时完成了A*主体算法的构建。

知识点

1:不重复二维坐标生成方法:

我将整张图的所有格点存到一个vector里面,然后将vector进行无序化,之后按顺序取出其中数据即可实现不重复的二维坐标获取,这样做主要是为了避免障碍物,起点,终点生成的随机点重复,实现如下所示(注意,#include <random>不要忘记了):

#include <random>
void Graph::set_obstacles_start_end()
{
	int total_block = graph_user_para.map_x * graph_user_para.map_y;
	obstacle = new Point[graph_user_para.obstacle_num];

	std::vector<Point> obstacle_vector;
	for (int i = 0; i < graph_user_para.map_x; i++) {
		for (int j = 0; j < graph_user_para.map_y; j++) {
			obstacle_vector.push_back(Point(i, j));
		}
	}

	std::random_device rd;
	std::mt19937 g(rd());
	std::shuffle(obstacle_vector.begin(), obstacle_vector.end(), rd);

	start = obstacle_vector[0];
	obstacle_vector.erase(obstacle_vector.begin());
	end = obstacle_vector[0];
	obstacle_vector.erase(obstacle_vector.begin());
	for (int i = 0; i < graph_user_para.obstacle_num; i++) {
		obstacle[i] = obstacle_vector[0];
		graph_user_para.map[obstacle[i].x][obstacle[i].y] = OBSTACLE;
		obstacle_vector.erase(obstacle_vector.begin());
	}

	graph_user_para.map[start.x][start.y] = START;
	graph_user_para.map[end.x][end.y] = END;


}

2:友元的使用。

友元的使用可以让其他类访问本类的私有数据。

3:C++的OOP特性只存在于编译时刻,编译之后生成的.o文件和C语言编译之后生成的.o文件一样。

图形界面变换

之前设计的地图格子太少了,所以今天我进行了更改,此时高集成度的代码的优势就体现出来了,我只修改了obstacle_num,block_size,map[60][30]这3个参数就完成了地图的修改,代码和效果如下图所示:

typedef struct _UserPara
{

	public:
		int win_width = 960;
		int win_height = 480;
		int block_size = 16;
		int obstacle_num = 400;
		int map[60][30] = { 0 };// 960/32 = 30, 480/32 = 15 
		int map_x = win_width / block_size;
		int map_y = win_height / block_size;

}UserPara;


红色方块是路径起点,绿色方块是路径终点。

A_star类设计

我单独设计了一个A_star类,并且将其做为Graph类的友类,这样A_star类就可以访问Graph类的私有变量,在A_star里面完成算法,在Graph类里进行图像显示。根据A_star算法的逻辑,我设置了如下A_star类的函数:

#pragma once
#include "Graph.h"

typedef struct _Node {
	bool in_open_set = false;
	bool in_close_set = false;
	bool walkable = true;
	Point  coordinate;
	_Node* pre = nullptr;
}Node;

class A_star
{
	public:
		A_star();
		~A_star();
		int find_min_Fn();
		void add_closelist();
		void add_openlist();
		float get_Hn();
		float get_Gn();
		float cost();
		void get_env_node();
		bool check_end();
		void a_star();
		Point get_next();
	private:
		int Gn;
		int Hn;
		int Fn;

};


明天开始A*算法的逻辑设计。

以上是关于[A*算法03]不重复二维坐标和A_star类设计的主要内容,如果未能解决你的问题,请参考以下文章

A_star三维路径规划基于matlab A_star算法和B次样条危险模型无人机三维航迹规划含Matlab源码 2162期

A_star三维路径规划基于matlab A_star算法和B次样条危险模型无人机三维航迹规划含Matlab源码 2162期

路径规划基于matlab A_star算法机器人走迷宫路径规划含Matlab源码 1389期

路径规划基于matlab A_star算法多机器人仓储巡逻路径规划含Matlab源码 2125期

路径规划基于matlab A_star算法多机器人仓储巡逻路径规划含Matlab源码 2125期

路径规划基于matlab A_star算法机器人避障最短路径规划含Matlab源码 2295期