|  |  | 
 |  |  | package com.zy.common.utils; | 
 |  |  |  | 
 |  |  | 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, String 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); | 
 |  |  |  | 
 |  |  |         //初始化开始节点 | 
 |  |  |         NavigateNode start = new NavigateNode(startArr[0], startArr[1]); | 
 |  |  | 
 |  |  |         start.setFather(null); | 
 |  |  |  | 
 |  |  |         NavigateNode end = new NavigateNode(endArr[0], endArr[1]); | 
 |  |  |         NavigateSolution solution = new NavigateSolution(mapType); | 
 |  |  |         NavigateSolution solution = new NavigateSolution(mapType, lev, whiteList, shuttlePoints); | 
 |  |  |         //开始节点,不纳入禁用节点内计算 | 
 |  |  |  | 
 |  |  |         NavigateNode res_node = solution.astarSearch(start, end); | 
 |  |  |         if (res_node == null) { | 
 |  |  |             System.out.println("未找到路径"); | 
 |  |  | 
 |  |  |             //渲染 | 
 |  |  |             NavigateNode fatherNode = null;//当前循环上一节点,用于拐点计算 | 
 |  |  |             while (res_node != null) { | 
 |  |  |                 HashMap<String, Object> data = new HashMap<>(); | 
 |  |  |                 res_node.setDirection(null); | 
 |  |  |                 res_node.setIsInflectionPoint(false); | 
 |  |  |                 res_node.setZ(lev);//设置层高 | 
 |  |  |  | 
 |  |  |                 //寻找拐点 | 
 |  |  |                 HashMap<String, Object> result = searchInflectionPoint(res_node, fatherNode, res_node.getFather());//分别传入当前节点、父节点、下一节点 | 
 |  |  | 
 |  |  |     public static ArrayList<ArrayList<NavigateNode>> getSectionPath(List<NavigateNode> mapList) { | 
 |  |  |         ArrayList<ArrayList<NavigateNode>> list = new ArrayList<>(); | 
 |  |  |         ArrayList<NavigateNode> data = new ArrayList<>(); | 
 |  |  |         for (NavigateNode mapNode : mapList) { | 
 |  |  |         String direction = mapList.get(0).getDirection();//行走方向 | 
 |  |  |  | 
 |  |  |         for (int i = 0; i < mapList.size(); i++) { | 
 |  |  |             NavigateNode mapNode = mapList.get(i); | 
 |  |  |             boolean isInflectionPoint = mapNode.getIsInflectionPoint(); | 
 |  |  |             data.add(mapNode); | 
 |  |  |             if (isInflectionPoint) { | 
 |  |  |                 //拐点 | 
 |  |  |                 //分割数据 | 
 |  |  |                 list.add(data);//添加某一段数据 | 
 |  |  |                 direction = mapNode.getDirection();//更新行走方向 | 
 |  |  |                 data = new ArrayList<>(); | 
 |  |  |                 data.add(mapNode);//将拐点的终点,更新成下一段命令的起点坐标 | 
 |  |  |             }else { | 
 |  |  |                 //直行线路 | 
 |  |  |                 mapNode.setDirection(direction);//设置行走方向 | 
 |  |  |             } | 
 |  |  |             Integer distance = getXToNextDistance(mapNode);//获取当前点到下一点的行走距离 | 
 |  |  |             mapNode.setMoveDistance(distance); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //将最后一段数据添加进入 | 
 |  |  | 
 |  |  |         return list; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     //获取从x点到下一点的行走距离 | 
 |  |  |     public static Integer getXToNextDistance(NavigateNode xNode) { | 
 |  |  |         NavigateMapData mapData = new NavigateMapData(); | 
 |  |  |         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) { | 
 |  |  |                 switch (xNode.getDirection()) { | 
 |  |  |                     case "top": | 
 |  |  |                         return mapNode.getTop(); | 
 |  |  |                     case "bottom": | 
 |  |  |                         return mapNode.getBottom(); | 
 |  |  |                     case "left": | 
 |  |  |                         return mapNode.getLeft(); | 
 |  |  |                     case "right": | 
 |  |  |                         return mapNode.getRight(); | 
 |  |  |                 } | 
 |  |  |             } | 
 |  |  |             return 0; | 
 |  |  |         } | 
 |  |  |         return 0; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 根据原始节点结果,计算总行走距离 | 
 |  |  |      */ | 
 |  |  |     public static Integer getOriginPathAllDistance(List<NavigateNode> path) { | 
 |  |  |         ArrayList<ArrayList<NavigateNode>> sectionPath = NavigateUtils.getSectionPath(path); | 
 |  |  |         Integer allDistance = 0; | 
 |  |  |         for (ArrayList<NavigateNode> navigateNodes : sectionPath) { | 
 |  |  |             Integer distance = NavigateUtils.getCurrentPathAllDistance(navigateNodes); | 
 |  |  |             allDistance += distance; | 
 |  |  |         } | 
 |  |  |         return allDistance; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取当前路径总行走距离 | 
 |  |  |      */ | 
 |  |  |     public static Integer getCurrentPathAllDistance(List<NavigateNode> path) { | 
 |  |  |         if (path.size() == 1) { | 
 |  |  |             //路径只有一条数据,则直接返回行走距离 | 
 |  |  |             return path.get(0).getMoveDistance(); | 
 |  |  |         } | 
 |  |  |  | 
 |  |  |         //总距离 | 
 |  |  |         int allDistance = 0; | 
 |  |  |         for (int i = 0; i < path.size() - 1; i++) {//路径中最后一个节点不统计到总距离,最后一个节点并不会再行走 | 
 |  |  |             allDistance += path.get(i).getMoveDistance(); | 
 |  |  |         } | 
 |  |  |         return allDistance; | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     /** | 
 |  |  |      * 获取中间点到目标点行走距离 | 
 |  |  |      */ | 
 |  |  |     public static Integer getMiddleToDistDistance(List<NavigateNode> path) { | 
 |  |  |         //中间路径 | 
 |  |  |         NavigateNode middlePath = path.get(path.size() - 2); | 
 |  |  |         return middlePath.getMoveDistance(); | 
 |  |  |     } | 
 |  |  |  | 
 |  |  |     public static void main(String[] args) { | 
 |  |  |         //计算路径 | 
 |  |  |         List<NavigateNode> calc = calc("1000901", "0201801", "out"); | 
 |  |  |         List<NavigateNode> calc = calc("1000901", "1800201", NavigationMapType.NONE.id, null); | 
 |  |  |         System.out.println(calc); | 
 |  |  |         System.out.println("------------------------"); | 
 |  |  | //        List<NavigateNode> calc = calc("0501401", "0201801", "out"); | 
 |  |  |         //将路径分割成多段 | 
 |  |  |         ArrayList<ArrayList<NavigateNode>> data = getSectionPath(calc); | 
 |  |  |         for (ArrayList<NavigateNode> list : data) { | 
 |  |  |             Integer currentPathAllDistance = getCurrentPathAllDistance(list);//计算当前路径总距离 | 
 |  |  |             System.out.println(currentPathAllDistance); | 
 |  |  |             System.out.println(list); | 
 |  |  |         } | 
 |  |  |  |