2 protected Tuple center;
3 protected Node centerNode;
4 protected Element centerElement;
6 protected LinkedList frontier;
7 protected Subgraph pre = new Subgraph();
8 protected Subgraph post = new Subgraph();
9 private final EdgeGraph graph;
10 protected HashSet connections;
12 public Cavity(EdgeGraph mesh) {
15 connections = new HashSet();
16 frontier = new LinkedList();
19 public Subgraph getPre() {
23 public Subgraph getPost() {
27 public void triggerAbort() {
30 public void triggerBorderConflict() {
33 public void initialize(Node node) {
37 frontier = new LinkedList();
39 for (centerElement = (Element) getNodeData(centerNode); graph.containsNode(centerNode)
40 && centerElement.isObtuse();) {
41 Edge_d oppositeEdge = getOpposite(centerNode);
42 if (getSource(oppositeEdge) == centerNode)
43 centerNode = getDest(oppositeEdge);
45 centerNode = getSource(oppositeEdge);
46 centerElement = (Element) getNodeData(centerNode);
47 if (centerNode == null)
51 center = centerElement.center();
52 dim = centerElement.getDim();
53 pre.addNode(centerNode);
54 frontier.addLast(centerNode);
57 private Edge_d getOpposite(Node node) {
58 Element element = (Element) graph.getNodeData(node);
60 // Don't think we'd run into it but..
62 // if(neighbors.size() != 3)
63 // throw new Error(String.format("neighbors %d", new Object[] {
64 // Integer.valueOf(neighbors.size())
67 int cntOutNeighbors = 0;
69 for (Iterator iterator = graph.getOutNeighbors(node); iterator.hasNext();) {
71 Node neighbor = (Node) iterator.next();
72 Edge_d edge = graph.getEdge(node, neighbor);
73 ElementEdge edge_data = (ElementEdge) graph.getEdgeData(edge);
74 if (element.getObtuse().notEquals(edge_data.getPoint(0))
75 && element.getObtuse().notEquals(edge_data.getPoint(1)))
79 System.out.println("Error: \"Edge\" in Cavity.java getOpposite(Node)");
80 System.out.println(" tri="+element+" has "+cntOutNeighbors+" out-neighbors");
81 System.out.println(" obtuse="+element.getObtuse());
83 return null; // it's here so the compiler doesn't complain.
86 public boolean isMember(Node node) {
87 Element element = (Element) getNodeData(node);
88 return element.inCircle(center);
92 while (frontier.size() != 0) {
93 Node curr = (Node) frontier.removeFirst();
94 for (Iterator iterator = getOutNeighbors(curr); iterator.hasNext();) {
95 Node next = (Node) iterator.next();
96 Element nextElement = (Element) getNodeData(next);
97 Edge_d edge = getEdge(curr, next);
98 if ((dim != 2 || nextElement.getDim() != 2 || next == centerNode) && isMember(next)) {
99 if (nextElement.getDim() == 2 && dim != 2) {
104 if (!pre.existsNode(next)) {
107 frontier.addLast(next);
109 } else if (!connections.contains(edge)) {
110 connections.add(edge);
118 public void update() {
119 if (centerElement.getDim() == 2) {
120 Element ele1 = new Element(center, centerElement.getPoint(0));
121 Node node1 = graph.createNode(ele1);
123 Element ele2 = new Element(center, centerElement.getPoint(1));
124 Node node2 = graph.createNode(ele2);
128 for (HashMapIterator iterator = connections.iterator(); iterator.hasNext(); post.addNode(ne_node)) {
129 Edge_d conn = (Edge_d) iterator.next();
130 ElementEdge edge = (ElementEdge) getEdgeData(conn);
131 Element new_element = new Element(center, edge.getPoint(0), edge.getPoint(1));
132 ne_node = graph.createNode(new_element);
134 if (pre.existsNode(getDest(conn)))
135 ne_connection = getSource(conn);
137 ne_connection = getDest(conn);
138 ElementEdge new_edge =
139 new_element.getRelatedEdge((Element) getNodeData(ne_connection));
140 post.addEdge(createEdge(ne_node, ne_connection, new_edge));
142 // Collection postnodes = (Collection)post.getNodes().clone();
143 LinkedList postnodes = new LinkedList();
144 for (Iterator it = post.getNodes().iterator(); it.hasNext();) {
145 postnodes.addLast(it.next());
148 for (Iterator iterator1 = postnodes.iterator(); iterator1.hasNext();) {
149 Node node = (Node) iterator1.next();
150 Element element = (Element) getNodeData(node);
151 if (element.isRelated(new_element)) {
152 ElementEdge ele_edge = new_element.getRelatedEdge(element);
153 post.addEdge(createEdge(ne_node, node, ele_edge));
159 private Object getNodeData(Node n) {
160 return ((EdgeGraphNode) n).data;
163 public Node getSource(Edge_d e) {
164 return ((GraphEdge) e).getSrc();
167 public Node getDest(Edge_d e) {
168 return ((GraphEdge) e).getDest();
171 public Edge_d getEdge(Node src, Node dest) {
172 return ((EdgeGraphNode) src).getOutEdge((EdgeGraphNode) dest);
176 public Edge_d createEdge(Node src, Node dest, Object e) {
177 return new GraphEdge((EdgeGraphNode) src, (EdgeGraphNode) dest, e);
180 public Iterator getOutNeighbors(Node src) {
181 return ((EdgeGraphNode) src).getOutNeighbors();
184 public Object getEdgeData(Edge_d e) {
185 return ((GraphEdge) e).d;