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; } } }
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); }
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); }
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); } } } }
public void WykonajZmiane(WIelomian w) { ObszarInterpolowany = Obszar; ObszarInterpolowany.Y -= (int)(w.Podstaw(Obszar.Y) * Obszar.X); }