Beispiel #1
0
        public static DoubleMap SmoothedMap(DoubleMap origin, double slopeThreshold)
        {
            int npx = origin.Npx;
            int npy = origin.Npy;

            double[,] dataset = new double[npx, npy];

            for (int i = 0; i < npx; i++)
            {
                for (int j = 0; j < npy; j++)
                {
                    dataset[i, j] = origin.data[i, j][2];
                }
            }

            double[,] maxDerivate = MyMath.DatafirstMaxDerivate(dataset, origin.Dx, origin.Dy);
            double max = maxDerivate.Cast<double>().Max();

            while (max > slopeThreshold)
            {
                List<double[]> temp = new List<double[]>();
                for (int i = 0; i < npx; i++)
                {
                    for (int j = 0; j < npy; j++)
                    {
                        if (maxDerivate[i, j] > slopeThreshold)
                        {
                            double[] temp_array = new double[3];
                            temp_array[0] = i;
                            temp_array[1] = j;
                            temp_array[2] = MyMath.GetSmooth(dataset, i, j, 8);
                            temp.Add(temp_array);
                        }
                    }
                }
                foreach (double[] modified_point in temp)
                {
                    dataset[Convert.ToInt32(modified_point[0]), Convert.ToInt32(modified_point[1])] = modified_point[2];
                }
                maxDerivate = MyMath.DatafirstMaxDerivate(dataset, origin.Dx, origin.Dy);
                max = maxDerivate.Cast<double>().Max();
            }

            DoubleMap result = new DoubleMap(origin.xmin, origin.xmax, origin.ymin, origin.ymax, dataset);
            return result;
        }
Beispiel #2
0
        public static DoubleMap interpolatedMap(double iXmin, double iXmax, double iYmin, double iYmax, int iXcells, int iYcells, DoubleMap origin)
        {
            // SE non sono nei confini del gws
            //    return null per ora...
            if (iXmin < origin.xmin || iXmax > origin.xmax || iYmin < origin.ymin || iYmax > origin.ymax) { return null; }
            DoubleMap result = new DoubleMap(iXmin, iXmax, iYmin, iYmax, iXcells, iYcells);

            // Ora sono nei confini del gws
            // creo l'array result  e ci infilo le coordinate del bws
            result.data = new double[iXcells + 1, iYcells + 1][];

            // per ogni coordinata del bws trovo i 4 punti vicini del gws
            // 2 cicli for negli array gwsXcoord e gwsYcoord
            // x [xmin, xmin+stepx, xmin+2*stepx, ........, xmin +n*stepx]
            // y [ymin, ymin+stepy, ymin+2*stepy, ........, ymin +n*stepy]

            double[] gwsXcoord = new double[origin.Npx];
            double[] gwsYcoord = new double[origin.Npy];
            double stepx = origin.Dx;
            double stepy = origin.Dy;
            double bwsStepX = (iXmax - iXmin) / iXcells;
            double bwsStepY = (iYmax - iYmin) / iYcells;
            for (int i = 0; i < origin.Npx; i++) { gwsXcoord[i] = origin.xmin + stepx * i; }
            for (int j = 0; j < origin.Npy; j++) { gwsYcoord[j] = origin.ymin + stepy * j; }

            for (int i = 0; i < iXcells + 1; i++)
            {
                for (int j = 0; j < iYcells + 1; j++)
                {
                    double[] BwsPoint = new double[3];
                    BwsPoint[0] = iXmin + i * bwsStepX;
                    BwsPoint[1] = iYmin + j * bwsStepY;
                    int Xindex = MyMath.FindClosestLowerIndex(BwsPoint[0], gwsXcoord);
                    int Yindex = MyMath.FindClosestLowerIndex(BwsPoint[1], gwsYcoord);
                    double[][] closestPoints = new double[4][];
                    closestPoints[0] = new double[3];
                    closestPoints[0][0] = gwsXcoord[Xindex];
                    closestPoints[0][1] = gwsYcoord[Yindex];
                    closestPoints[1] = new double[3];
                    closestPoints[1][0] = gwsXcoord[Xindex + 1];
                    closestPoints[1][1] = gwsYcoord[Yindex];
                    closestPoints[2] = new double[3];
                    closestPoints[2][0] = gwsXcoord[Xindex + 1];
                    closestPoints[2][1] = gwsYcoord[Yindex + 1];
                    closestPoints[3] = new double[3];
                    closestPoints[3][0] = gwsXcoord[Xindex];
                    closestPoints[3][1] = gwsYcoord[Yindex + 1];

                    closestPoints[0][2] = origin.data[Xindex, Yindex][2];
                    closestPoints[1][2] = origin.data[Xindex + 1, Yindex][2];
                    closestPoints[2][2] = origin.data[Xindex + 1, Yindex + 1][2];
                    closestPoints[3][2] = origin.data[Xindex, Yindex + 1][2];

                    // calcolo il valore e lo schiaffo nell'array del result.
                    BwsPoint[2] = MyMath.FirstOrderTrendSurface(BwsPoint[0], BwsPoint[1], closestPoints);
                    result.data[i, j] = BwsPoint;
                }
            }

            // restituisco il valore del result
            return result;
        }