|  |  |  | 
|---|
|  |  |  | import com.zy.asrs.utils.Utils; | 
|---|
|  |  |  | import com.zy.common.model.MapNode; | 
|---|
|  |  |  | import com.zy.common.model.NavigateNode; | 
|---|
|  |  |  | import com.zy.common.model.enums.NavigationMapType; | 
|---|
|  |  |  | import com.zy.core.enums.ShuttleTaskModeType; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | import java.util.*; | 
|---|
|  |  |  | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public class NavigateUtils { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static List<NavigateNode> calc(String startPoint, String endPoint, Integer mapType) { | 
|---|
|  |  |  | public static List<NavigateNode> calc(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints) { | 
|---|
|  |  |  | //通过开始编号和结束编号获取对应的xy轴坐标 | 
|---|
|  |  |  | int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//开始节点 | 
|---|
|  |  |  | int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//结束节点 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | ArrayList<int[]> whiteList = new ArrayList<>();//设置计算节点的白名单 | 
|---|
|  |  |  | whiteList.add(startArr);//将开始节点设置为白名单,以防被过滤 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | //获取当前节点计算的层高,并赋值到每一个节点中 | 
|---|
|  |  |  | int lev = Utils.getLev(startPoint); | 
|---|
|  |  |  | 
|---|
|  |  |  | start.setFather(null); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | NavigateNode end = new NavigateNode(endArr[0], endArr[1]); | 
|---|
|  |  |  | NavigateSolution solution = new NavigateSolution(mapType, lev); | 
|---|
|  |  |  | NavigateSolution solution = new NavigateSolution(mapType, lev, whiteList, shuttlePoints); | 
|---|
|  |  |  | //开始节点,不纳入禁用节点内计算 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | NavigateNode res_node = solution.astarSearch(start, end); | 
|---|
|  |  |  | if (res_node == null) { | 
|---|
|  |  |  | System.out.println("未找到路径"); | 
|---|
|  |  |  | 
|---|
|  |  |  | //获取从x点到下一点的行走距离 | 
|---|
|  |  |  | public static Integer getXToNextDistance(NavigateNode xNode) { | 
|---|
|  |  |  | NavigateMapData mapData = new NavigateMapData(); | 
|---|
|  |  |  | List<List<MapNode>> lists = mapData.getJsonData(1); | 
|---|
|  |  |  | List<List<MapNode>> lists = mapData.getJsonData(NavigationMapType.NONE.id, null, null); | 
|---|
|  |  |  | if (lists != null) { | 
|---|
|  |  |  | MapNode mapNode = lists.get(xNode.getX()).get(xNode.getY()); | 
|---|
|  |  |  | if (mapNode != null) { | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 获取中间点到目标点行走距离 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public static Integer getMiddleToDistDistance(List<NavigateNode> path) { | 
|---|
|  |  |  | //中间路径 | 
|---|
|  |  |  | NavigateNode middlePath = path.get(path.size() - 2); | 
|---|
|  |  |  | return middlePath.getMoveDistance(); | 
|---|
|  |  |  | public static Integer getMiddleToDistDistance(List<NavigateNode> path, NavigateNode middlePath) { | 
|---|
|  |  |  | //最后一条节点不计算进行走距离 | 
|---|
|  |  |  | NavigateNode lastPath = path.get(path.size() - 1); | 
|---|
|  |  |  | //总距离 | 
|---|
|  |  |  | int allDistance = 0; | 
|---|
|  |  |  | boolean flag = false; | 
|---|
|  |  |  | for (NavigateNode navigateNode : path) { | 
|---|
|  |  |  | if (!flag && navigateNode.equals(middlePath)) { | 
|---|
|  |  |  | flag = true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (navigateNode.equals(lastPath)) { | 
|---|
|  |  |  | continue;//最后一条节点不计算进行走距离 | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | if (flag) { | 
|---|
|  |  |  | allDistance += navigateNode.getMoveDistance(); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return allDistance; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 检测路径是否可用(可走) | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | public static boolean checkPathIsAvailable(List<NavigateNode> path, Integer shuttleNo, Integer lev) { | 
|---|
|  |  |  | NavigateSolution solution = new NavigateSolution(NavigationMapType.DFX.id, lev, null, Utils.getShuttlePoints(shuttleNo, lev));//获取无白名单地图(该地图包含小车坐标) | 
|---|
|  |  |  | int[][] map = solution.map; | 
|---|
|  |  |  | for (NavigateNode node : path) { | 
|---|
|  |  |  | int value = map[node.getX()][node.getY()]; | 
|---|
|  |  |  | if (value != 0 && value != 3) { | 
|---|
|  |  |  | return false; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return true; | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | public static void main(String[] args) { | 
|---|
|  |  |  | //计算路径 | 
|---|
|  |  |  | List<NavigateNode> calc = calc("1000901", "1800201", ShuttleTaskModeType.PAK_OUT.id); | 
|---|
|  |  |  | List<NavigateNode> calc = calc("1000901", "1800201", NavigationMapType.NONE.id, null); | 
|---|
|  |  |  | System.out.println(calc); | 
|---|
|  |  |  | System.out.println("------------------------"); | 
|---|
|  |  |  | //        List<NavigateNode> calc = calc("0501401", "0201801", "out"); | 
|---|