| | |
| | | } |
| | | } |
| | | |
| | | 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()); |
| | | } |
| | | } |
| | | |
| | | return fitlerList; |
| | | } |
| | | |
| | |
| | | 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) { |
| | |
| | | } |
| | | 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; |
| | | } |
| | | } |