4fb29fa4b7c3fe70f5f0b3916e0682e4e066d149
[IRC.git] / Robust / src / Benchmarks / oooJava / DelaunayRefinement / Cavity.java
1 import java.util.*;
2
3 public class Cavity {
4         
5     public Cavity(EdgeGraph mesh) {
6         center = null;
7         graph = mesh;
8     }
9         
10     public Subgraph getPre() {
11         return pre;
12     }
13         
14     public Subgraph getPost() {
15         return post;
16     }
17         
18     public void triggerAbort() {
19     }
20         
21     public void triggerBorderConflict() {
22     }
23         
24     public void initialize(Node node) {
25         pre.reset();
26         post.reset();
27         connections.clear();
28         frontier.clear();
29         centerNode = node;
30         for(centerElement = (Element)graph.getNodeData(centerNode); graph.containsNode(centerNode) && centerElement.isObtuse();) {
31             Edge oppositeEdge = getOpposite(centerNode);
32             if(graph.getSource(oppositeEdge) == centerNode)
33                 centerNode = graph.getDest(oppositeEdge);
34             else
35                 centerNode = graph.getSource(oppositeEdge);
36             centerElement = (Element)graph.getNodeData(centerNode);
37             if(centerNode == null)
38                 System.exit(-1);
39         }
40                 
41         center = centerElement.center();
42         dim = centerElement.getDim();
43         pre.addNode(centerNode);
44         frontier.add(centerNode);
45     }
46         
47     private Edge getOpposite(Node node) {
48         Element element = (Element)graph.getNodeData(node);
49         Collection neighbors = graph.getOutNeighbors(node);
50         if(neighbors.size() != 3)
51             throw new Error(String.format("neighbors %d", new Object[] {
52                                                                                   Integer.valueOf(neighbors.size())
53                                                                                   }));
54         for(Iterator iterator = neighbors.iterator(); iterator.hasNext();) {
55             Node neighbor = (Node)iterator.next();
56             Edge edge = graph.getEdge(node, neighbor);
57             Element.Edge edge_data = (Element.Edge)graph.getEdgeData(edge);
58             if(element.getObtuse().notEquals(edge_data.getPoint(0)) && element.getObtuse().notEquals(edge_data.getPoint(1)))
59                 return edge;
60         }
61                 
62         throw new Error("edge");
63     }
64         
65     public boolean isMember(Node node) {
66         Element element = (Element)graph.getNodeData(node);
67         return element.inCircle(center);
68     }
69         
70     public void build() {
71         while(frontier.size() != 0)  {
72             Node curr = (Node)frontier.poll();
73             Collection neighbors = graph.getOutNeighbors(curr);
74             for(Iterator iterator = neighbors.iterator(); iterator.hasNext();) {
75                 Node next = (Node)iterator.next();
76                 Element nextElement = (Element)graph.getNodeData(next);
77                 Edge edge = graph.getEdge(curr, next);
78                 if((dim != 2 || nextElement.getDim() != 2 || next == centerNode) && isMember(next)) {
79                     if(nextElement.getDim() == 2 && dim != 2) {
80                         initialize(next);
81                         build();
82                         return;
83                     }
84                     if(!pre.existsNode(next)) {
85                         pre.addNode(next);
86                         pre.addEdge(edge);
87                         frontier.add(next);
88                     }
89                 } else
90                                         if(!connections.contains(edge)) {
91                                                 connections.add(edge);
92                                                 pre.addBorder(next);
93                                         }
94             }
95                         
96         }
97     }
98         
99     public void update() {
100         if(centerElement.getDim() == 2) {
101             Element ele1 = new Element(center, centerElement.getPoint(0));
102             Node node1 = graph.createNode(ele1);
103             post.addNode(node1);
104             Element ele2 = new Element(center, centerElement.getPoint(1));
105             Node node2 = graph.createNode(ele2);
106             post.addNode(node2);
107         }
108         Node ne_node;
109         for(Iterator iterator = connections.iterator(); iterator.hasNext(); post.addNode(ne_node)) {
110             Edge conn = (Edge)iterator.next();
111             Element.Edge edge = (Element.Edge)graph.getEdgeData(conn);
112             Element new_element = new Element(center, edge.getPoint(0), edge.getPoint(1));
113             ne_node = graph.createNode(new_element);
114             Node ne_connection;
115             if(pre.existsNode(graph.getDest(conn)))
116                 ne_connection = graph.getSource(conn);
117             else
118                 ne_connection = graph.getDest(conn);
119             Element.Edge new_edge = new_element.getRelatedEdge((Element)graph.getNodeData(ne_connection));
120             post.addEdge(graph.createEdge(ne_node, ne_connection, new_edge));
121             Collection postnodes = (Collection)post.getNodes().clone();
122             for(Iterator iterator1 = postnodes.iterator(); iterator1.hasNext();) {
123                 Node node = (Node)iterator1.next();
124                 Element element = (Element)graph.getNodeData(node);
125                 if(element.isRelated(new_element)) {
126                     Element.Edge ele_edge = new_element.getRelatedEdge(element);
127                     post.addEdge(graph.createEdge(ne_node, node, ele_edge));
128                 }
129             }
130                         
131         }
132                 
133     }
134         
135     protected Tuple center;
136     protected Node centerNode;
137     protected Element centerElement;
138     protected int dim;
139     protected final Queue frontier = new LinkedList();
140     protected final Subgraph pre = new Subgraph();
141     protected final Subgraph post = new Subgraph();
142     private final EdgeGraph graph;
143     protected final HashSet connections = new HashSet();
144 }