package ProGAL.geom2d.delaunay; import java.awt.Color; import java.util.ArrayList; import java.util.List; import ProGAL.geom2d.LineSegment; import ProGAL.geom2d.Point; import ProGAL.geom3d.predicates.ExactJavaPredicates; import ProGAL.math.Randomization; import java.util.HashSet; import java.util.logging.Level; import java.util.logging.Logger; import org.das2.util.LoggerManager; /** * * @author ras */ public class DTWithBigPoints { private static final Logger logger= LoggerManager.getLogger("ProGAL.geom2d.delaunay"); private final ExactJavaPredicates pred = new ExactJavaPredicates(); final List vertices; final List triangles; final Vertex[] bigPoints; public DTWithBigPoints(List points){ this.vertices = new ArrayList(points.size()); this.triangles = new ArrayList(points.size()); bigPoints = new Vertex[3]; bigPoints[0] = new Vertex(new Point(-3000,-3000)); bigPoints[1] = new Vertex(new Point( 3000, 0)); bigPoints[2] = new Vertex(new Point( 0, 3000)); Triangle bigTri = new Triangle(bigPoints[0], bigPoints[1], bigPoints[2]); triangles.add(bigTri); for(Point p: points) addPoint(p); } public List getTriangles(){ return new ArrayList(triangles); } public List getEdges(){ ArrayList ret = new ArrayList(); for(Triangle tri: triangles){ for(int i=0;i<3;i++){ int[] e = new int[]{tri.corners[i].id-3, tri.corners[(i+1)%3].id-3}; if(e[0]<0 || e[1]<0) continue; if(e[0]>e[1]){ int tmp = e[0]; e[0] = e[1]; e[1] = tmp; } if( !ret.contains(e) ) ret.add(e); } } return ret; } public Triangle walk(Point p){ return walk(p,null); } public Triangle walk(Point p, List trace ){ Triangle t = triangles.get(triangles.size()-1); return walk(p, trace, t); } /** * walk to find the triangle containing the point * @param p the location to find. * @param trace if non-null, then keep a list of triangles visited. * @param t initial triangle * @return the triangle containing point p */ public Triangle walk(Point p, List trace, Triangle t ){ HashSet visited= new HashSet<>(); if ( t==null ) t = triangles.get(triangles.size()-1); visited.add(t); while(true){ logger.log(Level.FINEST, "walk triangle: {0}", t); //printTriangle( t, p ); double a1 = Point.area(t.corners[0], t.corners[1], p); orientPredCounter++; double a2 = Point.area(t.corners[1], t.corners[2], p); orientPredCounter++; double a3 = Point.area(t.corners[2], t.corners[0], p); orientPredCounter++; if(a1<0 && a2<0) //No need to check the third side if(a20; predCounter++; if(illegal){ flip(t,e,u,f); // scene.repaint(); legalizeEdge(t, e); legalizeEdge(u, (f+2)%3); } } static void flip(Triangle t, int e, Triangle u, int f){ flipCounter++; Vertex p0 = t.corners[e]; Vertex p1 = t.corners[(e+1)%3]; Vertex p2 = u.corners[f]; Vertex p3 = t.corners[(e+2)%3]; Triangle n01 = t.neighbors[(e+2)%3]; Triangle n12 = u.neighbors[(f+1)%3]; Triangle n23 = u.neighbors[(f+2)%3]; Triangle n34 = t.neighbors[(e+1)%3]; t.corners[(e+2)%3] = p2; u.corners[(f+2)%3] = p0; t.setCorner(p2, (e+2)%3); u.setCorner(p0, (f+2)%3); t.neighbors[e] = n12; t.neighbors[(e+1)%3] = u; t.neighbors[(e+2)%3] = n01; u.neighbors[f] = n34; u.neighbors[(f+1)%3] = t; u.neighbors[(f+2)%3] = n23; if(n12!=null) n12.neighbors[(n12.indexOf(p1)+1)%3] = t; if(n34!=null) n34.neighbors[(n34.indexOf(p3)+1)%3] = u; if(p1.first==u) p1.first = t; if(p3.first==t) p3.first = u; } public boolean inCH(Triangle t){ if(t==null) return false; for(Point bp: bigPoints){ for(int c=0;c<3;c++) if(t.corners[c]==bp) return false; } return true; } public boolean onCH(Triangle t){ return inCH(t) && (!inCH(t.neighbors[0]) || !inCH(t.neighbors[1]) || !inCH(t.neighbors[2])); } public static int flipCounter = 0, predCounter = 0, orientPredCounter = 0; }