private unsafe void SpróbojRozdzielić(ZdjecieZPozycją item, bool *mapa, int szerokość, List <ZdjecieZPozycją> dododania, HashSet <ZdjecieZPozycją> doUsuniecia, bool DziałanieKrytyczne) { SpróbujWypalić(item, mapa, szerokość); if (item.Obszar.Width < 1 || item.Obszar.Height < 1 || item.Obszar.Height > 5000) { return; } int[] ŻutAksonomiczny = ZlepianieLiterRzutami.PobierzRzutX(mapa, item.Obszar, szerokość); int Miejsce = 0; double Min = int.MaxValue; int SzerokośćObiektu = item.Obszar.Width; for (int i = 0; i < SzerokośćObiektu; i++) { double x = ŻutAksonomiczny[i]; double Zm = i + 0.5f; Zm /= SzerokośćObiektu; double K = (1 - Zm) * Zm; Zm = K * K; x /= Zm; if (Min > x) { Min = x; Miejsce = i; } } ZdjecieZPozycją a = new ZdjecieZPozycją(); a.Obszar = new Rectangle(item.Obszar.X, item.Obszar.Y, Miejsce - ZminiejszenieWielkości, item.Obszar.Height); //a.ObrazWBool = (bool*)(GrafyShp.Icer.OperacjeNaStrumieniu.KopiujFragment(mapa, new Size(szerokość, 0), a.Obszar)); a.ObliczPodobieństwo(mapa, szerokość, sieć); ZdjecieZPozycją b = new ZdjecieZPozycją(); b.Obszar = new Rectangle(item.Obszar.X + Miejsce + ZminiejszenieWielkości, item.Obszar.Y, item.Obszar.Width - Miejsce - ZminiejszenieWielkości, item.Obszar.Height); b.ObliczPodobieństwo(mapa, szerokość, sieć); item.ObliczPodobieństwo(mapa, szerokość, sieć); int IlorazRozmiarów = a.Obszar.Size.WielkoścWPix() * b.Obszar.Size.WielkoścWPix(); float Współczynik = ((a.NajbliszePodobieństwo + b.NajbliszePodobieństwo) / 2) / (item.NajbliszePodobieństwo + 0.000001f); if (DziałanieKrytyczne) { Współczynik *= Matematyka.Podobność(item.Obszar.Width, Próg);//podobność zawsze(0,1) } if ((Współczynik < 1 && IlorazRozmiarów > (ZminiejszenieWielkości * ZminiejszenieWielkości))) { dododania.Add(a); dododania.Add(b); doUsuniecia.Add(item); } }
private static void ObszaryNaZdzieciaZPozycją(ref bool *c, Size SamLoto, bool *ObrazKopis, List <ZdjecieZPozycją> ListaZdjęć, out ZdjecieZPozycją Logo, bool UżywajZlepianiaRzutem) { Logo = null; int * MapaSpójnychObszarów; float NajbardzjeLogowaty = 0; List <WstepnePrzygotowanie.ObiektNaMapie> Obszary = WstepnePrzygotowanie.ZnajdźOpszary(ref c, SamLoto.Width, SamLoto.Height, out MapaSpójnychObszarów); foreach (var item in Obszary) { Rectangle rl = new Rectangle(item.MinX, item.MinY, item.MaxX - item.MinX + 1, item.MaxY - item.MinY + 1); ZdjecieZPozycją z = new ZdjecieZPozycją(); z.Obszar = rl; z.Moc = item.Moc; z.ObiektNaMapie = item; z.ObliczPodobieństwo(c, SamLoto.Width, Sieć); //usóń w dalszej fazie i Usń też Kopie z.ObrazWBool = WstepnePrzygotowanie.PobierzObszar(ObrazKopis, z, SamLoto.Width, SamLoto.Height); if (SprawdźPoprawne(item)) { ListaZdjęć.Add(z); } float Logowatość = ObliczLogowatość(z); if (Logowatość > NajbardzjeLogowaty) { NajbardzjeLogowaty = Logowatość; Logo = z; } } WczytajParametry(Logo); if (UżywajZlepianiaRzutem) { ZlepianieLiterRzutami zlk = new ZlepianieLiterRzutami(ŚredniaSzerokość, ŚredniaWysokość); zlk.Zlepiaj(MapaSpójnychObszarów, Sieć, SamLoto, c, ListaZdjęć); } Marshal.FreeHGlobal((IntPtr)MapaSpójnychObszarów); }