if (na==n0) { if (nb==n1 || nb==n2 || t1!=null && !isMarked(t1) && (tri=findTri(t1,na,nb))!=null || t2!=null && !isMarked(t2) && (tri=findTri(t2,na,nb))!=null) return tri; } else if (na==n1) { if (nb==n2 || nb==n0 || t2!=null && !isMarked(t2) && (tri=findTri(t2,na,nb))!=null || t0!=null && !isMarked(t0) && (tri=findTri(t0,na,nb))!=null) return tri; } else if (na==n2) { if (nb==n0 || nb==n1 || t0!=null && !isMarked(t0) && (tri=findTri(t0,na,nb))!=null || t1!=null && !isMarked(t1) && (tri=findTri(t1,na,nb))!=null) return tri; } else {
private void findNodeNaborNearest( double x, double y, Node node, Node na, Node nb, Tri ta, Tri tb) { if (!isMarked(na)) { mark(na); double da = distanceSquared(na,x,y); if (da<_dmin) { _dmin = da; _nmin = na; } } if (!isMarked(nb)) { mark(nb); double db = distanceSquared(nb,x,y); if (db<_dmin) { _dmin = db; _nmin = nb; } } if (ta!=null && !isMarked(ta)) findNodeNaborNearest(x,y,node,ta); if (tb!=null && !isMarked(tb)) findNodeNaborNearest(x,y,node,tb); }
/** * If the point with specified (x,y) 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, Node n) { if (!isMarked(n)) { mark(n); double d = distanceSquared(n,x,y); if (d<_dmin) { _dmin = d; _nmin = n; _nroot = n; } } }
Tri t2 = tri._t2; if (node==n0) { if (t1!=null && !isMarked(t1)) getTriNabors(node,t1,nabors); if (t2!=null && !isMarked(t2)) getTriNabors(node,t2,nabors); } else if (node==n1) { if (t2!=null && !isMarked(t2)) getTriNabors(node,t2,nabors); if (t0!=null && !isMarked(t0)) getTriNabors(node,t0,nabors); } else if (node==n2) { if (t0!=null && !isMarked(t0)) getTriNabors(node,t0,nabors); if (t1!=null && !isMarked(t1)) getTriNabors(node,t1,nabors); } else {
if (nb==n1) { if (nc==n2 || t2!=null && !isMarked(t2) && (tri=findTri(t2,na,nb,nc))!=null) return tri; } else if (nb==n2) { if (nc==n1 || t1!=null && !isMarked(t1) && (tri=findTri(t1,na,nb,nc))!=null) return tri; } else { if (nb==n0) { if (nc==n2 || t2!=null && !isMarked(t2) && (tri=findTri(t2,na,nb,nc))!=null) return tri; } else if (nb==n2) { if (nc==n0 || t0!=null && !isMarked(t0) && (tri=findTri(t0,na,nb,nc))!=null) return tri; } else { if (nb==n0) { if (nc==n1 || t1!=null && !isMarked(t1) && (tri=findTri(t1,na,nb,nc))!=null) return tri; } else if (nb==n1) { if (nc==n0 || t0!=null && !isMarked(t0) && (tri=findTri(t0,na,nb,nc))!=null) return tri; } else {
private void addNode(TriMesh.Node node) { if (_mesh.isMarked(node)) return; _mesh.mark(node); _nodeList.add(node); NodeData data = data(node); data.area = 0.0; } private boolean needTri(double xp, double yp, TriMesh.Tri tri) {
Tri t2 = tri._t2; if (node==n0) { if (!isMarked(n1)) { mark(n1); nabors.add(n1); if (!isMarked(n2)) { mark(n2); nabors.add(n2); if (t1!=null && !isMarked(t1)) getNodeNabors(node,t1,nabors); if (t2!=null && !isMarked(t2)) getNodeNabors(node,t2,nabors); } else if (node==n1) { if (!isMarked(n2)) { mark(n2); nabors.add(n2); if (!isMarked(n0)) { mark(n0); nabors.add(n0); if (t2!=null && !isMarked(t2)) getNodeNabors(node,t2,nabors); if (t0!=null && !isMarked(t0)) getNodeNabors(node,t0,nabors); } else if (node==n2) { if (!isMarked(n0)) {
/** * Beginning with any tri, searches for an edge on the hull. * Because this method recursively marks the tris, all tri marks must * be cleared before calling this method. */ private Edge getEdgeOnHull(Tri tri) { mark(tri); if (tri._t0==null) return new Edge(tri,tri._n0); if (tri._t1==null) return new Edge(tri,tri._n1); if (tri._t2==null) return new Edge(tri,tri._n2); if (!isMarked(tri._t0)) { Edge edge = getEdgeOnHull(tri._t0); if (edge!=null) return edge; } if (!isMarked(tri._t1)) { Edge edge = getEdgeOnHull(tri._t1); if (edge!=null) return edge; } if (!isMarked(tri._t2)) { Edge edge = getEdgeOnHull(tri._t2); if (edge!=null) return edge; } return null; }
private void processTriNabor( double xp, double yp, double xt, double yt, TriMesh mesh, TriMesh.Tri ta, TriMesh.Node nb, TriMesh.Node nc) { boolean saveEdge = true; if (ta!=null && mesh.isMarked(ta)) { ta.centerCircle(_xy); double xa = _xy[0]-xp; double ya = _xy[1]-yp; double xy = xt*ya-xa*yt; accumulate(nc,xy); saveEdge = false; } if (saveEdge) addEdge(xp,yp,xt,yt,nb,nc); }
Node n2 = tri._n2; if (node==n0) { if (!isMarked(n1)) { mark(n1); nabors.add(n1,step); if (!isMarked(n2)) { mark(n2); nabors.add(n2,step); if (!isMarked(n0)) { mark(n0); nabors.add(n0,step); if (!isMarked(n2)) { mark(n2); nabors.add(n2,step); if (!isMarked(n0)) { mark(n0); nabors.add(n0,step); if (!isMarked(n1)) { mark(n1); nabors.add(n1,step);
private boolean needTri(double xp, double yp, TriMesh.Tri tri) { if (tri==null || _mesh.isMarked(tri)) return false; TriMesh.Node na = tri.nodeA(); TriMesh.Node nb = tri.nodeB(); TriMesh.Node nc = tri.nodeC(); double xa = na.xp(), ya = na.yp(); double xb = nb.xp(), yb = nb.yp(); double xc = nc.xp(), yc = nc.yp(); return Geometry.inCircle(xa,ya,xb,yb,xc,yc,xp,yp)>0.0; }
/** * Recursively updates the node nearest to a point with specified (x,y) * coordinates inside the mesh, beginning with the nodes referenced by * the specified tri. Both node and tri marks must be cleared before * calling this method. The logic is much like that for adding a node. * (Currently unused.) */ private void findNodeNearestInside(double x, double y, Tri tri) { if (tri!=null && !isMarked(tri)) { mark(tri); Node n0 = tri._n0; Node n1 = tri._n1; Node n2 = tri._n2; updateNodeNearest(x,y,n0); updateNodeNearest(x,y,n1); updateNodeNearest(x,y,n2); if (inCircle(n0,n1,n2,x,y)) { Tri t0 = tri._t0; Tri t1 = tri._t1; Tri t2 = tri._t2; findNodeNearestInside(x,y,t0); findNodeNearestInside(x,y,t1); findNodeNearestInside(x,y,t2); } } }
if (tri!=null && !isMarked(tri)) { mark(tri); killTri(tri);
/** * Beginning with a tri that contains a node located inside the * mesh, recursively adds Delaunay edges to the edge set. * The tri marks must be cleared before calling this method. */ private void getDelaunayEdgesInside(Node node, Tri tri) { if (tri!=null && !isMarked(tri)) { mark(tri); Node n0 = tri._n0; Node n1 = tri._n1; Node n2 = tri._n2; if (inCircle(n0,n1,n2,node)) { killTri(tri); Tri t0 = tri._t0; Tri t1 = tri._t1; Tri t2 = tri._t2; _edgeSet.addMate(tri,n0); _edgeSet.addMate(tri,n1); _edgeSet.addMate(tri,n2); getDelaunayEdgesInside(node,t0); getDelaunayEdgesInside(node,t1); getDelaunayEdgesInside(node,t2); } } }
if (tri!=null && !isMarked(tri)) { mark(tri); Node n0 = tri._n0;
if (tri!=null && !isMarked(tri)) { mark(tri); Node n0 = tri._n0;