Beispiel #1
0
        private elMatrix calculateElementMatrix(Difference data1, Difference data2, scattDifference[] firstStep)
        {
            elMatrix finalResult = new elMatrix();

            finalResult.pureRes  = 0.0;
            finalResult.errorRes = 0.0;
            int i;
            int k;
            int c1 = -1;
            int c2 = -2;

            if (data1.first > data2.second || data2.first > data1.second)
            {
                finalResult.pureRes  = 0.0;
                finalResult.errorRes = 0.0;
            }
            else if (data1.first == data2.second || data2.first == data1.second)
            {
                finalResult.pureRes  = 0.0;
                finalResult.errorRes = -C.SlopeError * C.SlopeError;
            }
            else if (data1.first == data2.first && data1.second == data2.second)
            {
                for (i = 0; i < firstStep.Length; i++)
                {
                    if (firstStep[i].first == data1.first)
                    {
                        c1 = i;
                    }
                    if (firstStep[i].second == data1.second)
                    {
                        c2 = i;
                    }
                }
                if (c1 == c2) //vuol dire che lo step è uno solo
                {
                    finalResult.pureRes  = firstStep[c1].value;
                    finalResult.errorRes = 2.0 * C.SlopeError * C.SlopeError;
                }
                else //vuol dire che c'è più di 1 cella ed io sommo i sigma delle celle intermedie
                {
                    for (k = c1; k <= c2; k++)
                    {
                        finalResult.pureRes = finalResult.pureRes + firstStep[k].value;
                    }
                    finalResult.errorRes = 2 * C.SlopeError * C.SlopeError;
                }
            }
            else if (data1.first == data2.first)
            {
                c1 = data1.first;
                c2 = Math.Min(data1.second, data2.second);
                for (k = c1; k < c2; k++)
                {
                    finalResult.pureRes = finalResult.pureRes + firstStep[k].value;
                }
                finalResult.errorRes = C.SlopeError * C.SlopeError;
            }
            else if (data1.second == data2.second)
            {
                c1 = Math.Max(data1.first, data1.first);
                c2 = data1.second;
                for (k = c1; k < c2; k++)
                {
                    finalResult.pureRes = finalResult.pureRes + firstStep[k].value;
                }
                finalResult.errorRes = C.SlopeError * C.SlopeError;
            }
            else
            {
                c2 = Math.Min(data1.second, data2.second);
                c1 = Math.Max(data1.first, data2.first);
                for (k = c1; k < c2; k++)
                {
                    finalResult.pureRes = finalResult.pureRes + firstStep[k].value;
                }
                finalResult.errorRes = 0;
            }
            return(finalResult);
        }
Beispiel #2
0
        private ArrayList angularDifferenceL(SySal.Tracking.MIPEmulsionTrackInfo[] data, scattDifference[] firstStep, double minRL)
        {
            ArrayList dataDiff = new ArrayList();
            double    den      = 0.0;

#if _USE_MEAN_
            double msx = (data[0].Slope.Y + data[data.Length - 1].Slope.Y) * 0.5;
            double msy = -(data[0].Slope.X + data[data.Length - 1].Slope.X) * 0.5;
            den = msx * msx + msy * msy;
            if (den <= 0.0)
            {
                msx = 0.1;
                msy = 0.1;
                den = msx * msx + msy * msy;
            }
            den = 1.0 / Math.Sqrt(den);
#endif
            //calcoliamo le differenze
            int i;
            if (minRL <= 0.0)
            {
                double sum = 0.0;
                for (i = 0; i < firstStep.Length; i++)
                {
                    sum += firstStep[i].value;
                }
                minRL = 0.9 * sum * 0.5;
            }
            for (i = 0; i < data.Length; i++)
            {
                double sum = 0.0;
                int    j;
                for (j = i; j < firstStep.Length && sum < minRL; j++)
                {
                    sum += firstStep[j].value;
                }

                //                j--;
                //                if (i + j >= data.Length) break;
                //if (j >= firstStep.Length) break;
                if (sum < minRL)
                {
                    break;
                }
                Difference info      = new Difference();
                double     zDiffTest = Math.Abs(data[i].Intercept.Z - data[j].Intercept.Z);
                if (zDiffTest > 1.0) //per essere sicuri di non prendere deltaZ = 0
                {
#if _USE_X_
                    info.slopeDiff = data[i].Slope.X - data[j].Slope.X;
#elif _USE_Y_
                    info.slopeDiff = data[i].Slope.Y - data[j].Slope.Y;
#elif _USE_THETA_
                    const double Theta = Math.PI * 0.25;
                    info.slopeDiff = Math.Cos(Theta) * (data[i].Slope.X - data[j].Slope.X) - Math.Sin(Theta) * (data[i].Slope.Y - data[j].Slope.Y);
#elif _USE_S0_
                    den            = Math.Sqrt(data[0].Slope.X * data[0].Slope.X + data[0].Slope.Y * data[0].Slope.Y);
                    info.slopeDiff = (((data[i].Slope.X - data[j].Slope.X) * (data[0].Slope.Y) - (data[i].Slope.Y - data[j].Slope.Y) * (data[0].Slope.X)) / den);
                    //Console.WriteLine(" " + info.slopeDiff);
#elif _USE_MEAN_
                    info.slopeDiff = (((data[i].Slope.X - data[j].Slope.X) * msy - (data[i].Slope.Y - data[j].Slope.Y) * msx) * den);
#else
                    den            = Math.Sqrt(data[i].Slope.X * data[i].Slope.X + data[i].Slope.Y * data[i].Slope.Y);
                    info.slopeDiff = Math.Abs(((data[i].Slope.X - data[j].Slope.X) * (data[i].Slope.Y) - (data[i].Slope.Y - data[j].Slope.Y) * (data[i].Slope.X)) / den);
#endif
                    info.first  = i;
                    info.second = j; //calcolo valore[i]-valore[(i+j)]]
                    info.dZeta  = zDiffTest;
                    dataDiff.Add(info);
                }
            }

            return(dataDiff);
        }