public static Voronoi relax(Voronoi voronoi, List <Point> toRelax = null) { var regions = voronoi.partioning(); var points = new List <Point>(voronoi.points); foreach (var p in voronoi.frame) { points.Remove(p); } if (toRelax == null) { toRelax = voronoi.points; } foreach (var r in regions) { if (toRelax.Contains(r.seed)) { points.Remove(r.seed); points.Add(r.center()); } } return(build(points)); }
public static Voronoi build(List <Point> vertices) { var minx = 1e+10; var miny = 1e+10; var maxx = -1e+9; var maxy = -1e+9; foreach (var v in vertices) { if (v.x < minx) { minx = v.x; } if (v.y < miny) { miny = v.y; } if (v.x > maxx) { maxx = v.x; } if (v.y > maxy) { maxy = v.y; } } var dx = (maxx - minx) * 0.5; var dy = (maxy - miny) * 0.5; var voronoi = new Voronoi( (float)(minx - dx / 2), (float)(miny - dy / 2), (float)(maxx + dx / 2), (float)(maxy + dy / 2)); foreach (var v in vertices) { voronoi.addPoint(v); } return(voronoi); }