⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 navigation.lst

📁 此程序是GPS导航程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
 170   3                  minDis = dis[i];
 171   3              }
 172   2          }
 173   1      
 174   1          /* 若没有可用的方向,则通知寻径函数折回 */
 175   1          if(minId == -1)
 176   1              return (path_t *)0;
 177   1      
 178   1          /* 用去最近距离方向的信号量 */
C51 COMPILER V8.02   NAVIGATION                                                            05/21/2008 10:52:26 PAGE 4   

 179   1          p->direct &= d_spend[minId];
 180   1          /* 在移动到新位置之前,在旧位置处留下足迹 */
 181   1          maze[pY][pX] = (byte_t)PATH_FOOTPRINT;
 182   1      
 183   1          /* 构建新的路径节点 */
 184   1          pnode = (path_t *)malloc(sizeof(path_t));
 185   1          assert(pnode);
 186   1      
 187   1          /* 计算下一个位置的坐标 */
 188   1          pX += move[minId][0];
 189   1          pY += move[minId][1];
 190   1      
 191   1          pnode->pos      = create_pos(pX, pY);
 192   1          pnode->prev   = p;
 193   1          pnode->next   = (path_t *)0;
 194   1          pnode->direct = 0;
 195   1      
 196   1          /* 在新位置处,计算下一个位置可用的移动方向 */
 197   1          for(i = 0; i < 4; ++i) {
 198   2              if(maze[pY + move[i][1]][pX + move[i][0]] != PATH_BLOCK && maze[pY + move[i][1]][pX + move[i][0]] 
             -!= PATH_FOOTPRINT) {
 199   3                  /* 若尝试的下一个位置不是障碍物或自己走过的足迹,则视为可用方向,获得该方向的信号量 */
 200   3                      pnode->direct |= d_signal[i];
 201   3              }
 202   2          }
 203   1      
 204   1          return pnode;
 205   1      
 206   1      }
 207          
 208          /****************************************************************************/
 209          /*== A*算法寻径函数 
 210          /*-eX
 211          /*-eY                  :入口坐标
 212          /*-qX
 213          /*-qY                  :出口坐标
 214          /*-maze                :矩阵
 215          /****************************************************************************/
 216          
 217          path_t * AStar(uint_t eX, uint_t eY, uint_t qX, uint_t qY, byte_t maze[MAZE_HEIGHT][MAZE_WIDTH])
 218           {
 219   1          register int i;
 220   1      
 221   1          /* 压缩坐标 */
 222   1          uint_t quit_pos = create_pos(qX, qY);
 223   1          
 224   1          /* 构建入口路径节点,视为路径链的头 */
 225   1          path_t *head = (path_t *)malloc(sizeof(path_t));
 226   1          path_t *p    = (path_t *)0;
 227   1          path_t *back = (path_t *)0;
 228   1          assert(head);
 229   1      
 230   1          p = head;
 231   1          p->direct = 0;
 232   1          p->pos    = create_pos(eX,eY);
 233   1          p->next   = (path_t *)0;
 234   1          p->prev   = (path_t *)0;
 235   1      
 236   1          /* 创建入口处的可用方向 */
 237   1          for(i = 0; i < 4; ++i) {
 238   2              if(maze[eY + move[i][1]][eX + move[i][0]] != PATH_BLOCK)
 239   2                  /* 若无障碍物则获得该方向的信号量 */
C51 COMPILER V8.02   NAVIGATION                                                            05/21/2008 10:52:26 PAGE 5   

 240   2                  p->direct |= d_signal[i];
 241   2          }
 242   1      
 243   1          do {
 244   2              
 245   2              /* 获得下个路径的节点指针 */
 246   2              back = evaluate(p, qX, qY, maze);
 247   2              if(back) {
 248   3                  p->next = back;
 249   3                  p = p->next;
 250   3              }
 251   2              
 252   2              /* 无路可走则折回 */
 253   2              if(p->direct == 0 && p != head && p->pos != quit_pos) {
 254   3                  back = p->prev;
 255   3                  back->next = (path_t *)0;
 256   3                  
 257   3                  /* 清楚脚印 */
 258   3                  maze[p->pos & 0x00FF][p->pos >> 8] = (byte_t)PATH_WALKON;
 259   3                  
 260   3                  free(p);
 261   3                  p = back;
 262   3              }
 263   2      
 264   2              /* 若走不出迷宫,即折回到入口,且入口处的可用方向全部尝试过 */
 265   2              if(p == head && p->direct == 0) {
 266   3                  free(head);
 267   3                  return (path_t *)0;
 268   3              }
 269   2      
 270   2          } while( p->pos != quit_pos );
 271   1          
 272   1          /* 在出口处留下脚印,便于打印 */
 273   1          maze[p->pos & 0x00FF][p->pos >> 8] = (byte_t)PATH_FOOTPRINT;
 274   1      
 275   1          return head;
 276   1      
 277   1      }
 278          
 279          /*****************************************************************/
 280          /*函数名称: show_menu_DaoHang.c                                 */
 281          /*函数功能: GPS导航                                             */      
 282          /*有无返回: 无                                                  */
 283          /*修改记录: 无修改记录                                          */
 284          /*入口参数: 
 285                       start_x------------------------------------起点x坐标
 286                                   start_y------------------------------------起点y坐标
 287                                   end_x  ------------------------------------终点x坐标
 288                                   end_y  ------------------------------------终点y坐标
 289                                                                                       */
 290          /*编写日期: 2008-5-01                                           */
 291          /*****************************************************************/
 292          
 293          //void show_menu_DaoHang(unsigned char start_x,unsigned char start_y,unsigned char end_x,unsigned char end
             -_y)
 294          void show_menu_DaoHang()
 295           {
 296   1             unsigned char  i=0,j=0;  
 297   1      
 298   1      
 299   1             path_t *pHead = AStar((uint_t)(Position/1000),(uint_t)(Position%1000/100),(uint_t)(Position%100/10)
             -,(uint_t)(Position%10),maze0);
C51 COMPILER V8.02   NAVIGATION                                                            05/21/2008 10:52:26 PAGE 6   

 300   1      
 301   1             for(i = 0; i < MAZE_HEIGHT; ++i) 
 302   1                 {
 303   2                for(j = 0; j < MAZE_WIDTH; ++j)
 304   2                Display_Point(j,i,symbol[maze0[i][j]]);
 305   2             }
 306   1      }
 307           
 308          void Show_Map()
 309          {
 310   1      
 311   1           unsigned char point_x=0,point_y=0;
 312   1           for(point_y = 0; point_y < MAZE_HEIGHT; ++point_y) 
 313   1               {
 314   2              for(point_x = 0; point_x < MAZE_WIDTH; ++point_x)
 315   2      
 316   2                         Display_Point(point_x,point_y,symbol[maze1[point_y][point_x]]);
 317   2                      
 318   2                      /*        
 319   2                            j-------代表x方向
 320   2                                i-------代表y方向
 321   2                                symbolic-路径显示         
 322   2                      */
 323   2      
 324   2           }
 325   1      
 326   1      }  
 327            
 328              


MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =   2621    ----
   CONSTANT SIZE    =     92    ----
   XDATA SIZE       =    556      70
   PDATA SIZE       =   ----    ----
   DATA SIZE        =   ----    ----
   IDATA SIZE       =   ----    ----
   BIT SIZE         =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -