From fcb71b8fc63f74cd00d3faa76c73f4c5566ee352 Mon Sep 17 00:00:00 2001 From: zc <zc@123> Date: 星期三, 07 五月 2025 23:23:09 +0800 Subject: [PATCH] 解决提升机在本层,而没有锁提升机的问题 --- src/main/java/com/zy/common/utils/NavigateUtils.java | 102 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 93 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/zy/common/utils/NavigateUtils.java b/src/main/java/com/zy/common/utils/NavigateUtils.java index 4e02d8e..f2ec05d 100644 --- a/src/main/java/com/zy/common/utils/NavigateUtils.java +++ b/src/main/java/com/zy/common/utils/NavigateUtils.java @@ -10,12 +10,16 @@ import com.zy.core.News; import com.zy.core.enums.MapNodeType; import com.zy.core.model.PythonSimilarityResult; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.io.BufferedReader; import java.io.InputStreamReader; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; /** * A*绠楁硶浣跨敤宸ュ叿 @@ -25,11 +29,16 @@ @Value("${pythonCalcPath}") private String pythonCalcPath; - @Value("${pythonCalcSimilarity}") private String pythonCalcSimilarity; + @Autowired + private NavigateMapData navigateMapData; public List<NavigateNode> calc(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints, List<int[]> whites) { + return calcJava(startPoint, endPoint, mapType, shuttlePoints, whites); + } + + public List<NavigateNode> calcJava(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints, List<int[]> whites) { //閫氳繃寮�濮嬬紪鍙峰拰缁撴潫缂栧彿鑾峰彇瀵瑰簲鐨剎y杞村潗鏍� int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//寮�濮嬭妭鐐� int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//缁撴潫鑺傜偣 @@ -42,17 +51,93 @@ //鑾峰彇褰撳墠鑺傜偣璁$畻鐨勫眰楂橈紝骞惰祴鍊煎埌姣忎竴涓妭鐐逛腑 int lev = Utils.getLev(startPoint); + NavigateSolution solution = new NavigateSolution(mapType, lev, whiteList, shuttlePoints); + int[][] map = solution.map; //鍒濆鍖栧紑濮嬭妭鐐� NavigateNode start = new NavigateNode(startArr[0], startArr[1]); //寮�濮嬭妭鐐规棤鐖惰妭鐐� start.setFather(null); + start.setNodeValue(map[startArr[0]][startArr[1]]); NavigateNode end = new NavigateNode(endArr[0], endArr[1]); - NavigateSolution solution = new NavigateSolution(mapType, lev, whiteList, shuttlePoints); + end.setNodeValue(map[endArr[0]][endArr[1]]); //寮�濮嬭妭鐐癸紝涓嶇撼鍏ョ鐢ㄨ妭鐐瑰唴璁$畻 - String pathStr = solution.astarSearch(start, end, pythonCalcPath); + NavigateNode res_node = solution.astarSearchJava(start, end); + if (res_node == null) { + News.error("{} dash {} can't find navigate path!", startPoint, endPoint); + return null; + } + + ArrayList<NavigateNode> list = new ArrayList<>(); + //娓叉煋 + NavigateNode fatherNode = null;//褰撳墠寰幆涓婁竴鑺傜偣锛岀敤浜庢嫄鐐硅绠� + 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());//鍒嗗埆浼犲叆褰撳墠鑺傜偣銆佺埗鑺傜偣銆佷笅涓�鑺傜偣 + //鍒ゆ柇褰撳墠鑺傜偣鏄惁涓烘嫄鐐� + if (Boolean.parseBoolean(result.get("result").toString())) { + //褰撳墠涓烘嫄鐐� + res_node.setIsInflectionPoint(true); + //鎷愮偣鏂瑰悜 + res_node.setDirection(result.get("direction").toString()); + } + list.add(res_node); + + fatherNode = res_node;//鎶婂綋鍓嶈妭鐐逛繚瀛樻垚涓�涓埗鑺傜偣 + res_node = res_node.getFather();//杩唬鎿嶄綔 + } + + Collections.reverse(list); + + //灏嗘瘡涓妭鐐归噷闈㈢殑fatherNode鑷充负null(鏂逛究鍚庣画璁$畻鏃剁埗鑺傜偣杩囧瀵艰嚧鏄剧ず鐨勮妭鐐瑰お澶�) + for (NavigateNode navigateNode : list) { + //鐖惰妭鐐硅缃负null锛屼笉褰卞搷璁$畻缁撴灉锛屼笉褰卞搷鍚庣画鎿嶄綔銆� + //姝ゆ搷浣滀粎涓哄悗缁帓鏌ュ鐞嗘彁渚涜瑙夋柟渚裤�� + navigateNode.setFather(null); + } + + //璧峰鑺傜偣璁$畻鏂瑰悜 + String direction = calcDirection(list.get(0), list.get(1)); + NavigateNode startNode = list.get(0); + startNode.setDirection(direction); + //鏇存柊鑺傜偣鍒楄〃 + list.set(0, startNode); + return list; + } + + public List<NavigateNode> calcPython(String startPoint, String endPoint, Integer mapType, List<int[]> shuttlePoints, List<int[]> whites) { + //閫氳繃寮�濮嬬紪鍙峰拰缁撴潫缂栧彿鑾峰彇瀵瑰簲鐨剎y杞村潗鏍� + int[] startArr = NavigatePositionConvert.positionToXY(startPoint);//寮�濮嬭妭鐐� + int[] endArr = NavigatePositionConvert.positionToXY(endPoint);//缁撴潫鑺傜偣 + + ArrayList<int[]> whiteList = new ArrayList<>();//璁剧疆璁$畻鑺傜偣鐨勭櫧鍚嶅崟 + whiteList.add(startArr);//灏嗗紑濮嬭妭鐐硅缃负鐧藉悕鍗曪紝浠ラ槻琚繃婊� + if (whites != null && !whites.isEmpty()) { + whiteList.addAll(whites);//鎵归噺娣诲姞鐧藉悕鍗曡妭鐐� + } + + //鑾峰彇褰撳墠鑺傜偣璁$畻鐨勫眰楂橈紝骞惰祴鍊煎埌姣忎竴涓妭鐐逛腑 + int lev = Utils.getLev(startPoint); + NavigateSolution solution = new NavigateSolution(mapType, lev, whiteList, shuttlePoints); + int[][] map = solution.map; + + //鍒濆鍖栧紑濮嬭妭鐐� + NavigateNode start = new NavigateNode(startArr[0], startArr[1]); + start.setNodeValue(map[startArr[0]][startArr[1]]); + //寮�濮嬭妭鐐规棤鐖惰妭鐐� + start.setFather(null); + + NavigateNode end = new NavigateNode(endArr[0], endArr[1]); + end.setNodeValue(map[endArr[0]][endArr[1]]); + //寮�濮嬭妭鐐癸紝涓嶇撼鍏ョ鐢ㄨ妭鐐瑰唴璁$畻 + + String pathStr = solution.astarSearchPython(start, end, pythonCalcPath); if (pathStr == null) { News.error("{} dash {} can't find navigate path!", startPoint, endPoint); return null; @@ -106,7 +191,7 @@ } //鍒ゆ柇褰撳墠鑺傜偣鍒颁笅涓�涓妭鐐规槸鍚︿负鎷愮偣 - public HashMap<String,Object> searchInflectionPoint(NavigateNode currentNode, NavigateNode fatherNode, NavigateNode nextNode) { + public HashMap<String, Object> searchInflectionPoint(NavigateNode currentNode, NavigateNode fatherNode, NavigateNode nextNode) { HashMap<String, Object> map = new HashMap<>(); map.put("result", false);//鏄惁涓烘嫄鐐癸紝true锛氭嫄鐐癸紝false锛氱洿绾� // 绗竴涓偣鎴栫洿绾跨偣 @@ -136,7 +221,7 @@ if (currentNode.getX() - fatherNode.getX() > 0) { //澶т簬0锛屾柟鍚憈op direction = "top"; - }else { + } else { //灏忎簬0锛屾柟鍚慴ottom direction = "bottom"; } @@ -148,7 +233,7 @@ if (currentNode.getY() - fatherNode.getY() > 0) { //澶т簬0锛屾柟鍚憀eft direction = "left"; - }else { + } else { //灏忎簬0锛屾柟鍚憆ight direction = "right"; } @@ -272,8 +357,7 @@ * 妫�娴嬭矾寰勬槸鍚﹀彲鐢�(鍙蛋) */ public 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; + int[][] map = navigateMapData.getDataFromRedis(lev, NavigationMapType.DFX.id, null, Utils.getShuttlePoints(shuttleNo, lev)); for (NavigateNode node : path) { int value = map[node.getX()][node.getY()]; if (value != MapNodeType.NORMAL_PATH.id && value != MapNodeType.MAIN_PATH.id && value != MapNodeType.CHARGE.id && value != MapNodeType.CONVEYOR_CAR_GO.id) {//姣嶈建閬�3銆佸瓙杞ㄩ亾0銆佸厖鐢垫々5銆佸皬杞﹀彲璧拌緭閫佺珯 -- Gitblit v1.9.1