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;
}