| | |
| | | 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.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) { |
| | | //通过开始编号和结束编号获取对应的xy轴坐标 |
| | | int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//开始节点 |
| | | int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//结束节点 |
| | | |
| | | //获取当前节点计算的层高,并赋值到每一个节点中 |
| | | int lev = Utils.getLev(startPoint); |
| | | |
| | | //初始化开始节点 |
| | | NavigateNode start = new NavigateNode(startArr[0], startArr[1]); |
| | |
| | | while (res_node != null) { |
| | | 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(1); |
| | | 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 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 void main(String[] args) { |
| | | //计算路径 |
| | | List<NavigateNode> calc = calc("1000901", "0201801", "out"); |
| | | List<NavigateNode> calc = calc("1000901", "1800201", ShuttleTaskModeType.PAK_OUT.id); |
| | | 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); |
| | | } |
| | | |