assert edge.isOnBoundary(); Node nodeA = edge.nodeA(); Node nodeB = edge.nodeB(); TetMesh.Face meshFace = edge.faceRight()._meshFace;
trace(" meshFaceTwin B="+faceTwin._meshFace.nodeB()); trace(" meshFaceTwin C="+faceTwin._meshFace.nodeC()); Node nodeA = edge.nodeA(); Node nodeB = edge.nodeB(); Node nodeC = otherNode(face,nodeA,nodeB); assert nodeA.isOnBoundary(); Node nodeD = nodeC.edgeAfter().nodeB(); assert nodeD.isOnBoundary(); addEdge(edgeCB); linkFaces(face,nodeB,faceTwin,nodeD); linkFaces(face,nodeC,edge.faceRight(),edge.nodeRight()); linkFaces(faceTwin,nodeA,edgeTwin.faceRight(),edgeTwin.nodeRight()); Node nodeD = nodeC.edgeBefore().nodeA(); assert nodeD.isOnBoundary(); addEdge(edgeAC); linkFaces(face,nodeA,faceTwin,nodeD); linkFaces(face,nodeC,edge.faceRight(),edge.nodeRight()); linkFaces(faceTwin,nodeB,edgeTwin.faceRight(),edgeTwin.nodeRight());
Face face = edgeFace.face; double grade = edgeFace.grade; Node nodeA = edge.nodeA(); Node nodeB = edge.nodeB(); Node nodeC = otherNode(face,nodeA,nodeB); assert nodeA.isOnBoundary(); assert nodeB.isOnBoundary(); assert nodeC.isOnBoundary(); Node node1 = nodeC.edgeBefore().nodeA(); assert node1!=nodeA; assert node1!=nodeB; if (node1.isOnBoundary()) { Edge edgeTwin = node1.edgeAfter(); assert nodeC==edgeTwin.nodeB(); removeEdge(edgeTwin); EdgeFace edgeFaceTwin = addEdge(edgeTwin); return edgeFaceTwin; Node node2 = nodeC.edgeAfter().nodeB(); assert node2!=nodeA; assert node2!=nodeB; if (node2.isOnBoundary()) { Edge edgeTwin = node2.edgeBefore(); assert nodeC==edgeTwin.nodeA(); removeEdge(edgeTwin); EdgeFace edgeFaceTwin = addEdge(edgeTwin);
trace(" meshFace B="+face._meshFace.nodeB()); trace(" meshFace C="+face._meshFace.nodeC()); Node nodeA = edge.nodeA(); Node nodeB = edge.nodeB(); Node nodeC = otherNode(face,nodeA,nodeB); Edge edge1 = nodeC.edgeBefore(); Edge edge2 = nodeC.edgeAfter(); Node node1 = edge1.nodeA(); Node node2 = edge2.nodeB(); if (node2==nodeA) { linkFaces(face,nodeC,edge.faceRight(),edge.nodeRight()); linkFaces(face,nodeB,edge2.faceRight(),edge2.nodeRight()); Edge edgeCB = makeEdge(nodeC,nodeB,face); nodeC.setEdgeAfter(edgeCB); addEdge(edgeCB); } else if (node1==nodeB) { linkFaces(face,nodeC,edge.faceRight(),edge.nodeRight()); linkFaces(face,nodeA,edge1.faceRight(),edge1.nodeRight()); Edge edgeAC = makeEdge(nodeA,nodeC,face); nodeA.setEdgeAfter(edgeAC);
trace(" meshFace C="+face._meshFace.nodeC()); Edge edgeAB = edge; Edge edgeBC = edge.edgeAfter(); Edge edgeCA = edge.edgeBefore(); assert edgeAB.isOnBoundary(); assert edgeBC.isOnBoundary(); assert edgeCA.isOnBoundary(); Face faceAB = edgeAB.faceRight(); Face faceBC = edgeBC.faceRight(); Face faceCA = edgeCA.faceRight(); Node nodeA = edgeAB.nodeA(); Node nodeB = edgeBC.nodeA(); Node nodeC = edgeCA.nodeA(); linkFaces(face,nodeA,faceBC,otherNode(faceBC,nodeB,nodeC)); linkFaces(face,nodeB,faceCA,otherNode(faceCA,nodeA,nodeC));
private void extend(Edge edge, Face face) { trace("extend: edge="+edge+" face="+face); trace(" meshEdge A="+edge._meshEdge.nodeA()); trace(" meshEdge B="+edge._meshEdge.nodeB()); trace(" meshFace A="+face._meshFace.nodeA()); trace(" meshFace B="+face._meshFace.nodeB()); trace(" meshFace C="+face._meshFace.nodeC()); assert edge.isOnBoundary(); Node nodeA = edge.nodeA(); Node nodeB = edge.nodeB(); Node nodeC = otherNode(face,nodeA,nodeB); nodeC.setFace(face); linkFaces(face,nodeC,edge.faceRight(),edge.nodeRight()); Edge edgeAC = makeEdge(nodeA,nodeC,face); Edge edgeCB = makeEdge(nodeC,nodeB,face); nodeA.setEdgeAfter(edgeAC); nodeB.setEdgeBefore(edgeCB); nodeC.setEdgeAfter(edgeCB); nodeC.setEdgeBefore(edgeAC); removeEdge(edge); addFace(face); addEdge(edgeAC); addEdge(edgeCB); }
/** * Returns a directed edge AB that references the specified nodes. * @param nodeA a node. * @param nodeB a node. * @return a directed edge that references the specified nodes; * or null, if nodes A and B are not adjacent in the surface. */ public synchronized Edge findEdge(Node nodeA, Node nodeB) { TetMesh.Edge meshEdge = findMeshEdge(nodeA,nodeB); Edge edge = getEdge(meshEdge); if (meshEdge!=null && edge==null) { Face face = findFace(nodeA,nodeB); if (face!=null) { Node nodeC = otherNode(face,nodeA,nodeB); if (nodesInOrder(face,nodeA,nodeB,nodeC)) edge = new Edge(meshEdge,face); } } return edge; }
public int compareTo(EdgeFace other) { double gradeOther = other.grade; if (grade<gradeOther) { return -1; } else if (grade>gradeOther) { return 1; } else { Edge edgeOther = other.edge; int hash = edge.hashCode(); int hashOther = edgeOther.hashCode(); if (hash<hashOther) { return -1; } else if (hash>hashOther) { return 1; } else { return 0; } } } }
private void validate() { assert _meshNode!=null; assert _face==null || _face.references(this); if (_edgeBefore==null) { assert _edgeAfter==null; } else { assert this==_edgeBefore.nodeB(); assert this==_edgeAfter.nodeA(); assert this==_edgeBefore.nodeA().edgeAfter().nodeB(); assert this==_edgeAfter.nodeB().edgeBefore().nodeA(); } assert _edgeBefore==null && _edgeAfter==null || _edgeBefore!=null && this==_edgeBefore.nodeB() && _edgeAfter!=null && this==_edgeAfter.nodeA(); } private void init() {
public Edge edgeBefore() { return nodeA()._edgeBefore; } public Edge edgeAfter() {
private Edge makeEdge(Node nodeA, Node nodeB, Face face) { TetMesh.Edge meshEdge = findMeshEdge(nodeA,nodeB); return (meshEdge!=null)?new Edge(meshEdge,face):null; }
public Edge mate() { return new Edge(_meshEdge.mate(),_faceRight); } public boolean isInSurface() {
public Edge edgeAfter() { return nodeB()._edgeAfter; } public Edge mate() {