/// <summary> /// Initializes a new instance of the class Delaunay_Voronoi_Library.Delaunay_Voronoi with the specified initial Delaunay_Voronoi class. /// </summary> /// <param name="delaunay_voronoi">The Delaunay_Voronoi class.</param> public Delaunay_Voronoi(Delaunay_Voronoi delaunay_voronoi) { Dictionary<Vertex, Vertex> dictionary_parallel_copy = new Dictionary<Vertex, Vertex>(); foreach (var w in delaunay_voronoi.GetVertices) { Vertex parallel_copy = new Vertex(w); dictionary_parallel_copy.Add(w, parallel_copy); this.GetVertices.Add(parallel_copy); } foreach (var w in delaunay_voronoi.triangles) { Vertex vertex1, vertex2, vertex3; dictionary_parallel_copy.TryGetValue(w.GetVertices[0], out vertex1); dictionary_parallel_copy.TryGetValue(w.GetVertices[1], out vertex2); dictionary_parallel_copy.TryGetValue(w.GetVertices[2], out vertex3); this.triangles.Add(new triangle(vertex1,vertex2,vertex3)); } foreach (var w in delaunay_voronoi.pol) { Vertex vertex; dictionary_parallel_copy.TryGetValue(w.GetCellCentr, out vertex); VoronoiCell newvc = new VoronoiCell(w,vertex); vertex.Voronoi_Cell = newvc; pol.Add(newvc); } }
/// <summary> /// Natural Nearest Interpolation. /// </summary> public List<Vertex> NatNearestInterpolation(double fromlongitude, double fromlatitude, double tolongitude, double tolatitude, int Nlongitude, int Nlatitude, bool parallel = false, bool ExceptNaN = true) { List<Vertex> f = new List<Vertex>(); double latd = (tolatitude - fromlatitude) / Nlatitude; double lond = (tolongitude - fromlongitude) / Nlongitude; for (int i = 0; i < Nlongitude; i++) for (int j = 0; j < Nlatitude; j++) f.Add(new Vertex(fromlongitude+i*lond,fromlatitude+ j*latd)); if (parallel == false) { List<Vertex> res = new List<Vertex>(); foreach (var w in f) { Vertex v = new Vertex(w); NatNearestInterpolation(v,ExceptNaN); res.Add(v); } return res; } else { int pc = Environment.ProcessorCount; Delaunay_Voronoi[] dvm = new Delaunay_Voronoi[pc]; var c = DateTime.Now; dvm[0] = this; for (int i = 1; i < pc; i++) dvm[i] = new Delaunay_Voronoi(this); Console.WriteLine("Copy {0}", DateTime.Now-c); int[] h = new Int32[pc + 1]; h[0] = 0; h[pc] = f.Count; for (int i = 1; i < pc; i++) { h[i] = (int)Math.Truncate((double)(i * f.Count / pc)); } List<Vertex> res = new List<Vertex>(); Action<int> _ForAction = (i) => { int _h1, _h2; lock (h) { _h1 = h[i]; _h2 = h[i + 1]; } List<Vertex> d = new List<Vertex>(); for (int j = _h1; j < _h2; j++) { Vertex v = new Vertex(f[j]); dvm[i].NatNearestInterpolation(v,ExceptNaN); d.Add(v); } lock (res) { res.AddRange(d); } }; Parallel.For(0, pc, _ForAction); return res; } }
/// <summary> /// Natural Nearest Interpolation. /// </summary> /// <param name="verts">The vertices.</param> /// <param name="parallel">parallel flag.</param> /// <param name="ExceptNaN">Except NaN points </param> public List<Vertex> NatNearestInterpolation(List<Vertex> verts, bool parallel = false, bool ExceptNaN = true) { if (parallel == false) { List<Vertex> res = new List<Vertex>(); foreach (var w in verts) { Vertex v =new Vertex(w); NatNearestInterpolation(v, ExceptNaN); res.Add(v); } return res; } else { int pc = Environment.ProcessorCount; Delaunay_Voronoi[] dvm = new Delaunay_Voronoi[pc]; dvm[0] = this; for (int i = 1; i < pc; i++) dvm[i] = new Delaunay_Voronoi(this); int[] h = new Int32[pc + 1]; h[0] = 0; h[pc] = verts.Count; for (int i = 1; i < pc; i++) { h[i] = (int)Math.Truncate((double)(i * verts.Count / pc)); } List<Vertex> res = new List<Vertex>(); Action<int> _ForAction = (i) => { int _h1, _h2; lock (h) { _h1 = h[i]; _h2 = h[i + 1]; } List<Vertex> d = new List<Vertex>(); for (int j = _h1; j < _h2; j++) { Vertex v = new Vertex(verts[i]); NatNearestInterpolation(v,ExceptNaN); d.Add(v); } lock (res) { res.AddRange(d); } }; Parallel.For(0, Environment.ProcessorCount, _ForAction); return res; } }