From 052ee1f9c0b9e2bc8bbd4cf135ae45fed7422023 Mon Sep 17 00:00:00 2001 From: luxiaotao1123 <t1341870251@163.com> Date: 星期一, 28 十月 2024 10:36:28 +0800 Subject: [PATCH] # --- zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java | 230 ++------------------------------------------------------- 1 files changed, 10 insertions(+), 220 deletions(-) diff --git a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java index 928cb40..95d0c00 100644 --- a/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java +++ b/zy-acs-manager/src/main/java/com/zy/acs/manager/core/DispatcherTestController.java @@ -1,21 +1,15 @@ package com.zy.acs.manager.core; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.zy.acs.common.utils.GsonUtils; import com.zy.acs.framework.common.R; -import com.zy.acs.framework.common.SnowflakeIdWorker; -import com.zy.acs.manager.core.domain.Lane; -import com.zy.acs.manager.manager.entity.Code; -import com.zy.acs.manager.manager.entity.Route; -import com.zy.acs.manager.manager.service.CodeService; -import com.zy.acs.manager.manager.service.RouteService; +import com.zy.acs.manager.core.service.LaneService; +import com.zy.acs.manager.manager.entity.Task; +import com.zy.acs.manager.manager.service.TaskService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.*; -import java.util.stream.Collectors; +import java.util.List; /** * Created by vincent on 10/24/2024 @@ -25,219 +19,15 @@ public class DispatcherTestController { @Autowired - private CodeService codeService; + private LaneService laneService; @Autowired - private RouteService routeService; - @Autowired - private SnowflakeIdWorker snowflakeIdWorker; + private TaskService taskService; - @GetMapping("/dfs") - public R dfs() { - List<Lane> lanes = new ArrayList<>(); - List<Code> codeList = codeService.list(new LambdaQueryWrapper<Code>().eq(Code::getStatus, 1)); - Map<String, List<String>> adjacencyCodeMap = new HashMap<>(); - for (Code code : codeList) { - List<Long> adjacencyNode = routeService.getAdjacencyNode(code.getId()); - adjacencyCodeMap.put(code.getData(), adjacencyNode.stream().map(node -> ( - codeService.getById(node).getData() - )).collect(Collectors.toList())); - } - List<String> codeDataList = codeList.stream().map(Code::getData).collect(Collectors.toList()); -// System.out.println(codeDataList.toString()); -// System.out.println(adjacencyCodeMap.toString()); + @GetMapping("/lanes") + public R getLanes() { + List<Task> taskList = taskService.findTasksByLaneHash("4b81ebaedd8ed7662d37b63e20dec5dd089d4c32136b8826c6323839fe51938e"); - - Set<String> visited = new HashSet<>(); - - // 閬嶅巻鎵�鏈夎妭鐐癸紝瀵绘壘搴︽暟涓嶇瓑浜�2鐨勮妭鐐逛綔涓鸿捣鐐� - for (String codeData : codeDataList) { - if (adjacencyCodeMap.get(codeData).size() != 2) { - List<String> neighbors = adjacencyCodeMap.get(codeData); - for (String neighbor : neighbors) { - if (adjacencyCodeMap.get(neighbor).size() == 2 && !visited.contains(neighbor)) { - Lane lane = new Lane(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); - lane.getCodes().add(codeData); // 鍖呭惈璧风偣 - dfsCalcIncludingEnd(codeData, neighbor, lane, visited, adjacencyCodeMap); - lanes.add(lane); - } - } - } - } - - // 澶勭悊鐙珛鐨勫害鏁颁负2鐨勭幆璺垨鏈繛鎺ュ埌搴︽暟涓嶇瓑浜�2鐨勮妭鐐圭殑閮ㄥ垎 - for (String codeData : codeDataList) { - if (adjacencyCodeMap.get(codeData).size() == 2 && !visited.contains(codeData)) { - // 妫�鏌ユ槸鍚︿负鐜矾鐨勪竴閮ㄥ垎 - Lane lane = new Lane(String.valueOf(snowflakeIdWorker.nextId()).substring(3)); - dfsCalcForLoop(codeData, null, lane, visited, adjacencyCodeMap); - lanes.add(lane); - } - } - - /** - * 1.explore a dead end lane and checkout end point that is not dead point - * 2.if this point has two near points and one of those points which not in current lane was also have two near points too - * 3.then merge above two lane because they can connect each other - */ - Iterator<Lane> iterator = lanes.iterator(); - while (iterator.hasNext()) { - Lane lane = iterator.next(); - String[] endPoints = lane.queryEndPoints(); - if (null == endPoints) { - continue; - } - String startPoint = endPoints[0]; - String endPoint = endPoints[1]; - - boolean isDeadEndLane = false; - String deadEndPoint = null; - Integer anotherPointNearsCount = null; - if (adjacencyCodeMap.get(startPoint).size() == 1) { - isDeadEndLane = true; - deadEndPoint = startPoint; - anotherPointNearsCount = adjacencyCodeMap.get(endPoint).size(); - } - if (adjacencyCodeMap.get(endPoint).size() == 1) { - isDeadEndLane = true; - deadEndPoint = endPoint; - anotherPointNearsCount = adjacencyCodeMap.get(startPoint).size(); - } - - if (!isDeadEndLane) { - continue; - } - - if (anotherPointNearsCount == 2) { - String anotherPoint = deadEndPoint.equals(startPoint) ? endPoint : startPoint; - List<String> anotherPointNears = adjacencyCodeMap.get(anotherPoint); - for (String anotherPointNear : anotherPointNears) { - if (!lane.getCodes().contains(anotherPointNear) && adjacencyCodeMap.get(anotherPointNear).size() == 2) { - - for (Lane lane0 : lanes) { - if (lane0.getCodes().contains(anotherPointNear)) { - - lane0.getCodes().addAll(lane.getCodes()); - iterator.remove(); - - - Collections.shuffle(lane0.getCodes()); - System.out.println(lane0.getCodes().toString()); - for (String code : lane0.getCodes()) { - System.out.println("key: " + code + "; val" + adjacencyCodeMap.get(code).toString()); - } - lane0.sortUsingDfs(adjacencyCodeMap); - System.out.println(lane0.getCodes().toString()); - - - } - - } - - } - } - } - - } - - for (Lane lane : lanes) { - lane.removeInteraction(adjacencyCodeMap); - } - - lanes.removeIf(next -> next.getCodes().size() <= 2); - - System.out.println(GsonUtils.toJson(lanes)); - return R.ok().add(lanes); + return R.ok().add(laneService.search("00000010")); } - - private void dfsCalcIncludingEnd(String start, String current, Lane lane, Set<String> visited, Map<String, List<String>> adjacencyCodeMap) { - // 娣诲姞褰撳墠鑺傜偣 - lane.getCodes().add(current); - visited.add(current); - - List<String> neighbors = adjacencyCodeMap.get(current); - if (neighbors == null || neighbors.isEmpty()) { - return; - } - - for (String neighbor : neighbors) { - if (neighbor.equals(start)) { - continue; - } - - if (!visited.contains(neighbor)) { - int degree = adjacencyCodeMap.get(neighbor).size(); - if (degree == 2) { - if (isSameDirection(current, neighbor, start)) { - dfsCalcIncludingEnd(current, neighbor, lane, visited, adjacencyCodeMap); - } - } else { - // 缁堢偣鎴栨嫄寮偣锛屽寘鍚苟鍋滄 - lane.getCodes().add(neighbor); - visited.add(neighbor); - } - } - } - } - private void dfsCalcForLoop(String current, String parent, Lane lane, Set<String> visited, Map<String, List<String>> adjacencyCodeMap) { - lane.getCodes().add(current); - visited.add(current); - - List<String> neighbors = adjacencyCodeMap.get(current); - if (neighbors == null || neighbors.isEmpty()) { - return; - } - - for (String neighbor : neighbors) { - if (neighbor.equals(parent)) { - continue; - } - - if (!visited.contains(neighbor)) { - int degree = adjacencyCodeMap.get(neighbor).size(); - if (degree == 2) { - if (isSameDirection(current, neighbor, parent)) { - dfsCalcForLoop(current, neighbor, lane, visited, adjacencyCodeMap); - } - } else { - lane.getCodes().add(neighbor); - visited.add(neighbor); - } - } - } - } - - public boolean isSameDirection(String current, String neighbor, String parent) { - if (parent == null) { - return true; - } - - Code parentCode = codeService.selectByData(parent); - Code currentCode = codeService.selectByData(current); - Code neighborCode = codeService.selectByData(neighbor); - - double direction1 = calculateDirection(parentCode, currentCode); - double direction2 = calculateDirection(currentCode, neighborCode); - double angleDifference = Math.abs(direction1 - direction2); - - // 瑙勮寖鍖栬搴﹀樊 - angleDifference = Math.min(angleDifference, 2 * Math.PI - angleDifference); - - // 璁剧疆瑙掑害宸槇鍊间负3搴� - return angleDifference < Math.toRadians(3); - } - - /** - * 璁$畻涓や釜鐐逛箣闂寸殑鏂瑰悜瑙� - * - * @param from 璧风偣 - * @param to 缁堢偣 - * @return 鏂瑰悜瑙掞紙寮у害锛� - */ - public double calculateDirection(Code from, Code to) { - double deltaX = to.getX() - from.getX(); - double deltaY = to.getY() - from.getY(); - return Math.atan2(deltaY, deltaX); - } - } -- Gitblit v1.9.1