// 二叉路合并 public void mergerBinaryRoad() { for (NodeNew node : nodeList) { // node只连接两条路 if (node.roads.size() == 2) { RoadNew roadFirst = node.roads.get(0); RoadNew roadSecond = node.roads.get(1); if (node.canMerge() == true) { // 是否可以合并 RoadNew roadMergedFrom = roadSecond; // 被合并掉的道路 RoadNew roadMergedTo = roadFirst; // 合并后的新道路 // 头&头 if (roadFirst.startNode.equals(roadSecond.startNode)) { // 把点少的道路反转方向 if (roadFirst.coordinate.size() >= roadSecond.coordinate.size()) { Collections.reverse(roadSecond.coordinate); roadSecond.coordinate.remove(roadSecond.coordinate.size() - 1); roadSecond.coordinate.addAll(roadFirst.coordinate); roadFirst.coordinate = roadSecond.coordinate; roadFirst.startNode = roadSecond.endNode; roadFirst.startNode.roads.remove(roadSecond); roadSecond.delFlag = true; roadFirst.startNode.roads.add(roadFirst); roadFirst.startAngle30m = roadSecond.endAngle30m; roadFirst.startAngle60m = roadSecond.endAngle60m; } else { Collections.reverse(roadFirst.coordinate); roadFirst.coordinate.remove(roadFirst.coordinate.size() - 1); roadFirst.coordinate.addAll(roadSecond.coordinate); roadSecond.coordinate = roadFirst.coordinate; roadSecond.startNode = roadFirst.endNode; roadSecond.startNode.roads.remove(roadFirst); roadFirst.delFlag = true; roadSecond.startNode.roads.add(roadSecond); roadSecond.startAngle30m = roadFirst.endAngle30m; roadSecond.startAngle60m = roadFirst.endAngle60m; roadMergedFrom = roadFirst; roadMergedTo = roadSecond; } // 尾&尾 } else if (roadFirst.endNode.equals(roadSecond.endNode)) { // 把点少的道路反转方向 if (roadFirst.coordinate.size() >= roadSecond.coordinate.size()) { Collections.reverse(roadSecond.coordinate); roadFirst.coordinate.remove(roadFirst.coordinate.size() - 1); roadFirst.coordinate.addAll(roadSecond.coordinate); roadFirst.endNode = roadSecond.startNode; roadFirst.endNode.roads.remove(roadSecond); roadSecond.delFlag = true; roadFirst.endNode.roads.add(roadFirst); roadFirst.endAngle30m = roadSecond.startAngle30m; roadFirst.endAngle60m = roadSecond.startAngle60m; } else { Collections.reverse(roadFirst.coordinate); roadSecond.coordinate.remove(roadSecond.coordinate.size() - 1); roadSecond.coordinate.addAll(roadFirst.coordinate); roadSecond.endNode = roadFirst.startNode; roadSecond.endNode.roads.remove(roadFirst); roadFirst.delFlag = true; roadSecond.endNode.roads.add(roadSecond); roadSecond.endAngle30m = roadFirst.startAngle30m; roadSecond.endAngle60m = roadFirst.startAngle60m; roadMergedFrom = roadFirst; roadMergedTo = roadSecond; } // 头&尾 } else if (roadFirst.startNode.equals(roadSecond.endNode)) { roadFirst.startNode = roadSecond.startNode; roadFirst.startNode.roads.remove(roadSecond); roadSecond.delFlag = true; roadFirst.startNode.roads.add(roadFirst); roadSecond.coordinate.remove(roadSecond.coordinate.size() - 1); roadSecond.coordinate.addAll(roadFirst.coordinate); roadFirst.coordinate = roadSecond.coordinate; roadFirst.startAngle30m = roadSecond.startAngle30m; roadFirst.startAngle60m = roadSecond.startAngle60m; } else if (roadFirst.endNode.equals(roadSecond.startNode)) { roadFirst.endNode = roadSecond.endNode; roadFirst.endNode.roads.remove(roadSecond); roadSecond.delFlag = true; roadFirst.endNode.roads.add(roadFirst); roadFirst.coordinate.remove(roadFirst.coordinate.size() - 1); roadFirst.coordinate.addAll(roadSecond.coordinate); roadFirst.endAngle30m = roadSecond.endAngle30m; roadFirst.endAngle60m = roadSecond.endAngle60m; } else { System.err.println("二叉路合并时发生错误!"); } // 如果roadMergedTo是虚拟道理,要把roadMergedFrom的属性(长度、形状、拓扑关系除外)克隆过来 if (roadMergedTo.fow == defineFOW.JunctionLink) { roadMergedTo.copy(roadMergedFrom); } // 属性赋值 roadMergedTo.length += roadMergedFrom.length; roadMergedTo.lb.x = Math.min(roadMergedTo.lb.x, roadMergedFrom.lb.x); roadMergedTo.lb.y = Math.min(roadMergedTo.lb.y, roadMergedFrom.lb.y); roadMergedTo.rt.x = Math.max(roadMergedTo.rt.x, roadMergedFrom.rt.x); roadMergedTo.rt.y = Math.max(roadMergedTo.rt.y, roadMergedFrom.rt.y); // 添加删除标记 node.delFlag = true; } } } // System.out.println("--------------"); clearRoadList(); clearNodeList(); clearIntersectionList(); }