/** * Main program (used for testing). */ public static void main(String[] args) { Pnt p = new Pnt(1, 2, 3); Console.WriteLine("Pnt created: " + p); Pnt[] matrix1 = { new Pnt(1, 2), new Pnt(3, 4) }; Pnt[] matrix2 = { new Pnt(7, 0, 5), new Pnt(2, 4, 6), new Pnt(3, 8, 1) }; Console.WriteLine("Results should be -2 and -288: "); Console.WriteLine(determinant(matrix1) + " " + determinant(matrix2)); Pnt p1 = new Pnt(1, 1); Pnt p2 = new Pnt(-1, 1); Console.WriteLine("Angle between " + p1 + " and " + p2 + ": " + p1.angle(p2)); Console.WriteLine(p1 + " subtract " + p2 + ": " + p1.subtract(p2)); Pnt v0 = new Pnt(0, 0), v1 = new Pnt(1, 1), v2 = new Pnt(2, 2); Pnt[] vs = { v0, new Pnt(0, 1), new Pnt(1, 0) }; Pnt vp = new Pnt(.1, .1); Console.WriteLine(vp + " isInside " + toString(vs) + ": " + vp.isInside(vs)); Console.WriteLine(v1 + " isInside " + toString(vs) + ": " + v1.isInside(vs)); Console.WriteLine(vp + " vsCircumcircle " + toString(vs) + ": " + vp.vsCircumcircle(vs)); Console.WriteLine(v1 + " vsCircumcircle " + toString(vs) + ": " + v1.vsCircumcircle(vs)); Console.WriteLine(v2 + " vsCircumcircle " + toString(vs) + ": " + v2.vsCircumcircle(vs)); Console.WriteLine("Circumcenter of " + toString(vs) + " is " + circumcenter(vs)); }
/** * Place a new point site into the DT. * @param site the new Pnt * @return set of all new triangles created */ public Set delaunayPlace(Pnt site) { Set newTriangles = new HashSet(); Set oldTriangles = new HashSet(); Set doneSet = new HashSet(); LinkedList waitingQ = new LinkedList(); // Locate containing triangle if (debug) Console.WriteLine("Locate"); Simplex triangle = locate(site); // Give up if no containing triangle or if site is already in DT var triangle_null = triangle == null; if (triangle_null || triangle.contains(site)) return newTriangles; // Find Delaunay cavity (those triangles with site in their circumcircles) if (debug) Console.WriteLine("Cavity"); waitingQ.add(triangle); while (!waitingQ.isEmpty()) { triangle = (Simplex) waitingQ.removeFirst(); if (site.vsCircumcircle((Pnt[]) triangle.toArray(new Pnt[0])) == 1) continue; oldTriangles.add(triangle); Iterator it = this.neighbors(triangle).iterator(); for (; it.hasNext();) { Simplex tri = (Simplex) it.next(); if (doneSet.contains(tri)) continue; doneSet.add(tri); waitingQ.add(tri); } } // Create the new triangles if (debug) Console.WriteLine("Create"); for (Iterator it = Simplex.boundary(oldTriangles).iterator(); it.hasNext();) { Set facet = (Set) it.next(); facet.add(site); newTriangles.add(new Simplex(facet)); } // Replace old triangles with new triangles if (debug) Console.WriteLine("Update"); this.update(oldTriangles, newTriangles); // Update mostRecent triangle if (!newTriangles.isEmpty()) mostRecent = (Simplex) newTriangles.iterator().next(); return newTriangles; }
/** * Main program (used for testing). */ public static void main(String[] args) { Pnt p = new Pnt(1, 2, 3); Console.WriteLine("Pnt created: " + p); Pnt[] matrix1 = { new Pnt(1, 2), new Pnt(3, 4) }; Pnt[] matrix2 = { new Pnt(7, 0, 5), new Pnt(2, 4, 6), new Pnt(3, 8, 1) }; Console.WriteLine("Results should be -2 and -288: "); Console.WriteLine(determinant(matrix1) + " " + determinant(matrix2)); Pnt p1 = new Pnt(1, 1); Pnt p2 = new Pnt(-1, 1); Console.WriteLine("Angle between " + p1 + " and " + p2 + ": " + p1.angle(p2)); Console.WriteLine(p1 + " subtract " + p2 + ": " + p1.subtract(p2)); Pnt v0 = new Pnt(0, 0), v1 = new Pnt(1, 1), v2 = new Pnt(2, 2); Pnt[] vs = { v0, new Pnt(0, 1), new Pnt(1, 0) }; Pnt vp = new Pnt(.1, .1); Console.WriteLine(vp + " isInside " + toString(vs) + ": " + vp.isInside(vs)); Console.WriteLine(v1 + " isInside " + toString(vs) + ": " + v1.isInside(vs)); Console.WriteLine(vp + " vsCircumcircle " + toString(vs) + ": " + vp.vsCircumcircle(vs)); Console.WriteLine(v1 + " vsCircumcircle " + toString(vs) + ": " + v1.vsCircumcircle(vs)); Console.WriteLine(v2 + " vsCircumcircle " + toString(vs) + ": " + v2.vsCircumcircle(vs)); Console.WriteLine("Circumcenter of " + toString(vs) + " is " + circumcenter(vs)); }
/** * Place a new point site into the DT. * @param site the new Pnt * @return set of all new triangles created */ public Set delaunayPlace(Pnt site) { Set newTriangles = new HashSet(); Set oldTriangles = new HashSet(); Set doneSet = new HashSet(); LinkedList waitingQ = new LinkedList(); // Locate containing triangle if (debug) { Console.WriteLine("Locate"); } Simplex triangle = locate(site); // Give up if no containing triangle or if site is already in DT var triangle_null = triangle == null; if (triangle_null || triangle.contains(site)) { return(newTriangles); } // Find Delaunay cavity (those triangles with site in their circumcircles) if (debug) { Console.WriteLine("Cavity"); } waitingQ.add(triangle); while (!waitingQ.isEmpty()) { triangle = (Simplex)waitingQ.removeFirst(); if (site.vsCircumcircle((Pnt[])triangle.toArray(new Pnt[0])) == 1) { continue; } oldTriangles.add(triangle); Iterator it = this.neighbors(triangle).iterator(); for (; it.hasNext();) { Simplex tri = (Simplex)it.next(); if (doneSet.contains(tri)) { continue; } doneSet.add(tri); waitingQ.add(tri); } } // Create the new triangles if (debug) { Console.WriteLine("Create"); } for (Iterator it = Simplex.boundary(oldTriangles).iterator(); it.hasNext();) { Set facet = (Set)it.next(); facet.add(site); newTriangles.add(new Simplex(facet)); } // Replace old triangles with new triangles if (debug) { Console.WriteLine("Update"); } this.update(oldTriangles, newTriangles); // Update mostRecent triangle if (!newTriangles.isEmpty()) { mostRecent = (Simplex)newTriangles.iterator().next(); } return(newTriangles); }