public static void DrawDiagram(BruteForceVoronoi diagram, RenderConfig config, string filename) { Bitmap image = CreateBitmap(config); for (int row = 0; row < image.Height; row++) { for (int col = 0; col < image.Width; col++) { bool initialPadding = col < config.xPadding || row < config.yPadding; bool finalPadding = (col - config.xPadding) >= diagram.output.GetLength(0) || (row - config.yPadding) >= diagram.output.GetLength(1); if (initialPadding || finalPadding) { image.SetPixel(col, row, Color.White); } else { ushort pointIndex = diagram.output[col - config.xPadding, row - config.yPadding]; image.SetPixel(col, row, diagram.sites[pointIndex].color); } } } // Note: graphics draws on top of the existing bitmap by reference Graphics g = Graphics.FromImage(image); SolidBrush whiteBrush = new SolidBrush(Color.White); foreach (Models.Point site in diagram.sites) { g.DrawPoint(site, whiteBrush, config); } image.Save(filename); whiteBrush.Dispose(); }
// Runs a specific Voronoi Generation test and returns the time it took // to complete. static long RunTests(int trial, int numPoints, int max, TestMode t) { Stopwatch timer = new Stopwatch(); List <Point> sites = Point.GetRandomPoints(numPoints, 0, max); if (t == TestMode.BOWYER_WATSON) { timer.Start(); DelaunayTriangulator generator = new DelaunayTriangulator(sites); generator.GenerateVoronoi(); timer.Stop(); } else { timer.Start(); BruteForceVoronoi generator = new BruteForceVoronoi(sites); generator.GenerateVoronoi(); timer.Stop(); } long elapsed = timer.ElapsedMilliseconds; Console.WriteLine(trial + "\t\t" + numPoints + "\t\t" + max + "\t\t" + elapsed); return(elapsed); }
// Renders a diagram based off of random points. // Uses same points with both methods. public static void RenderSameDiagram() { List <Point> points = Point.GetRandomPoints(numPointsForPic, 0, rangeForPic); DelaunayTriangulator tri = new DelaunayTriangulator(points); VoronoiDiagram voroEfficient = tri.GenerateVoronoi(); BruteForceVoronoi voroBrute = new BruteForceVoronoi(points); voroBrute.GenerateVoronoi(); RenderConfig config = voroBrute.FullFrameConfig; config.xPadding += 50; config.yPadding += 50; VoronoiRenderer.DrawDiagram(voroEfficient, config, "bowyer_output.bmp"); VoronoiRenderer.DrawTriangulation(tri.WithoutSupertriangle(), config, "bowyer_triangulation_no_super.bmp"); VoronoiRenderer.DrawTriangulation(tri, config, "bowyer_triangulation_super.bmp"); VoronoiRenderer.DrawDiagram(voroBrute, config, "brute_force_output.bmp"); }