// exports svg w/ different containments of point set (created by slicing mesh) public static void containment_demo_svg() { DMesh3 mesh = TestUtil.LoadTestInputMesh("bunny_solid.obj"); MeshTransforms.Scale(mesh, 4); AxisAlignedBox3d meshBounds = mesh.CachedBounds; Vector3d origin = meshBounds.Center; origin -= 0.2 * meshBounds.Height * Vector3d.AxisY; Frame3f plane = new Frame3f(origin, new Vector3d(1, 3, 0).Normalized); MeshPlaneCut cut = new MeshPlaneCut(mesh, plane.Origin, plane.Z); cut.Cut(); AxisAlignedBox2d polyBounds = AxisAlignedBox2d.Empty; List <Polygon2d> polys = new List <Polygon2d>(); foreach (EdgeLoop loop in cut.CutLoops) { Polygon2d poly = new Polygon2d(); foreach (int vid in loop.Vertices) { poly.AppendVertex(mesh.GetVertex(vid).xz); } poly.Rotate(new Matrix2d(90, true), Vector2d.Zero); polys.Add(poly); polyBounds.Contain(poly.Bounds); } SVGWriter svg = new SVGWriter(); var polyStyle = SVGWriter.Style.Outline("red", 1.0f); var contStyle = SVGWriter.Style.Outline("black", 1.0f); for (int k = 0; k < 3; ++k) { double shift = (k == 2) ? 1.4f : 1.1f; Vector2d tx = (k - 1) * (polyBounds.Width * shift) * Vector2d.AxisX; List <Vector2d> pts = new List <Vector2d>(); foreach (Polygon2d poly in polys) { var p2 = new Polygon2d(poly).Translate(tx); pts.AddRange(p2.Vertices); svg.AddPolygon(p2, polyStyle); } if (k == 0) { ConvexHull2 hull = new ConvexHull2(pts, 0.001, QueryNumberType.QT_DOUBLE); svg.AddPolygon(hull.GetHullPolygon(), contStyle); } else if (k == 1) { ContMinBox2 contbox = new ContMinBox2(pts, 0.001, QueryNumberType.QT_DOUBLE, false); svg.AddPolygon(new Polygon2d(contbox.MinBox.ComputeVertices()), contStyle); } else if (k == 2) { ContMinCircle2 contcirc = new ContMinCircle2(pts); svg.AddCircle(contcirc.Result, contStyle); } } svg.Write(TestUtil.GetTestOutputPath("contain_demos.svg")); }
public static void test_min_box_2() { Random r = new Random(31337); bool write_svg = false; int contained_circles_N = 100; int test_iters = 1000; //LocalProfiler p = new LocalProfiler(); //p.Start("Hulls"); QueryNumberType[] modes = new QueryNumberType[] { QueryNumberType.QT_DOUBLE, QueryNumberType.QT_INT64 }; //QueryNumberType[] modes = new QueryNumberType[] { QueryNumberType.QT_DOUBLE }; foreach (var queryMode in modes) { for (int k = 0; k < test_iters; ++k) { int N = contained_circles_N; double scale = (r.NextDouble() + 0.1) * 1024.0; Interval1d radRange = new Interval1d(10, 100); Vector2d[] pts = TestUtil.RandomPoints2(N, r, Vector2d.Zero, scale); double[] radius = TestUtil.RandomScalars(N, r, new Interval1d(radRange)); double eps = MathUtil.Epsilonf; SVGWriter svg = (write_svg) ? new SVGWriter() : null; List <Vector2d> accumPts = new List <Vector2d>(); for (int i = 0; i < pts.Length; ++i) { Polygon2d circ = Polygon2d.MakeCircle(radius[i], 16, radius[i]); circ.Translate(pts[i]); accumPts.AddRange(circ.Vertices); if (svg != null) { svg.AddPolygon(circ, SVGWriter.Style.Outline("black", 1.0f)); } } ContMinBox2 contbox = new ContMinBox2(accumPts, 0.001, queryMode, false); Box2d box = contbox.MinBox; if (svg != null) { svg.AddPolygon(new Polygon2d(box.ComputeVertices()), SVGWriter.Style.Outline("red", 2.0f)); svg.Write(TestUtil.GetTestOutputPath("contbox.svg")); } foreach (Vector2d v in accumPts) { if (box.Contains(v)) { continue; } double d = box.DistanceSquared(v); if (d < eps) { continue; } System.Console.WriteLine("test_min_box_2: Point {0} not contained!", v); } } } //p.StopAll(); //System.Console.WriteLine(p.AllTimes()); }