#
Junjie
7 天以前 141696efeb3598b2a8c62aada6e6b45734e56f11
src/main/java/com/zy/common/utils/NavigateUtils.java
@@ -7,7 +7,10 @@
import java.util.List;
import java.util.Map;
import com.zy.asrs.entity.BasStation;
import com.zy.asrs.service.BasStationService;
import com.zy.core.News;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.alibaba.fastjson.JSON;
@@ -28,7 +31,16 @@
@Component
public class NavigateUtils {
    public synchronized List<NavigateNode> calcByStationId(int lev, Integer startStationId, Integer endStationId) {
    @Autowired
    private BasStationService basStationService;
    public synchronized List<NavigateNode> calcByStationId(Integer startStationId, Integer endStationId) {
        BasStation startStation = basStationService.selectById(startStationId);
        if (startStation == null) {
            throw new CoolException("未找到该 起点 对应的站点数据");
        }
        Integer lev = startStation.getStationLev();
        NavigateSolution navigateSolution = new NavigateSolution();
        List<List<NavigateNode>> stationMap = navigateSolution.getStationMap(lev);
@@ -50,13 +62,10 @@
        }
        News.info("[WCS Debug] 站点路径计算完成,耗时:{}ms", System.currentTimeMillis() - startTime);
        if (allList.size() > 1) {
            System.out.println(JSON.toJSONString(allList));
        }
        startTime = System.currentTimeMillis();
        News.info("[WCS Debug] 站点路径权重开始分析,startStationId={},endStationId={}", startStationId, endStationId);
        List<NavigateNode> list = findStationBestPath(allList);
        News.info("[WCS Debug] 站点路径权重分析结束,startStationId={},endStationId={}", startStationId, endStationId);
        News.info("[WCS Debug] 站点路径权重分析完成,耗时:{}ms", System.currentTimeMillis() - startTime);
        //去重
        HashSet<Integer> set = new HashSet<>();
@@ -65,6 +74,20 @@
            JSONObject valuObject = JSON.parseObject(navigateNode.getNodeValue());
            if(set.add(valuObject.getInteger("stationId"))){
                fitlerList.add(navigateNode);
            }
        }
        for (int i = 0; i < fitlerList.size(); i++) {
            NavigateNode currentNode = fitlerList.get(i);
            currentNode.setIsInflectionPoint(false);
            NavigateNode nextNode = (i + 1 < fitlerList.size()) ? fitlerList.get(i + 1) : null;
            NavigateNode prevNode = (i - 1 >= 0) ? fitlerList.get(i - 1) : null;
            HashMap<String, Object> result = searchInflectionPoint(currentNode, nextNode, prevNode);
            if (Boolean.parseBoolean(result.get("result").toString())) {
                currentNode.setIsInflectionPoint(true);
                currentNode.setDirection(result.get("direction").toString());
            }
        }
@@ -98,8 +121,22 @@
        HashSet<NavigateNode> visited = new HashSet<>();
        int maxSteps = rgvTrackMap.size() * rgvTrackMap.get(0).size() + 5; // 安全上限
        int steps = 0;
        NavigateNode fatherNode = null;//当前循环上一节点,用于拐点计算
        while (res_node != null && visited.add(res_node) && steps++ < maxSteps) {
            res_node.setIsInflectionPoint(false);
            //寻找拐点
            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();//迭代操作
        }
        if (steps >= maxSteps) {
@@ -287,4 +324,56 @@
        }
        return best;
    }
    //判断当前节点到下一个节点是否为拐点
    public HashMap<String,Object> searchInflectionPoint(NavigateNode currentNode, NavigateNode fatherNode, NavigateNode nextNode) {
        HashMap<String, Object> map = new HashMap<>();
        map.put("result", false);//是否为拐点,true:拐点,false:直线
        // 第一个点或直线点
        if (fatherNode == null || nextNode == null || nextNode.getX() == fatherNode.getX() || nextNode.getY() == fatherNode.getY()) {
            return map;//不是拐点直接返回
        }
        //拐点方向
        String direction = calcDirection(currentNode, fatherNode);
        map.put("result", true);//拐点
        map.put("direction", direction);//拐点方向(从当前节点视角看的方向)
        return map;
    }
    /**
     * 计算方向
     */
    public String calcDirection(NavigateNode currentNode, NavigateNode fatherNode) {
        //拐点方向
        String direction = "";
        // 普通拐点
        //计算拐点方向
        if (fatherNode.getX() != currentNode.getX()) {
            //x轴数据有差异,判断x轴方向
            //当前节点X - 父节点X
            if (currentNode.getX() - fatherNode.getX() > 0) {
                //大于0,方向top
                direction = "top";
            }else {
                //小于0,方向bottom
                direction = "bottom";
            }
        }
        if (fatherNode.getY() != currentNode.getY()) {
            //y轴数据有差异,判断y轴方向
            //当前节点Y - 父节点Y
            if (currentNode.getY() - fatherNode.getY() > 0) {
                //大于0,方向left
                direction = "left";
            }else {
                //小于0,方向right
                direction = "right";
            }
        }
        return direction;
    }
}