public static double[,] InterpolateArray(double[,] initArray, int xsize, int ysize) { if (xsize == initArray.GetLength(0) && ysize == initArray.GetLength(1)) { return(initArray); } var resArray = new double[xsize, ysize]; FillArray(resArray, double.NaN); //todo учесть, что исходный массив может быть больше интерполируемого var xinit = initArray.GetLength(0); var yinit = initArray.GetLength(1); var ktX = Convert.ToDouble(xsize - 1) / Convert.ToDouble(xinit - 1); var ktY = Convert.ToDouble(ysize - 1) / Convert.ToDouble(yinit - 1); var xNodes = new List <int>(); //строчные индексы опорных значений интерполируемого массива var yNodes = new List <int>(); //столбовые индексы опорных значений интерполируемого массива //равномерно распределяем элементы исходного массива в интерполируемый for (int i = 0; i < xinit; i++) { int ni = Convert.ToInt32(i * ktX); xNodes.Add(ni); for (int j = 0; j < yinit; j++) { int nj = Convert.ToInt32(j * ktY); resArray[ni, nj] = initArray[i, j]; if (i == 0) { yNodes.Add(nj); } } } //интерполируем for (int i = 0; i < xsize; i++) { for (int j = 0; j < ysize; j++) { if (double.IsNaN(resArray[i, j])) { var li = LeftInd(xNodes, i); var lj = LeftInd(yNodes, j); var ri = RightInd(xNodes, i); var rj = RightInd(yNodes, j); var interpol = new InterpolationRectangle(new ModPoint(li, lj), new ModPoint(ri, rj), resArray[li, lj], resArray[li, rj], resArray[ri, lj], resArray[ri, rj], new ModPoint(i, j)); resArray[i, j] = interpol.InterpolatedValue; } } } return(resArray); }
public static Dictionary <uint, Marker> GetMarkersFromPrnByIndexesDict(string filePath, List <uint> inds, bool calculatePressure = true) { var fs = new FileStream(filePath, FileMode.Open); var intArr = new byte[4]; var int64Arr = new byte[8]; var longArr = new byte[45]; var doubleArr = new byte[72]; var byteArr = new byte[1]; var floatArr = new byte[4]; var A = new byte[4]; fs.Read(A, 0, 4); fs.Read(longArr, 0, 40); var xnumx = BitConverter.ToInt64(longArr, 0); var ynumy = BitConverter.ToInt64(longArr, 8); var mnumx = BitConverter.ToInt64(longArr, 16); var mnumy = BitConverter.ToInt64(longArr, 24); var marknum = BitConverter.ToInt64(longArr, 32); // if (ind > marknum) return null; todo вернуть fs.Read(doubleArr, 0, 72); var xsize = BitConverter.ToDouble(doubleArr, 0); var ysize = BitConverter.ToDouble(doubleArr, 8); var pinit = new double[5]; for (int i = 0; i < 5; i++) { pinit[i] = BitConverter.ToDouble(doubleArr, 16 + 8 * i); } var gxkoef = BitConverter.ToDouble(doubleArr, 56); var gykoef = BitConverter.ToDouble(doubleArr, 64); fs.Read(intArr, 0, 4); var rocknum = BitConverter.ToInt32(intArr, 0); fs.Read(int64Arr, 0, 8); var bondnum = BitConverter.ToInt64(int64Arr, 0); fs.Read(intArr, 0, 4); var n1 = BitConverter.ToInt32(intArr, 0); fs.Read(doubleArr, 0, 8); var timesum = BitConverter.ToDouble(doubleArr, 0); // ------- var curpos0 = 4 + 2 * 4 + 16 * 8 + rocknum * (8 * 24 + 4); fs.Position = curpos0 + (4 * 22 + 8 * 4) * xnumx * ynumy; var gx = new float[xnumx]; for (int i = 0; i < xnumx; i++) { fs.Read(floatArr, 0, 4); gx[i] = BitConverter.ToSingle(floatArr, 0); } var gy = new float[ynumy]; for (int i = 0; i < ynumy; i++) { fs.Read(floatArr, 0, 4); gy[i] = BitConverter.ToSingle(floatArr, 0); } //------- var result = new Dictionary <uint, Marker>(); foreach (var ind in inds) { var nodenum1 = xnumx * ynumy; var curpos1 = 4 + 2 * 4 + 16 * 8 + rocknum * (8 * 24 + 4) + 15 * 8 * nodenum1 + 4 * (xnumx + ynumy) + (bondnum - 1) * (16 + 3 * 8) + ind * 37; fs.Position = curpos1; var parBytes = new byte[36]; fs.Read(parBytes, 0, 36); var rid = new byte[1]; fs.Read(rid, 0, 1); var resultMarker = new Marker { XPosition = BitConverter.ToSingle(parBytes, 0), YPosition = BitConverter.ToSingle(parBytes, 4), Temperature = BitConverter.ToSingle(parBytes, 8) - 273, Density = BitConverter.ToSingle(parBytes, 12), WaterCons = BitConverter.ToSingle(parBytes, 16), UndefinedPar1 = BitConverter.ToSingle(parBytes, 20), UndefinedPar2 = BitConverter.ToSingle(parBytes, 24), Viscosity = BitConverter.ToSingle(parBytes, 28), Deformation = BitConverter.ToSingle(parBytes, 32), RockId = rid[0], Id = ind, Age = timesum }; if (calculatePressure) { // p1--------p3 // | | // p2--------p4 var p1X = LeftIndex(gx, resultMarker.XPosition); var p1Y = LeftIndex(gy, resultMarker.YPosition); var p2X = p1X; var p2Y = p1Y + 1; var p3X = p1X + 1; var p3Y = p1Y; var p4X = p1X + 1; var p4Y = p1Y + 1; double pressure; if (p1X < 0 || p1Y < 0) { pressure = 0; resultMarker.Pressure = pressure; result.Add(resultMarker.Id, resultMarker); continue; } fs.Position = curpos0 + 120 * ynumy * p1X + 120 * p1Y; fs.Read(floatArr, 0, 4); var v1 = BitConverter.ToSingle(floatArr, 0); fs.Position = curpos0 + 120 * ynumy * p2X + 120 * p2Y; fs.Read(floatArr, 0, 4); var v2 = BitConverter.ToSingle(floatArr, 0); fs.Position = curpos0 + 120 * ynumy * p3X + 120 * p3Y; fs.Read(floatArr, 0, 4); var v3 = BitConverter.ToSingle(floatArr, 0); fs.Position = curpos0 + 120 * ynumy * p4X + 120 * p4Y; fs.Read(floatArr, 0, 4); var v4 = BitConverter.ToSingle(floatArr, 0); var a1X = gx[p1X]; var a1Y = gy[p1Y]; var a4X = gx[p4X]; var a4Y = gy[p4Y]; var interpolation = new InterpolationRectangle(new ModPoint(a1X, a1Y), new ModPoint(a4X, a4Y), v1, v2, v3, v4, new ModPoint(resultMarker.XPosition, resultMarker.YPosition)); pressure = interpolation.InterpolatedValue; resultMarker.Pressure = pressure; } result.Add(resultMarker.Id, resultMarker); } fs.Close(); return(result); }