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); }
/** * Appends the face nabors of the specified node to the specified list. * @param node the node for which to get nabors. * @param nabors the list to which nabors are appended. */ public synchronized void getFaceNabors(Node node, FaceList nabors) { clearFaceMarks(); getFaceNabors(node,node._face,nabors); }
private void init(Face face) { trace("init: face="+face); trace(" meshFace A="+face._meshFace.nodeA()); trace(" meshFace B="+face._meshFace.nodeB()); trace(" meshFace C="+face._meshFace.nodeC()); face._faceA = null; face._faceB = null; face._faceC = null; Node nodeA = face.nodeA(); Node nodeB = face.nodeB(); Node nodeC = face.nodeC(); nodeA.setFace(face); nodeB.setFace(face); nodeC.setFace(face); Edge edgeCB = makeEdge(nodeC,nodeB,face); Edge edgeBA = makeEdge(nodeB,nodeA,face); Edge edgeAC = makeEdge(nodeA,nodeC,face); nodeA.setEdgeBefore(edgeBA); nodeB.setEdgeBefore(edgeCB); nodeC.setEdgeBefore(edgeAC); nodeA.setEdgeAfter(edgeAC); nodeB.setEdgeAfter(edgeBA); nodeC.setEdgeAfter(edgeCB); addEdge(edgeCB); addEdge(edgeBA); addEdge(edgeAC); addFace(face); }
Node nodeC = otherNode(face,nodeA,nodeB); if (!validForFace(nodeA,nodeB,nodeC)) { removeEdge(edge); addEdge(edge); return true; extend(edge,face); return true; fillHole(edge,face); return true; fillEar(edge,face); return true; EdgeFace edgeFaceTwin = findTwin(edgeFace); if (edgeFaceTwin!=null) { Edge edgeTwin = edgeFaceTwin.edge; Face faceTwin = edgeFaceTwin.face; glue(edge,face,edgeTwin,faceTwin); return true; } else {
int nface = countFaces(); init(face); trace(" surf: stitching"); EdgeFace edgeFace = getBestEdgeFace(); while (edgeFace!=null && edgeFace.face!=null) { if (stitch(edgeFace)) { edgeFace = getBestEdgeFace(); } else { edgeFace = getNextEdgeFace(edgeFace); trace(" surf: removing faces"); ArrayList<TetMesh.Face> faceList = new ArrayList<TetMesh.Face>(); mfi = _faceSet.iterator(); trace(" surf: more faces = "+(countFaces()>nface)); return countFaces()>nface;
public void testCube() { TriSurf.Node n000 = new TriSurf.Node(0.0f,0.0f,0.0f); TriSurf.Node n001 = new TriSurf.Node(0.0f,0.0f,1.0f); TriSurf.Node n010 = new TriSurf.Node(0.0f,1.0f,0.0f); TriSurf.Node n011 = new TriSurf.Node(0.0f,1.0f,1.0f); TriSurf.Node n100 = new TriSurf.Node(1.0f,0.0f,0.0f); TriSurf.Node n101 = new TriSurf.Node(1.0f,0.0f,1.0f); TriSurf.Node n110 = new TriSurf.Node(1.0f,1.0f,0.0f); TriSurf.Node n111 = new TriSurf.Node(1.0f,1.0f,1.0f); TriSurf ts = new TriSurf(); ts.addNode(n000); ts.addNode(n001); ts.addNode(n010); ts.addNode(n011); assertEquals(2,ts.countFaces()); ts.addNode(n100); assertEquals(6,ts.countFaces()); ts.addNode(n101); ts.addNode(n110); ts.addNode(n111); assertEquals(12,ts.countFaces()); TriSurf.Node[] nodes = {n000,n001,n010,n011,n100,n101,n110,n111}; ts.removeNodes(nodes); ts.addNodes(nodes); assertEquals(12,ts.countFaces()); } }
private void fillHole(Edge edge, Face face) { trace("fillHole: 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()); Edge edgeAB = edge; Edge edgeBC = edge.edgeAfter(); Node nodeB = edgeBC.nodeA(); Node nodeC = edgeCA.nodeA(); linkFaces(face,nodeA,faceBC,otherNode(faceBC,nodeB,nodeC)); linkFaces(face,nodeB,faceCA,otherNode(faceCA,nodeA,nodeC)); linkFaces(face,nodeC,faceAB,otherNode(faceAB,nodeA,nodeB)); nodeA.setEdgeBefore(null); nodeB.setEdgeBefore(null); nodeB.setEdgeAfter(null); nodeC.setEdgeAfter(null); removeEdge(edgeAB); removeEdge(edgeBC); removeEdge(edgeCA); addFace(face);
Node nodeA = edge.nodeA(); Node nodeB = edge.nodeB(); Node nodeC = otherNode(face,nodeA,nodeB); assert nodeA.isOnBoundary(); assert nodeB.isOnBoundary(); Edge edgeTwin = node1.edgeAfter(); assert nodeC==edgeTwin.nodeB(); removeEdge(edgeTwin); EdgeFace edgeFaceTwin = addEdge(edgeTwin); Face faceTwin = edgeFaceTwin.face; double gradeTwin = edgeFaceTwin.grade; if (faceTwin!=null && nodesInOrder(faceTwin,node1,nodeC,nodeB) && gradeTwin>grade) return edgeFaceTwin; Edge edgeTwin = node2.edgeBefore(); assert nodeC==edgeTwin.nodeA(); removeEdge(edgeTwin); EdgeFace edgeFaceTwin = addEdge(edgeTwin); Face faceTwin = edgeFaceTwin.face; double gradeTwin = edgeFaceTwin.grade; if (faceTwin!=null && nodesInOrder(faceTwin,node2,nodeA,nodeC) && gradeTwin>grade) return edgeFaceTwin;
private void fillEar(Edge edge, Face face) { trace("fillEar: 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()); Node nodeA = edge.nodeA(); Node nodeB = edge.nodeB(); Node nodeC = otherNode(face,nodeA,nodeB); Edge edge1 = nodeC.edgeBefore(); Edge edge2 = nodeC.edgeAfter(); 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); nodeB.setEdgeBefore(edgeCB); nodeA.setEdgeAfter(null); nodeA.setEdgeBefore(null); removeEdge(edge); removeEdge(edge2); addFace(face); 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);
trace("glue: 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()); trace(" meshEdgeTwin A="+edgeTwin._meshEdge.nodeA()); trace(" meshEdgeTwin B="+edgeTwin._meshEdge.nodeB()); trace(" meshFaceTwin A="+faceTwin._meshFace.nodeA()); 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(); assert nodeB.isOnBoundary(); removeEdge(edge); removeEdge(edgeTwin); addFace(face); addFace(faceTwin); nodeA.setEdgeAfter(null); nodeD.setEdgeAfter(null); removeEdge(edgeDA); Edge edgeAD = makeEdge(nodeA,nodeD,faceTwin); nodeA.setEdgeAfter(edgeAD); nodeD.setEdgeBefore(edgeAD);