/** * 制作mesh边界的拓扑关系 * * @param bordNodeList :边界Node列表 */ public void makeBorderTopo(List<NodeNew> bordNodeList) { if (bordNodeList.size() == 0) { return; } Collections.sort( bordNodeList, new Comparator<NodeNew>() { @Override public int compare(NodeNew o1, NodeNew o2) { if (o1.point.x > o2.point.x) { return 1; } if (o1.point.x < o2.point.x) { return -1; } if (o1.point.y > o2.point.y) { return 1; } if (o1.point.y < o2.point.y) { return -1; } return 0; } }); // 合并相同边界Node NodeNew bordNode = bordNodeList.get(0); for (int i = 1; i < bordNodeList.size(); i++) { NodeNew node = bordNodeList.get(i); // if("97A062A001F0001382".equals(bordNode.nodeId)){ // System.out.println("test"); // } // 判断合并条件 && // 合并边界点 if (node.point.equals(bordNode.point) && bordNode.mergerBorderNode(node)) { node.delFlag = true; // 合并复杂路口对象 // if(复杂路口) if (node.isIntersectionNode() && bordNode.isIntersectionNode()) { // 在复杂路口内遍历,找到包含bordNode node bordNode.intersection.mergerIntersection(node.intersection); } } else { bordNode = node; } } clearRoadList(); clearNodeList(); clearIntersectionList(); }
// 二叉路合并 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(); }