3 protected Tuple center;
4 protected Node centerNode;
5 protected Element centerElement;
7 protected LinkedList frontier;
8 protected Subgraph pre;
9 protected Subgraph post;
10 private final UndirectedEdgeGraph graph;
11 protected HashSet connections;
13 public Cavity(UndirectedEdgeGraph mesh) {
16 connections = new HashSet();
17 frontier = new LinkedList();
19 post = new Subgraph();
22 public Subgraph getPre() {
26 public Subgraph getPost() {
30 public void triggerAbort() {
33 public void triggerBorderConflict() {
36 public void initialize(Node node) {
40 frontier = new LinkedList();
42 for (centerElement = (Element) getNodeData(centerNode); graph.containsNode(centerNode)
43 && centerElement.isObtuse();) {
44 Edge_d oppositeEdge = getOpposite(centerNode);
45 if (getSource(oppositeEdge) == centerNode)
46 centerNode = getDest(oppositeEdge);
48 centerNode = getSource(oppositeEdge);
49 centerElement = (Element) getNodeData(centerNode);
50 if (centerNode == null)
54 center = centerElement.center();
55 dim = centerElement.getDim();
56 pre.addNode(centerNode);
57 frontier.addLast(centerNode);
60 private Edge_d getOpposite(Node node) {
61 Element element = (Element) graph.getNodeData(node);
63 // Don't think we'd run into it but..
65 // if(neighbors.size() != 3)
66 // throw new Error(String.format("neighbors %d", new Object[] {
67 // Integer.valueOf(neighbors.size())
70 int cntOutNeighbors = 0;
72 for (Iterator iterator = graph.getOutNeighbors(node); iterator.hasNext();) {
74 Node neighbor = (Node) iterator.next();
75 Edge_d edge = graph.getEdge(node, neighbor);
76 ElementEdge edge_data = (ElementEdge) graph.getEdgeData(edge);
77 if (element.getObtuse().notEquals(edge_data.getPoint(0))
78 && element.getObtuse().notEquals(edge_data.getPoint(1)))
82 System.out.println("Error: \"Edge\" in Cavity.java getOpposite(Node)");
83 System.out.println(" tri="+element+" has "+cntOutNeighbors+" out-neighbors");
84 System.out.println(" obtuse="+element.getObtuse());
86 return null; // it's here so the compiler doesn't complain.
89 public boolean isMember(Node node) {
90 Element element = (Element) getNodeData(node);
91 return element.inCircle(center);
95 while (frontier.size() != 0) {
96 Node curr = (Node) frontier.removeFirst();
97 for (Iterator iterator = getOutNeighbors(curr); iterator.hasNext();) {
98 Node next = (Node) iterator.next();
99 Element nextElement = (Element) getNodeData(next);
100 Edge_d edge = getEdge(curr, next);
101 if ((dim != 2 || nextElement.getDim() != 2 || next == centerNode) && isMember(next)) {
102 if (nextElement.getDim() == 2 && dim != 2) {
107 if (!pre.existsNode(next)) {
110 frontier.addLast(next);
112 } else if (!connections.contains(edge)) {
113 connections.add(edge);
121 public void update() {
122 if (centerElement.getDim() == 2) {
123 Element ele1 = new Element(center, centerElement.getPoint(0));
124 Node node1 = graph.createNode(ele1);
126 Element ele2 = new Element(center, centerElement.getPoint(1));
127 Node node2 = graph.createNode(ele2);
131 for (HashMapIterator iterator = connections.iterator(); iterator.hasNext(); post.addNode(ne_node)) {
132 Edge_d conn = (Edge_d) iterator.next();
133 ElementEdge edge = (ElementEdge) getEdgeData(conn);
134 Element new_element = new Element(center, edge.getPoint(0), edge.getPoint(1));
135 ne_node = graph.createNode(new_element);
137 if (pre.existsNode(getDest(conn)))
138 ne_connection = getSource(conn);
140 ne_connection = getDest(conn);
141 ElementEdge new_edge =
142 new_element.getRelatedEdge((Element) getNodeData(ne_connection));
143 post.addEdge(createEdge(ne_node, ne_connection, new_edge));
145 // Collection postnodes = (Collection)post.getNodes().clone();
146 LinkedList postnodes = new LinkedList();
147 for (Iterator it = post.getNodes().iterator(); it.hasNext();) {
148 postnodes.addLast(it.next());
151 for (Iterator iterator1 = postnodes.iterator(); iterator1.hasNext();) {
152 Node node = (Node) iterator1.next();
153 Element element = (Element) getNodeData(node);
154 if (element.isRelated(new_element)) {
155 ElementEdge ele_edge = new_element.getRelatedEdge(element);
156 post.addEdge(createEdge(ne_node, node, ele_edge));
162 private Object getNodeData(Node n) {
163 return ((EdgeGraphNode) n).data;
166 public Node getSource(Edge_d e) {
167 return ((GraphEdge) e).getSrc();
170 public Node getDest(Edge_d e) {
171 return ((GraphEdge) e).getDest();
174 public Edge_d getEdge(Node src, Node dest) {
175 return ((EdgeGraphNode) src).getOutEdge((EdgeGraphNode) dest);
179 public Edge_d createEdge(Node src, Node dest, Object e) {
180 return new GraphEdge((EdgeGraphNode) src, (EdgeGraphNode) dest, e);
183 public Iterator getOutNeighbors(Node src) {
184 return ((EdgeGraphNode) src).getOutNeighbors();
187 public Object getEdgeData(Edge_d e) {
188 return ((GraphEdge) e).d;