Ejemplo n.º 1
0
        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);
            }
        }
Ejemplo n.º 2
0
        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);
        }