示例#1
0
        internal void DopasujLinikę()
        {
            List <ZdjecieZPozycją> zp = ZnajdźBliskoSiebie();
            List <Point>           p  = new List <Point>();

            foreach (var item in zp)
            {
                p.Add(new Point(item.Obszar.X, item.Obszar.Y - Max));
            }
            WIelomian w        = WIelomian.WyznaczKrzywąRegrejis(p);
            double    Korekcja = w.Podstaw(zp.Last().Obszar.X) / 2;

            foreach (var item in zp)
            {
                item.ObszarInterpolowany    = item.Obszar;
                item.ObszarInterpolowany.Y -= (int)(Korekcja - w.Podstaw(item.ObszarInterpolowany.X));
            }
            double ŚredniaObszarów   = zp.Average(X => X.Obszar.Y);
            double ŚredniaObszarówIn = zp.Average(X => X.ObszarInterpolowany.Y);
            double Odchylenie        = zp.Sum((X) => { double wa = X.Obszar.Y - ŚredniaObszarów; return(wa * wa); });
            double OdchylenieIn      = zp.Sum((X) => { double wa = X.ObszarInterpolowany.Y - ŚredniaObszarówIn; return(wa * wa); });

            if (Odchylenie < OdchylenieIn)
            {
                foreach (var item in zp)
                {
                    item.ObszarInterpolowany = item.Obszar;
                }
            }
        }
示例#2
0
        public static WIelomian WyznaczKrzywąRegrejis(IEnumerable <Point> Tb)
        {
            WIelomian w = new WIelomian();

            double[] tb    = new double[2];
            int      Ilość = 0;
            double   XY    = 0;
            double   X     = 0;
            double   X2    = 0;
            double   Y     = 0;

            foreach (var item in Tb)
            {
                XY += item.X * item.Y;
                X  += item.X;
                Y  += item.Y;
                X2 += item.X * item.X;
                Ilość++;
            }
            double a1 = (Ilość * XY - (X * Y)) / (Ilość * X2 - X * X);
            double a0 = (Y * X2 - X * XY) / (Ilość * X2 - X * X);

            w.SładoweWielomianu = tb;
            tb[0] = a1;
            tb[1] = a0;
            return(w);
        }
示例#3
0
        public static WIelomian WyznaczKrzywąRegrejis(double[] x, double[] y)
        {
            WIelomian w = new WIelomian();

            double[] tb    = new double[2];
            int      Ilość = 0;
            double   XY    = 0;
            double   X     = 0;
            double   X2    = 0;
            double   Y     = 0;

            for (int i = 0; i < x.Length; i++)
            {
                double ax = x[i], ay = y[i];
                XY += ax * ay;
                X  += ax;
                Y  += ay;
                X2 += ax * ax;
                Ilość++;
            }
            double a1 = (Ilość * XY - (X * Y)) / (Ilość * X2 - X * X);
            double a0 = (Y * X2 - X * XY) / (Ilość * X2 - X * X);

            w.SładoweWielomianu = tb;
            tb[0] = a1;
            tb[1] = a0;
            return(w);
        }
示例#4
0
        private static void Przesón(List <Linika> zwracanePrzedPrzemianą)
        {
            List <Linika> zp = new List <Linika>(zwracanePrzedPrzemianą);

            zp.RemoveAll(X => X.ListaZZdjeciami.Count < 6);
            zp.ForEach(X => X.WyznaczPrzesuniecie());
            List <double> XCzyliY             = new List <double>();
            List <double> YCzyliA             = new List <double>();
            List <double> XNowy               = new List <double>();
            List <double> YNowy               = new List <double>();
            List <double> OdhylenieStadardowe = new List <double>();

            for (int i = 0; i < zp.Count; i++)
            {
                XCzyliY.Add(zp[i].ŚredniaY);
                YCzyliA.Add(zp[i].APrzesunieciaY);
            }


            WIelomian w         = WIelomian.WyznaczKrzywąRegrejis(XCzyliY.ToArray(), YCzyliA.ToArray());
            double    Wariancja = 0;

            for (int i = 0; i < XCzyliY.Count; i++)
            {
                double yWielomian = w.Podstaw(XCzyliY[i]);
                double delta      = yWielomian - YCzyliA[i];
                delta      = delta * delta;
                Wariancja += delta;
            }
            Wariancja /= XCzyliY.Count;
            for (int i = 0; i < XCzyliY.Count; i++)
            {
                double yWielomian = w.Podstaw(XCzyliY[i]);
                double delta      = yWielomian - YCzyliA[i];
                delta = delta * delta;
                if (delta < Wariancja)
                {
                    XNowy.Add(XCzyliY[i]);
                    YNowy.Add(YCzyliA[i]);
                }
            }
            w = WIelomian.WyznaczKrzywąRegrejis(XNowy.ToArray(), YNowy.ToArray());
            if (XNowy.Count < 5)
            {
                PrzypiszPrzesóniecia(zwracanePrzedPrzemianą);
            }
            else
            {
                foreach (var item in zwracanePrzedPrzemianą)
                {
                    foreach (var item2 in item.ListaZZdjeciami)
                    {
                        item2.WykonajZmiane(w);
                    }
                }
            }
        }
示例#5
0
 public void WykonajZmiane(WIelomian w)
 {
     ObszarInterpolowany    = Obszar;
     ObszarInterpolowany.Y -= (int)(w.Podstaw(Obszar.Y) * Obszar.X);
 }