public List<KeyValuePair<double[], double>> GetMeshPointsCvt(int rows, int columns, double[] max, double[] min, List<double[]> edgepnts) { List<KeyValuePair<double[], double>> vals = new List<KeyValuePair<double[], double>>(); double deltax = max[0] - min[0]; double deltay = max[1] - min[1]; if (m_threaded) { try { meshArray.Clear(); int start, end, i; for (i = 0; i < meshThreadcount; i++) { meshDoneEvents[i] = new ManualResetEvent(false); start = (rows * i) / meshThreadcount; end = ((i + 1) * rows) / meshThreadcount; MeshThread mt = new MeshThread(this, rows, start, end, columns, deltax, deltay, min, meshDoneEvents[i], edgepnts, true); meshArray.Add(mt); ThreadPool.QueueUserWorkItem(mt.ThreadPoolCallback, i); } // Wait for all threads in pool to finish. foreach (var e in meshDoneEvents) e.WaitOne(); meshArray.ForEach(delegate(MeshThread m) { vals.AddRange(m.CvtResult); }); } catch (Exception e) { string message = e.Message; } } else { int i, j; double x, y, k = 0; double[] d = new double[3]; double[] dd = new double[3]; for (i = 0; i < rows; i++) { x = (double)i / (double)(rows - 1) * deltax + min[0]; for (j = 0; j < columns; j++) { y = (double)j / (double)(columns - 1) * deltay + min[1]; double[] p = new double[3] { x, y, 0 }; Gaussian(ref p, ref d, ref dd, ref k); vals.Add(new KeyValuePair<double[], double>(p, k)); } } } return vals; }
/// <summary> /// evenly spaced /// </summary> /// <param name="rows"></param> /// <param name="columns"></param> /// <param name="max"></param> /// <param name="min"></param> /// <returns></returns> //public List<double[]> GetMeshPointsInX(int rows, int columns, double[] max, double[] min) //{ // List<double[]> vals = new List<double[]>(); // double deltax = max[0] - min[0]; // double deltay = max[1] - min[1]; // int i, j; // double x, y; // for (i = 0; i < rows; i++) // { // y = (double)i / (double)(rows - 1) * deltay + min[1]; // for (j = 0; j < columns; j++) // { // x = (double)j / (double)(columns - 1) * deltax + min[0]; // double[] p = new double[3] { x, y, 0 }; // Value(ref p); // vals.Add(p); // } // } // return vals; //} /// <summary> /// unevenly spaced /// </summary> /// <param name="rows"></param> /// <param name="columns"></param> /// <param name="max"></param> /// <param name="min"></param> /// <returns></returns> public List<double[]> GetMeshPointsInXUneven(int rows, int columns, double[] max, double[] min) { List<double[]> vals = new List<double[]>(); double deltax = max[0] - min[0]; double deltay = max[1] - min[1]; int i, j; double y, sx; List<double[]> points = new List<double[]>(); points.Add(new double[] { 0, 0 }); points.Add(new double[] { 1.0, 0.5 }); points.Add(new double[] { 8.0, 5.0 }); points.Add(new double[] { 10.0, 10.0 }); RBFCurve rbf = new RBFCurve(null, "shaper", points, new RBFBasis.ThinPlateSpline(null), new RBFPolynomials.Linear(null), 0.0); shaper Shape = ((double value) => { double[] pnt = new double[] { 10.0*value, 0 }; rbf.Value(ref pnt); return pnt[1]/10.0; }); if (m_threaded) { try { int start, end; meshArray.Clear(); for (i = 0; i < meshThreadcount; i++) { meshDoneEvents[i] = new ManualResetEvent(false); start = (rows * i) / meshThreadcount; end = ((i + 1) * rows) / meshThreadcount; MeshThread mt = new MeshThread(this, rows, start, end, columns, deltax, deltay, min, null, meshDoneEvents[i], Shape, null); meshArray.Add(mt); ThreadPool.QueueUserWorkItem(mt.ThreadPoolCallback, i); } // Wait for all threads in pool to calculate. foreach (var e in meshDoneEvents) e.WaitOne(); meshArray.ForEach(delegate(MeshThread m) { vals.AddRange(m.Result); }); } catch (Exception e) { string message = e.Message; } } else { for (i = 0; i < rows; i++) { y = (double)i / (double)(rows - 1) * deltay + min[1]; for (j = 0; j < columns; j++) { //x = (double)j / (double)(columns - 1) * deltax + min[0]; sx = Shape((double)j / (double)(columns - 1)) * deltax + min[0]; double[] p = new double[3] { sx, y, 0 }; Value(ref p); vals.Add(p); } } } return vals; }
public List<double[]> GetMeshPoints(int rows, int columns, double[] max, double[] min) { List<double[]> vals = new List<double[]>(); double deltax = max[0] - min[0]; double deltay = max[1] - min[1]; if (m_threaded) { try { int start, end, i; meshArray.Clear(); for (i = 0; i < meshThreadcount; i++) { meshDoneEvents[i] = new ManualResetEvent(false); start = (rows * i) / meshThreadcount; end = ((i + 1) * rows) / meshThreadcount; MeshThread mt = new MeshThread(this, rows, start, end, columns, deltax, deltay, min, null, meshDoneEvents[i]); meshArray.Add(mt); ThreadPool.QueueUserWorkItem(mt.ThreadPoolCallback, i); } // Wait for all threads in pool to calculate. foreach (var e in meshDoneEvents) e.WaitOne(); meshArray.ForEach(delegate(MeshThread m) { vals.AddRange(m.Result); }); } catch (Exception e) { string message = e.Message; } } else { int i, j; double x, y; for (i = 0; i < rows; i++) { x = (double)i / (double)(rows - 1) * deltax + min[0]; for (j = 0; j < columns; j++) { y = (double)j / (double)(columns - 1) * deltay + min[1]; double[] p = new double[3] { x, y, 0 }; Value(ref p); vals.Add(p); } } } return vals; }