5 public Cavity(EdgeGraph mesh) {
10 public Subgraph getPre() {
14 public Subgraph getPost() {
18 public void triggerAbort() {
21 public void triggerBorderConflict() {
24 public void initialize(Node 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);
35 centerNode = graph.getSource(oppositeEdge);
36 centerElement = (Element)graph.getNodeData(centerNode);
37 if(centerNode == null)
41 center = centerElement.center();
42 dim = centerElement.getDim();
43 pre.addNode(centerNode);
44 frontier.add(centerNode);
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())
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)))
62 throw new Error("edge");
65 public boolean isMember(Node node) {
66 Element element = (Element)graph.getNodeData(node);
67 return element.inCircle(center);
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) {
84 if(!pre.existsNode(next)) {
90 if(!connections.contains(edge)) {
91 connections.add(edge);
99 public void update() {
100 if(centerElement.getDim() == 2) {
101 Element ele1 = new Element(center, centerElement.getPoint(0));
102 Node node1 = graph.createNode(ele1);
104 Element ele2 = new Element(center, centerElement.getPoint(1));
105 Node node2 = graph.createNode(ele2);
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);
115 if(pre.existsNode(graph.getDest(conn)))
116 ne_connection = graph.getSource(conn);
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));
135 protected Tuple center;
136 protected Node centerNode;
137 protected Element centerElement;
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();