校园地图

1.项目描述

  趁课余时间做了一个小作品,项目是校园地图,主要目的是练习Qt和一些基本的数据结构和算法。该项目的主要功能是从下拉列表中选择出发地和目的地,然后地图上可以显示路线。主要的显示方法是通过贴图来显示。时间久远才想起来整理,当时也是经历了一个星期的断断续续的修补,最后形成了一个比较完善的小地图软件。

2.基本思路

  01.首先需要构建路网(很重要),我首先写了一个该版本,然后把路网标记后保存。具体用来储存的数据结构是一个具有节点信息的结构体,然后借用C++的 vector (vector真的太好用了)来记录所有的路网节点。

 typedef struct road_dot{
        int i;   // 该节点的id
        int vistable; //该节点是否可访问
        cv::Point self; //该节点在地图上的位置
        std::vector others_id;  // 保存与该节点相连的节点的id
    }Road_node;

  下面是我用来标记路网并自动储存的模块:

/************************************************************************************************
 *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 *   These under codes construct a tool to get the road nodes infomation                   *
 *   <2016-10-29>                                                                   *
 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
 */
 void MainWindow::mousePressEvent(QMouseEvent *event)
{

    if(0pic->setPixmap(QPixmap::fromImage(qimg));




         if(!first_node)
         {start_node = new_node;start_set_flag = 1; first_node =2;pre_nodes_id = 0;}

         for(int i = 0;ibutton() == Qt::LeftButton)   // if leftButton
                {

                   start_node = road[i];  // set start node
                   start_set_flag = 1;

                   pre_nodes_id = i;

                }
               else if(event->button() == Qt::RightButton)
               {

                   start_node = road[pre_nodes_id];   // this is start
                   start_set_flag = 1;

                   end_node = road[i];
                   end_set_flag = 1;

                   road[i].others_id.push_back(pre_nodes_id);
                   road[pre_nodes_id].others_id.push_back(i);

                    pre_nodes_id = i;
               }

               qDebug()<<"this node's others.size = "<

  该代码主要通过在地图上点击来标记,右键表示一个连续段的结束,每个节点会记录与之相连的其它节点的id号。结果示意图:(另外,地图图片是Google截图并精心修改而成)

  02.标记完了路网后就是设计一个找路算法了,想过深度或广度搜索,但是做过一个demo后觉得稍显复杂并且速度不理想,后来根据地图的形状设计了一个看似很low却很有效的算法:

    首先设立两个哨兵,一个在当前出发节点(哨兵A),另一个在下一个目标出发点(哨兵 B),下一个目标出发点由所有子节点中距离目的地最近的节点确定。

    当B所在的节点具有可走子节点(不是死胡同)并且还未达到目的地时,A走到B(所有走过的路压栈,方便后退),B继续探路,若走到死胡同就后退,走其他的最近子节点。

   该寻路算法如下:

    int start_id = ui->comboBox->currentIndex();  // get start and end node's id /
    int end_id = ui->comboBox_2->currentIndex();

    for(int i = 0;i校园地图_第1张图片

 

  另外鼠标悬停在某个地点时,还会展示该地点的图片信息(亲自把所有地点拍了一遍 ;)

校园地图_第2张图片

 

 

-----------------------------------------------------------------------------------------------

校园地图_第3张图片

 

你可能感兴趣的:(校园地图)