Node tb = tri.nodeB(); Node tc = tri.nodeC();
public double accumulateAreas( double xp, double yp, TriMesh mesh, TriMesh.NodeList nodeList, TriMesh.TriList triList) { clear(); int ntri = triList.ntri(); TriMesh.Tri[] tris = triList.tris(); for (int itri=0; itri<ntri; ++itri) { TriMesh.Tri tri = tris[itri]; 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(); Geometry.centerCircle(xp,yp,xb,yb,xc,yc,_ca); Geometry.centerCircle(xp,yp,xc,yc,xa,ya,_cb); Geometry.centerCircle(xp,yp,xa,ya,xb,yb,_cc); Geometry.centerCircle(xa,ya,xb,yb,xc,yc,_ct); double aa = area(_cb,_cc,_ct); double ab = area(_cc,_ca,_ct); double ac = area(_ca,_cb,_ct); accumulate(na,aa); accumulate(nb,ab); accumulate(nc,ac); } return sum(); } private double[] _ca = new double[2]; // circumcenter of fake tri pbc
private void processTris( double xp, double yp, TriMesh mesh, TriMesh.TriList triList) { _edgeList.clear(); int ntri = triList.ntri(); TriMesh.Tri[] tris = triList.tris(); for (int itri=0; itri<ntri; ++itri) { TriMesh.Tri tri = tris[itri]; TriMesh.Tri ta = tri.triA(); TriMesh.Tri tb = tri.triB(); TriMesh.Tri tc = tri.triC(); TriMesh.Node na = tri.nodeA(); TriMesh.Node nb = tri.nodeB(); TriMesh.Node nc = tri.nodeC(); tri.centerCircle(_xy); double xt = _xy[0]-xp, yt = _xy[1]-yp; processTriNabor(xp,yp,xt,yt,mesh,ta,nb,nc); processTriNabor(xp,yp,xt,yt,mesh,tb,nc,na); processTriNabor(xp,yp,xt,yt,mesh,tc,na,nb); } } private void processTriNabor(
/** * Validates the specified tri. */ private void validate(Tri tri) { Check.state(tri!=null,"tri not null"); Node na = tri.nodeA(); Node nb = tri.nodeB(); Node nc = tri.nodeC(); validate(na); validate(nb); validate(nc); Tri ta = tri.triA(); Tri tb = tri.triB(); Tri tc = tri.triC(); if (ta!=null) Check.state(ta.triNabor(tri.nodeNabor(ta))==tri,"a nabors ok"); if (tb!=null) Check.state(tb.triNabor(tri.nodeNabor(tb))==tri,"b nabors ok"); if (tc!=null) Check.state(tc.triNabor(tri.nodeNabor(tc))==tri,"c nabors ok"); }
private void addTri(double xp, double yp, TriMesh.Tri tri) { _mesh.mark(tri); _triList.add(tri); addNode(tri.nodeA()); addNode(tri.nodeB()); addNode(tri.nodeC()); TriMesh.Tri ta = tri.triA(); TriMesh.Tri tb = tri.triB(); TriMesh.Tri tc = tri.triC(); if (needTri(xp,yp,ta)) addTri(xp,yp,ta); if (needTri(xp,yp,tb)) addTri(xp,yp,tb); if (needTri(xp,yp,tc)) addTri(xp,yp,tc); } private void addNode(TriMesh.Node node) {
/** * Validates the specified node. */ private void validate(Node node) { Check.state(node==node._prev._next,"node==node._prev._next"); Check.state(node==node._next._prev,"node==node._next._prev"); Tri tri = node.tri(); if (_troot!=null) { Check.state(tri!=null,"tri!=null"); Check.state(node==tri.nodeA() || node==tri.nodeB() || node==tri.nodeC(), "node is one of tri nodes"); } }
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; }