Пример #1
0
 /**
  * 制作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();
 }
Пример #2
0
  // 二叉路合并
  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();
  }