前几年
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611yi.gif)
![](/icons/33611de.gif)
![](/icons/33611dou2.gif)
![](/icons/33611dou.gif)
![](/icons/33611yi.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611yi.gif)
![](/icons/33611de.gif)
![](/icons/33611chengxu.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou2.gif)
![](/icons/33611de.gif)
![](/icons/33611dou2.gif)
想象
![](/icons/33611yi.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611yi.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou2.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611de.gif)
![](/icons/33611yi.gif)
![](/icons/33611de.gif)
![](/icons/33611dou2.gif)
![](/icons/33611yi.gif)
![](/icons/33611de.gif)
寻径算法中需要解决
![](/icons/33611de.gif)
![](/icons/33611dou2.gif)
![](/icons/33611de.gif)
- 从起点到终点拉
条直线A
- 沿着直线A朝终点行进
遇到障碍物便按顺时针方向绕着障碍物行走
直至碰到直线A
- 重复步骤2
便
定能最终达到目
地
(注:红色圆点表示起点
![](/icons/33611dou.gif)
该算法计算出来
![](/icons/33611de.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611de.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou2.gif)
(
![](/icons/33611yi.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
( 2) 尽量走直线路径
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611yi.gif)
![](/icons/33611yi.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
( 3) 当终点处于障碍物包围的中
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611de.gif)
![](/icons/33611yi.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou2.gif)
本文
![](/icons/33611de.gif)
![](/icons/33611de.gif)
![](/icons/33611dou2.gif)
![](/icons/33611de.gif)
![](/icons/33611yi.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611de.gif)
![](/icons/33611dou2.gif)
1.当环绕障碍物行走时
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
2.接着可移动物体依次查看方向j = (i+n) mod 8 (n=1..7)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611yi.gif)
![](/icons/33611dou2.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611de.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
3.重复步骤1、2
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611de.gif)
![](/icons/33611diaoyong.gif)
![](/icons/33611hanshu.gif)
![](/icons/33611yi.gif)
![](/icons/33611dou2.gif)
boolean ClockwiseWalkOneStep(
![](/icons/33611int.gif)
![](/icons/33611int.gif)
![](/icons/33611int.gif)
{
???
![](/icons/33611int.gif)
??? for ( n = 1; n <=7 ; n
![](/icons/33611jiajia.gif)
??? {
??????? i =(i + n) mod 8;
???????
![](/icons/33611if.gif)
???????????
![](/icons/33611break.gif)
??? }
???
![](/icons/33611if.gif)
![](/icons/33611dd.gif)
???????
![](/icons/33611return.gif)
??? switch ( i ) {
???
![](/icons/33611case.gif)
??? {
??????? nCol = nCol-1;
??????? i = 7;
???????
![](/icons/33611break.gif)
??? }
???
![](/icons/33611case.gif)
??? {
???????
![](/icons/33611if.gif)
![](/icons/33611dd.gif)
??????? {
??????????? nCol = nCol-1;
??????????? nRow = nRow+1;
??????????? i = 7;
??????? }
???????
![](/icons/33611else.gif)
??????? {
??????????? nRow = nRow+1;
??????????? i = 0;
??????? }
???????
![](/icons/33611break.gif)
??? }
???
![](/icons/33611case.gif)
??? {
??????? nRow = nRow+1;
??????? i = 1;
???????
![](/icons/33611break.gif)
??? }
???
![](/icons/33611case.gif)
??? {
???????
![](/icons/33611if.gif)
![](/icons/33611dd.gif)
??????? {
??????????? nCol = nCol+1;
??????????? nRow = nRow+1;
??????????? i = 1;
??????? }
???????
![](/icons/33611else.gif)
??????? {
??????????? nCol = nCol+1;
??????????? i = 2;
??????????? end
??????? }
???????
![](/icons/33611break.gif)
??? }
???
![](/icons/33611case.gif)
??? {?
??????? nCol = nCol+1;
??????? i = 3;
???????
![](/icons/33611break.gif)
??? }
???
![](/icons/33611case.gif)
??? {
???????
![](/icons/33611if.gif)
![](/icons/33611dd.gif)
??????? {
??????????? nCol = nCol+1;
??????????? nRow = nRow-1;
??????????? i = 3;
??????? }
???????
![](/icons/33611else.gif)
??????? {
??????????? nRow = nRow-1;
??????????? i = 4;
??????? }
???????
![](/icons/33611break.gif)
??? }
???
![](/icons/33611case.gif)
??? {
??????? nRow = nRow-1;
??????? i = 5;
???????
![](/icons/33611break.gif)
??? }
???
![](/icons/33611case.gif)
??? {
???????
![](/icons/33611if.gif)
??????? {
??????????? nCol = nCol-1;
??????????? nRow = nRow-1;
??????????? i = 5
??????? }
???????
![](/icons/33611else.gif)
??????? {
??????????? nCol = nCol-1;
??????????? i = 6;
??????? }
???????
![](/icons/33611break.gif)
??? }
??? }
???
![](/icons/33611return.gif)
}
2、动态障碍物环境中
![](/icons/33611de.gif)
刚才描述
![](/icons/33611de.gif)
![](/icons/33611de.gif)
![](/icons/33611dou2.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611yi.gif)
![](/icons/33611yi.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611de.gif)
最直观
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611yi.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611yi.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611yi.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611yi.gif)
![](/icons/33611yi.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
// 遍历所有可移动物体
for (i = 1; i <= n; i
![](/icons/33611jiajia.gif)
{
??? Switch ( Tank[i].State ) {
???????
![](/icons/33611case.gif)
??????? {
???????????
![](/icons/33611if.gif)
??????????? {
??????????????? Tank[i].GoalPos = 目
![](/icons/33611de.gif)
??????????????? Tank[i].State = FindNewPath;
??????????? }
???????????
![](/icons/33611if.gif)
![](/icons/33611dd.gif)
![](/icons/33611kh.gif)
??????????? {
??????????????? Tank[i].State = Stillness;
???????????????
![](/icons/33611break.gif)
??????????? }
??????????? Tank[i].PosNext = RouteList[Tank[i]].GetNextPos
![](/icons/33611kh.gif)
![](/icons/33611yi.gif)
???????????
![](/icons/33611if.gif)
![](/icons/33611dd.gif)
??????????? {
??????????????? Tank[i].State = Moving;
??????????????? Tank[i].CurrentMovingPos = Tank[i].Pos;
??????????????? Map[Tank[i].PosNext].Passable = false;
??????????????? Map[Tank[i].Pos].Passable = false;
??????????? }
???????????
![](/icons/33611else.gif)
??????????? {
???????????????
![](/icons/33611if.gif)
![](/icons/33611dd.gif)
??????????????????? Tank[i].State = FindNewPath;
???????????????
![](/icons/33611else.gif)
??????????????????? Tank[i].WaitTime
![](/icons/33611jiajia.gif)
??????????? }
???????????
![](/icons/33611break.gif)
??????? }
???????
![](/icons/33611case.gif)
??????? {
根据Tank[i].GoalPos,计算Tank[i]
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
???????????
![](/icons/33611if.gif)
??????????????? Tank[i].State = FindNewPath;
???????????
![](/icons/33611else.gif)
??????????? {
??????????????? Tank[i].State = Run;
??????????????? Tank[i].WaitTime = 0;
??????????? }
???????????
![](/icons/33611break.gif)
??????? }
???????
![](/icons/33611case.gif)
??????? {
??????????? // 在Pos和PosNext间作线性插值
???????????
![](/icons/33611if.gif)
??????????? {
??????????????? Tank[i].CurrentMovingPos
![](/icons/33611jiadeng.gif)
??????????????? Tank[i].State = Moving;
??????????? }
???????????
![](/icons/33611else.gif)
??????????? {
??????????????? Tank[i].CurrentMovingPos = Tank[i].PosNext;
??????????????? Tank[i].State = Run;
??????????????? Tank[i].WaitTime = 0;
??????????????? Map[Tank[i].PosNext].Passable = false;
??????????????? Map[Tank[i].Pos].Passable = true;
??????????????? Tank[i].Pos = Tank[i].PosNext;
??????????? }
??????? }
???????
![](/icons/33611case.gif)
??????? {
???????????
![](/icons/33611if.gif)
??????????? {
??????????????? Tank[i].GoalPos = 目
![](/icons/33611de.gif)
??????????????? Tank[i].State = FindNewPath;
??????????? }
???????????
![](/icons/33611break.gif)
??????? }
??? }
}
先绘制背景;
for (i = 1; i <= n; i
![](/icons/33611jiajia.gif)
??? Draw(Tank[i].CurrentMovingPos);
图3 可移动物体状态转换图
上述算法中
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611chushi.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611yi.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611dou.gif)
![](/icons/33611yi.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou2.gif)
![](/icons/33611dou.gif)
![](/icons/33611dou.gif)
![](/icons/33611de.gif)
![](/icons/33611dou2.gif)
最新评论