基于Qt的A*算法可视化分析

代码地址如下:
http://www.demodashi.com/demo/13677.html

需求
之前做过一个无人车需要自主寻找最佳路径,所以研究了相关的寻路算法,最终选择A算法,因为其简单易懂,是入门级的寻路算法。
但是在验证的算法的时候,没有直观的感受,总是觉得会有什么问题,所以我就写了一个可视化的A
算法验证,界面基于Qt开发。
项目说明
本项目主要分为2个部分,Qt绘制网格和A算法实现。下面可以看到,界面的实现和A算法的实现基本上是分离的。也就是说可以单独使用,比如Qt网格绘制,可以用于扫雷游戏,A*算法的代码可以直接拷贝,稍作修改就可以直接用于游戏,或者无人车。

效果


操作说明
鼠标右键:设置障碍物;鼠标左键:设置起点和终点。

项目文件截图

项目实现
程序的实现流程:定义一个最小网格类->通过鼠标设置起点、终点和障碍物,并实时绘制->寻找路径->绘制路径。

定义最小网格类
首先,我们需要定义一个最小网格类,用于绘制网格地图(GridMap)。
网格地图是将二维场景中的地图划分为一个个小网格,这个小网格是最小的空间单位,我们可以设置该网格为障碍物、起点或终点。
下面是最小网格类。

class Item
{
    
public:
    Item();
    Item(QPoint pos);

    QPoint m_pos;		//position
    bool m_bIsObstacle;	//whether is obstacle
    int m_nObjectType;         //the object type , Nothing,Robot or goal

};

可以看出最小网格对象很简单,只需要一个位置信息,障碍物标志位,机器人或目标点标志。以上就是最小网格的全部属性,当然如果想要实现更加复杂的功能,可以添加属性。

初始化地图
初始化地图是指将2维地图划分为网格的过程,其实就是new Item的过程。

void MainWindow::InitItems()
{
    
	for(int i=0; i<m_nColumes; i++)
	{
    
		QVector<Item*> rowItems;
		for(int j=0; j<m_nRows; j++)
		{
    
			QPoint pos = QPoint(i,j);
			Item* pItem = new Item(pos);
			rowItems.append(pItem);		
		}
		m_items.append(rowItems);
	}
}

其中m_nColumes和m_nRows是在初始化地图之前设置的长宽。

设置障碍物
在寻路之前,我们要先设置好障碍物、起点和终点。设置障碍物用鼠标右键,单击右键,设置小网格为障碍物,再次单击取消障碍物;设置起点和终点用鼠标左键,单击左键1次,设置小网格为起点,再次单击为终点,再次单击为空白,依次循环。
这里我们用鼠标事件实现,可以看到其实就是根据鼠标事件来设置相应位置Item对象的属性。代码很简单。在设置起点和终点是需要特别标记,因为如果地图中没有标定起点和终点,就无法寻路了。

void MainWindow::mousePressEvent(QMouseEvent * e)
{
    
	//得到鼠标处的格子坐标
	QPoint pt;
	pt.setX( (e->pos().x() - START_X ) / RECT_WIDTH);
	pt.setY( (e->pos().y() - START_X 
  • 0
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
冒泡排序,顾名思义就是像水中的气泡一样逐个升上来,这就意味着它是一种交换排序。基于QT实现的冒泡排序是一种图形界面化的交互排序方式。它可以将排序结果实时显示给用户,并且可以使用户在排序过程中随时停止、继续、重置或调整速度,非常方便和人性化。下面就详细说明一下QT冒泡排序的实现。 首先,需要一个图形界面容器来实现QT的图形展示,我们可以采用QWidget或者QMainWindow,本例中采用的是QMainWindow。然后,生成一些随机数用于排序,并且在界面中展示。 接下来,可以使用一个定时器来实时监测排序的过程,并且实时更新显示,这样可以保证程序能够响应用户的操作。定时器的设置可以采用QTimer,其信号槽可以用QCoreApplication::processEvents()刺激QT处理系统事件。 在冒泡排序算法中,我们仍然需要一个外循环用于遍历所有数据,还需要一个内循环来比较相邻的两个数据并交换其位置。在UI界面中,我们对应的是一个“start”按钮来启动排序,并且可以使用一些控件如滑动条或者下拉菜单来调整排序速度等参数。 当用户点击“start”按钮后,可以采用算法的时间复杂度来校准排序的速度,具体方法可以利用定时器中的定时间隔来计算。然后开始运行排序算法,并且根据算法的执行结果实时更新图形界面中的展示,也就是动态显示排序过程。 当排序结束时,我们还可以在UI界面中添加一些交互式的控件,比如“Restart”按钮和“Stop”按钮,来让用户可以重新启动排序或者停止排序并且退出程序。 综上所述,使用QT实现冒泡排序算法是一种直观、实用,和高效的交互式排序算法。它能够让用户在排序过程中实时监测排序结果,并且方便灵活地调整排序参数。而这样的体验在CMD命令行界面下是无法实现的。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值