package org.visico.neighborhoodpss.deterioationindicator;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import delaunay_triangulation.Delaunay_Triangulation;
import delaunay_triangulation.Triangle_dt;
public class BuildingGraph {
Set<BuildingNode> nodes = new HashSet<BuildingNode>();
Set<BuildingEdge> edges = new HashSet<BuildingEdge>();
public void addNode(BuildingNode n) {
nodes.add(n);
}
public void addEdge(BuildingEdge e) {
if (nodes.contains(e.getStart()) == true && nodes.contains(e.getEnd()) == true)
edges.add(e);
else
System.out.println("Edge not added as nodes are not part of this network. Add nodes first!");
}
public Set<BuildingNode> getNodes() {
return nodes;
}
public Set<BuildingEdge> getEdges() {
return edges;
}
public void buildGraph() {
generateMesh();
}
public Set<BuildingNode> getNeighbors(BuildingNode node) {
Set<BuildingNode> neighbors = new HashSet<BuildingNode>();
for (BuildingEdge edge : edges) {
if (edge.start.equals(node))
neighbors.add(edge.end);
if (edge.end.equals(node))
neighbors.add(edge.start);
}
return neighbors;
}
private void generateMesh() {
// triangle mesh algorithm
// collect all center points
BuildingNode[] allNodes = new BuildingNode[nodes.size()];
Iterator<BuildingNode> nodeit = nodes.iterator();
int i = 0;
while (nodeit.hasNext()) {
allNodes[i] = nodeit.next();
i++;
}
Delaunay_Triangulation t = new Delaunay_Triangulation(allNodes);
Iterator<Triangle_dt> triangles = t.trianglesIterator();
while (triangles.hasNext()) {
Triangle_dt triangle = triangles.next();
// check whether this is a complete triangle
if (triangle.p1() == null || triangle.p2() == null || triangle.p3() == null)
continue;
BuildingEdge edge1 = new BuildingEdge((BuildingNode)triangle.p1(),
(BuildingNode)triangle.p2());
BuildingEdge edge2 = new BuildingEdge((BuildingNode)triangle.p2(),
(BuildingNode)triangle.p3());
BuildingEdge edge3 = new BuildingEdge((BuildingNode)triangle.p1(),
(BuildingNode)triangle.p3());
edges.add(edge1);
edges.add(edge2);
edges.add(edge3);
}
}
}