protected bool IsSkiped(DirectionInfo directionInfo, int x, int y) { int x1 = 0, y1 = 0, x2 = 0, y2 = 0; // 如果当前位置为左上角,则判断其下方和右侧是否为不可穿过的障碍 if (directionInfo.Equals(DirectionInfoConst.LeftTopDirectionInfo)) { x1 = x; y1 = y - 1; x2 = x + 1; y2 = y; } // 如果当前位置为右上角,则判断其下方和左侧是否为不可穿过的障碍 if (directionInfo.Equals(DirectionInfoConst.RightTopDirectionInfo)) { x1 = x; y1 = y - 1; x2 = x - 1; y2 = y; } // 如果当前位置为左下角,则判断其上方和右侧是否为不可穿过的障碍 if (directionInfo.Equals(DirectionInfoConst.LeftBottomDirectionInfo)) { x1 = x; y1 = y + 1; x2 = x + 1; y2 = y; } // 如果当前位置为右下角,则判断其上方和左侧是否为不可穿过的障碍 if (directionInfo.Equals(DirectionInfoConst.RightBottomDirectionInfo)) { x1 = x; y1 = y + 1; x2 = x - 1; y2 = y; } // 根据计算后获得的坐标(x1,y1),(x2,y2),判断其是否为不可穿越的障碍,如果是,则跳过该邻居节点 if (!CanPass(x1, y1) || !CanPass(x2, y2)) { return(true); } return(false); }
//获得轨迹中可通过的最远点 public static Vector2Int GetMostPassPoint(AStarMapPath astarMapPath, List <Vector2Int> trackList, int[] canPassObstacleTypes, int[] canPassTerrainTypes, bool canOut = false) { Vector2Int lp = trackList[0]; Vector2Int tp = lp; for (int i = 1; i < trackList.Count; i++) { Vector2Int p = trackList[i]; if (!CanPass(astarMapPath, p.x, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut)) { break; } DirectionInfo directionInfo = DirectionInfoUtil.GetDirectionInfo(p.x - lp.x, p.y - lp.y); // directionInfo = DirectionConst.GetDirectionInfo(0, 0); // 不再判断临边障碍 2012-10-29 // LogCat.log(directionInfo.name); if (directionInfo == DirectionInfoConst.LeftTopDirectionInfo) // 左上角 { if (!CanPass(astarMapPath, p.x + 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut)) { break; } if (!CanPass(astarMapPath, p.x, p.y - 1, canPassObstacleTypes, canPassTerrainTypes, canOut)) { break; } } else if (directionInfo == DirectionInfoConst.RightTopDirectionInfo) // 右上角 { if (!CanPass(astarMapPath, p.x - 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut)) { break; } if (!CanPass(astarMapPath, p.x, p.y - 1, canPassObstacleTypes, canPassTerrainTypes, canOut)) { break; } } else if (directionInfo == DirectionInfoConst.RightBottomDirectionInfo) // 右下角 { if (!CanPass(astarMapPath, p.x - 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut)) { break; } if (!CanPass(astarMapPath, p.x, p.y + 1, canPassObstacleTypes, canPassTerrainTypes, canOut)) { break; } } else if (directionInfo == DirectionInfoConst.LeftBottomDirectionInfo) // 左下角 { if (!CanPass(astarMapPath, p.x + 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut)) { break; } if (!CanPass(astarMapPath, p.x, p.y + 1, canPassObstacleTypes, canPassTerrainTypes, canOut)) { break; } } lp = p; tp = lp; } return(tp); }
//检测轨迹是否可通过 // can_out 是否允许在场景外 public static bool CanPass(AStarMapPath astarMapPath, List <Vector2Int> trackList, int[] canPassObstacleTypes, int[] canPassTerrainTypes, bool canOut = false) { if (trackList.Count == 0) { return(true); } Vector2Int lp = trackList[0]; if (trackList.Count == 1) { return(CanPass(astarMapPath, lp.x, lp.y, canPassObstacleTypes, canPassTerrainTypes, canOut)); } for (int i = 1; i < trackList.Count; i++) { Vector2Int p = trackList[i]; if (!CanPass(astarMapPath, p.x, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut)) { return(false); } DirectionInfo directionInfo = DirectionInfoUtil.GetDirectionInfo(p.x - lp.x, p.y - lp.y); // directionInfo = DirectionConst.GetDirectionInfo(0, 0); if (directionInfo == DirectionInfoConst.LeftTopDirectionInfo) // 左上角 { if (!CanPass(astarMapPath, p.x + 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut)) { return(false); } if (!CanPass(astarMapPath, p.x, p.y - 1, canPassObstacleTypes, canPassTerrainTypes, canOut)) { return(false); } } else if (directionInfo == DirectionInfoConst.RightTopDirectionInfo) // 右上角 { if (!CanPass(astarMapPath, p.x - 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut)) { return(false); } if (!CanPass(astarMapPath, p.x, p.y - 1, canPassObstacleTypes, canPassTerrainTypes, canOut)) { return(false); } } else if (directionInfo == DirectionInfoConst.RightBottomDirectionInfo) // 右下角 { if (!CanPass(astarMapPath, p.x - 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut)) { return(false); } if (!CanPass(astarMapPath, p.x, p.y + 1, canPassObstacleTypes, canPassTerrainTypes, canOut)) { return(false); } } else if (directionInfo == DirectionInfoConst.LeftBottomDirectionInfo) // 左下角 { if (!CanPass(astarMapPath, p.x + 1, p.y, canPassObstacleTypes, canPassTerrainTypes, canOut)) { return(false); } if (!CanPass(astarMapPath, p.x, p.y + 1, canPassObstacleTypes, canPassTerrainTypes, canOut)) { return(false); } } lp = p; } return(true); }