public static float SprawdźOceneKątami(ProstokątNaObrazie pk)
        {
            float f = Matematyka.Podobność(Matematyka.ObliczKąt(pk.XPYP, pk.XNYP, pk.XNYN), Matematyka.ObliczKąt(pk.XNYP, pk.XPYP, pk.XPYN)) * Matematyka.Podobność(Matematyka.ObliczKąt(pk.XNYP, pk.XNYN, pk.XPYN), Matematyka.ObliczKąt(pk.XPYP, pk.XPYN, pk.XNYN));

            if (float.IsInfinity(f) || float.IsNaN(f))
            {
                return(0);
            }
            return(f * f);
        }
        private void ZlepiajLitere(Graf <int> item)
        {
            List <int> P1, P2;
            float      ŚredniaWielkość = ObliczŚredniąWIelkość(item);

            item.ZnajdźPołączenia(out P1, out P2);
            if (P1.Count > 6)
            {
                return;
            }
            int   IlośćMożlwiości        = 1 << P1.Count;
            int   Stan                   = IlośćMożlwiości - 1;
            float NajwiekszePodobieństwo = int.MaxValue;
            List <ZdjecieZPozycją> NajlepiejDopasowane = new List <ZdjecieZPozycją>();

            for (int i = 0; i < IlośćMożlwiości; i++)
            {
                UstawGraf(P1, P2, Stan, i, item);
                item.CzyśćZaznaczenia();
                List <ZdjecieZPozycją> z = new List <ZdjecieZPozycją>();
                foreach (var SpójneObszary in item.ZnajdźObszary())
                {
                    z.Add(PobierzZdjecie(SpójneObszary));
                }
                double Podobieństwo;
                if (ŚredniaWielkość == 0)
                {
                    Podobieństwo = z.Average(d => d.NajbliszePodobieństwo);
                }
                else
                {
                    Podobieństwo = z.Average(d => d.NajbliszePodobieństwo / Matematyka.Podobność(ŚredniaWielkość, d.Obszar.Wielkośc()));
                }
                if (Podobieństwo < NajwiekszePodobieństwo)
                {
                    NajwiekszePodobieństwo = (float)Podobieństwo;
                    NajlepiejDopasowane    = z;
                }



                Stan = i;
            }
            foreach (var item2 in item.Listuj())
            {
                PaczkaGrafu pk = PaczkiDoGrafu[item2];
                pk.LinikaDoKrótrejNajlerzy.ListaZZdjeciami.Remove(pk.zp);
            }
            foreach (var item2 in NajlepiejDopasowane)
            {
                Liniki[0].Add(item2);
                item2.IlośćSąsiadów = item.Wielkość - 1;
            }
            item.Zaznacz();
        }
Esempio n. 3
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);
            }
        }
Esempio n. 4
0
        private static float ObliczLogowatość(ZdjecieZPozycją z)
        {
            float X = z.Obszar.Width, Y = z.Obszar.Height;
            float zw = X * Y;
            float Min, Max;

            if (X < Y)
            {
                Min = X;
                Max = Y;
            }
            else
            {
                Min = Y;
                Max = X;
            }
            zw *= Min / Max;

            zw *= Matematyka.Podobność(WypełnienieLoga, z.Wypełninienie()) * Matematyka.Podobność(z.Obszar.Size.WielkoścWPix(), SkalerLoga);
            return(zw);
        }
Esempio n. 5
0
        private List <ZdjecieZPozycją> ZnajdźBliskoSiebie()
        {
            Graf <ZdjecieZPozycją> o = new Graf <ZdjecieZPozycją>();

            o.UstalWielkośćGrafu(ListaZZdjeciami.Count, ListaZZdjeciami.ToArray());
            for (int i = 0; i < ListaZZdjeciami.Count; i++)
            {
                for (int j = i + 1; j < ListaZZdjeciami.Count; j++)
                {
                    Rectangle a = ListaZZdjeciami[i].Obszar;
                    Rectangle b = ListaZZdjeciami[j].Obszar;
                    if (Matematyka.Styczność2Obiektów(a.Left, a.Right, b.Left, b.Right) > MaxymalnaDopuszczalnaOdległość || Matematyka.Podobność(a.Height, b.Height) > MinimalnePodobieństwoY)
                    {
                        o.PołączenieDwustrone(ListaZZdjeciami[i], ListaZZdjeciami[j]);
                    }
                }
            }

            int Najwieksze           = 0;
            List <ZdjecieZPozycją> z = null;

            foreach (List <ZdjecieZPozycją> item in o.ZnajdźObszary())
            {
                if (item.Count > Najwieksze)
                {
                    Najwieksze = item.Count;
                    z          = item;
                }
            }

            return(z);
        }