private void addTet(Tet tet) { if (tet!=null && !isMarked(tet)) { mark(tet); if (tet.intersectsPlane(a,b,c,d)) _tets.add(tet); } } };
private void stackTet(Tet tet) { if (tet!=null && !isMarked(tet)) { mark(tet); _stack.add(tet); } } };
private Face getFaceOnHull(Tet tet) { ArrayList<Tet> stack = new ArrayList<Tet>(128); stack.add(tet); while (!stack.isEmpty()) { Tet t = stack.remove(stack.size()-1); mark(t); if (t._t0==null) return new Face(t,t._n0); if (t._t1==null) return new Face(t,t._n1); if (t._t2==null) return new Face(t,t._n2); if (t._t3==null) return new Face(t,t._n3); if (!isMarked(t._t0)) stack.add(t._t0); if (!isMarked(t._t1)) stack.add(t._t1); if (!isMarked(t._t2)) stack.add(t._t2); if (!isMarked(t._t3)) stack.add(t._t3); } return null; }
if (na==n0) { if (nb==n1 || nb==n2 || nb==n3 || t1!=null && !isMarked(t1) && (tet=findTet(t1,na,nb))!=null || t2!=null && !isMarked(t2) && (tet=findTet(t2,na,nb))!=null || t3!=null && !isMarked(t3) && (tet=findTet(t3,na,nb))!=null) return tet; } else if (na==n1) { if (nb==n3 || nb==n2 || nb==n0 || t3!=null && !isMarked(t3) && (tet=findTet(t3,na,nb))!=null || t2!=null && !isMarked(t2) && (tet=findTet(t2,na,nb))!=null || t0!=null && !isMarked(t0) && (tet=findTet(t0,na,nb))!=null) return tet; } else if (na==n2) { if (nb==n3 || nb==n0 || nb==n1 || t3!=null && !isMarked(t3) && (tet=findTet(t3,na,nb))!=null || t0!=null && !isMarked(t0) && (tet=findTet(t0,na,nb))!=null || t1!=null && !isMarked(t1) && (tet=findTet(t1,na,nb))!=null) return tet; } else if (na==n3) { if (nb==n1 || nb==n0 || nb==n2 || t1!=null && !isMarked(t1) && (tet=findTet(t1,na,nb))!=null || t0!=null && !isMarked(t0) && (tet=findTet(t0,na,nb))!=null || t2!=null && !isMarked(t2) && (tet=findTet(t2,na,nb))!=null) return tet; } else {
/** * If the point with specified (x,y,z) coordinates is nearer to the * specified node than the nearest node found so far, then replaces * the nearest node (and the node root) with the specified node. * Does nothing if the specified node is marked. * (Currently unused.) */ private void updateNodeNearest(double x, double y, double z, Node n) { if (!isMarked(n)) { mark(n); double d = distanceSquared(n,x,y,z); if (d<_dmin) { _dmin = d; _nmin = n; _nroot = n; } } }
Tet t3 = tet._t3; if (node==n0) { if (t1!=null && !isMarked(t1)) getTetNabors(node,t1,nabors); if (t2!=null && !isMarked(t2)) getTetNabors(node,t2,nabors); if (t3!=null && !isMarked(t3)) getTetNabors(node,t3,nabors); } else if (node==n1) { if (t3!=null && !isMarked(t3)) getTetNabors(node,t3,nabors); if (t2!=null && !isMarked(t2)) getTetNabors(node,t2,nabors); if (t0!=null && !isMarked(t0)) getTetNabors(node,t0,nabors); } else if (node==n2) { if (t3!=null && !isMarked(t3)) getTetNabors(node,t3,nabors); if (t0!=null && !isMarked(t0)) getTetNabors(node,t0,nabors); if (t1!=null && !isMarked(t1)) getTetNabors(node,t1,nabors); } else if (node==n3) { if (t1!=null && !isMarked(t1)) getTetNabors(node,t1,nabors); if (t0!=null && !isMarked(t0)) getTetNabors(node,t0,nabors); if (t2!=null && !isMarked(t2)) getTetNabors(node,t2,nabors);
Node na, Node nb, Node nc, Tet ta, Tet tb, Tet tc) if (!isMarked(na)) { mark(na); double da = distanceSquared(na,x,y,z); if (!isMarked(nb)) { mark(nb); double db = distanceSquared(nb,x,y,z); if (!isMarked(nc)) { mark(nc); double dc = distanceSquared(nc,x,y,z); if (ta!=null && !isMarked(ta)) findNodeNaborNearest(x,y,z,node,ta); if (tb!=null && !isMarked(tb)) findNodeNaborNearest(x,y,z,node,tb); if (tc!=null && !isMarked(tc)) findNodeNaborNearest(x,y,z,node,tc);
Node na, Node nb, Node nc, Tet ta, Tet tb, Tet tc) if (!isMarked(na)) { mark(na); double da = distanceToPlaneSquared(na,a,b,c,d); if (!isMarked(nb)) { mark(nb); double db = distanceToPlaneSquared(nb,a,b,c,d); if (!isMarked(nc)) { mark(nc); double dc = distanceToPlaneSquared(nc,a,b,c,d); if (ta!=null && !isMarked(ta)) findNodeNaborNearestPlane(a,b,c,d,node,ta); if (tb!=null && !isMarked(tb)) findNodeNaborNearestPlane(a,b,c,d,node,tb); if (tc!=null && !isMarked(tc)) findNodeNaborNearestPlane(a,b,c,d,node,tc);
private void addNode(TetMesh.Node node) { if (_mesh.isMarked(node)) return; _mesh.mark(node); _nodeList.add(node); NodeData data = data(node); data.volume = 0.0; } private boolean needTet(double xp, double yp, double zp, TetMesh.Tet tet) {
private void getDelaunayFacesOpposite( Node node, Node na, Node nb, Node nc, Tet ta, Tet tb, Tet tc) { if (!isMarked(na)) { mark(na); _nodeList.add(na); } if (!isMarked(nb)) { mark(nb); _nodeList.add(nb); } if (!isMarked(nc)) { mark(nc); _nodeList.add(nc); } getDelaunayFacesOpposite(node,ta); getDelaunayFacesOpposite(node,tb); getDelaunayFacesOpposite(node,tc); }
Node n3 = tet._n3; if (node==n0) { if (!isMarked(n1)) { mark(n1); list.add(n1,step); if (!isMarked(n2)) { mark(n2); list.add(n2,step); if (!isMarked(n3)) { mark(n3); list.add(n3,step); if (!isMarked(n0)) { mark(n0); list.add(n0,step); if (!isMarked(n2)) { mark(n2); list.add(n2,step); if (!isMarked(n3)) { mark(n3); list.add(n3,step); if (!isMarked(n0)) { mark(n0); list.add(n0,step);
Node n3 = tet._n3; if (node==n0) { if (!isMarked(n1)) { mark(n1); nabors.add(new Edge(tet,n1,node)); if (!isMarked(n2)) { mark(n2); nabors.add(new Edge(tet,n2,node)); if (!isMarked(n3)) { mark(n3); nabors.add(new Edge(tet,n3,node)); if (!isMarked(n0)) { mark(n0); nabors.add(new Edge(tet,n0,node)); if (!isMarked(n2)) { mark(n2); nabors.add(new Edge(tet,n2,node)); if (!isMarked(n3)) { mark(n3); nabors.add(new Edge(tet,n3,node)); if (!isMarked(n0)) { mark(n0); nabors.add(new Edge(tet,n0,node));
if (tet!=null && !isMarked(tet)) { mark(tet); killTet(tet);
if (tet!=null && !isMarked(tet)) { mark(tet); Node n0 = tet._n0;
/** * Beginning with a tet that contains a node located inside the * mesh, recursively adds Delaunay faces to the face set. * The tet marks must be cleared before calling this method. */ private void getDelaunayFacesInside(Node node, Tet tet) { if (tet!=null && !isMarked(tet)) { mark(tet); Node n0 = tet._n0; Node n1 = tet._n1; Node n2 = tet._n2; Node n3 = tet._n3; if (inSphere(n0,n1,n2,n3,node)) { killTet(tet); Tet t0 = tet._t0; Tet t1 = tet._t1; Tet t2 = tet._t2; Tet t3 = tet._t3; _faceSet.addMate(tet,n0); _faceSet.addMate(tet,n1); _faceSet.addMate(tet,n2); _faceSet.addMate(tet,n3); getDelaunayFacesInside(node,t0); getDelaunayFacesInside(node,t1); getDelaunayFacesInside(node,t2); getDelaunayFacesInside(node,t3); } } }
private boolean needTet(double xp, double yp, double zp, TetMesh.Tet tet) { if (tet==null || _mesh.isMarked(tet)) return false; TetMesh.Node na = tet.nodeA(); TetMesh.Node nb = tet.nodeB(); TetMesh.Node nc = tet.nodeC(); TetMesh.Node nd = tet.nodeD(); double xa = na.xp(), ya = na.yp(), za = na.zp(); double xb = nb.xp(), yb = nb.yp(), zb = nb.zp(); double xc = nc.xp(), yc = nc.yp(), zc = nc.zp(); double xd = nd.xp(), yd = nd.yp(), zd = nd.zp(); return Geometry.inSphere(xa,ya,za,xb,yb,zb,xc,yc,zc,xd,yd,zd,xp,yp,zp)>0.0; }
private void processTetNabor( double xp, double yp, double zp, double xt, double yt, double zt, TetMesh mesh, TetMesh.Tet ta, TetMesh.Node nb, TetMesh.Node nc, TetMesh.Node nd) { boolean saveFace = true; if (ta!=null && mesh.isMarked(ta)) { ta.centerSphere(_xyz); double xa = _xyz[0]-xp, ya = _xyz[1]-yp, za = _xyz[2]-zp; double xb = nb.xp()-xp, yb = nb.yp()-yp, zb = nb.zp()-zp; double xd = nd.xp()-xp, yd = nd.yp()-yp, zd = nd.zp()-zp; double xc = nc.xp()-xp, yc = nc.yp()-yp, zc = nc.zp()-zp; double xbd = xb+xd, ybd = yb+yd, zbd = zb+zd; double xdc = xd+xc, ydc = yd+yc, zdc = zd+zc; double xcb = xc+xb, ycb = yc+yb, zcb = zc+zb; double xyz = yt*za-ya*zt, yzx = zt*xa-za*xt, zxy = xt*ya-xa*yt; accumulate(nb,xbd*xyz+ybd*yzx+zbd*zxy); accumulate(nd,xdc*xyz+ydc*yzx+zdc*zxy); accumulate(nc,xcb*xyz+ycb*yzx+zcb*zxy); saveFace = false; } if (saveFace) addFace(xp,yp,zp,xt,yt,zt,nb,nc,nd); }
if (tet!=null && !isMarked(tet)) { mark(tet); Node n0 = tet._n0;
if (tet!=null && !isMarked(tet)) { mark(tet); Node n0 = tet._n0;