public List find()

in diagram/src/main/java/jetbrains/jetpad/projectional/diagram/algorithm/orthogonal/DivergePointsFinder.java [24:72]


  public List<Vector> find(Set<List<Vector>> lines) {
    List<Vector> divergePoints = new ArrayList<>();

    Map<Vector, List<Vector>> directions = new HashMap<>();
    for (List<Vector> line: lines) {
      Vector prev = null;
      for (Vector p: line) {
        if (prev != null) {
          if (!directions.containsKey(prev)) {
            directions.put(prev, new ArrayList<Vector>());
          }
          directions.get(prev).add(p.sub(prev));
        }
        prev = p;
      }
    }
    for (List<Vector> line: lines) {
      Vector prev = null;
      for (Vector p: line) {
        if (prev != null) {
          Segment s = new Segment(prev, p);
          for (Vector dirP: directions.keySet()) {
            if (p.equals(dirP) || prev.equals(dirP)) continue;
            if (s.contains(dirP)) {
              directions.get(dirP).add(p.sub(dirP));
            }
          }
        }
        prev = p;
      }
    }

    for (Vector p: directions.keySet()) {
      List<Vector> dirs = directions.get(p);
      boolean isDevergePoint = false;
      for (int i = 0; i < dirs.size(); i++) {
        for (int j = i + 1; j < dirs.size(); j++) {
          Vector v1 = dirs.get(i);
          Vector v2 = dirs.get(j);
          isDevergePoint |= !(v1.isParallel(v2) && v1.dotProduct(v2) > 0);
        }
      }
      if (isDevergePoint) {
        divergePoints.add(p);
      }
    }

    return divergePoints;
  }