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; } } }
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); } } } }