private static unsafe ObiektNaMapie Zlicz(bool *początek, Point Miejsce, int x, int y, int Numer, int *mapa)
        {
            ObiektNaMapie om = new ObiektNaMapie();

            om.Numer   = Numer;
            om.Miejsce = Miejsce;
            int Ilość = 0;

            początek[Miejsce.X + Miejsce.Y * x] = false;
            Stack <Point> Miejsca = new Stack <Point>();

            Miejsca.Push(Miejsce);
            int xn = x - 1, yn = y - 1, xp = x + 1, yp = y + 1;
            int Wielkość = x * y;

            while (Miejsca.Count > 0)
            {
                Ilość++;

                Point poz = Miejsca.Pop();

                mapa[poz.X + poz.Y * x] = Numer;
                SprawdźSkrajne(poz, ref om);
                bool *ml = początek + x * poz.Y + poz.X;
                if (poz.X > 0 && ml[-1])
                {
                    ml[-1] = false;
                    Miejsca.Push(new Point()
                    {
                        X = poz.X - 1, Y = poz.Y
                    });
                }
                if (poz.X < xn && ml[1])
                {
                    ml[1] = false;
                    Miejsca.Push(new Point()
                    {
                        X = poz.X + 1, Y = poz.Y
                    });
                }
                if (poz.Y < yn && ml[x])
                {
                    ml[x] = false;
                    Miejsca.Push(new Point()
                    {
                        X = poz.X, Y = poz.Y + 1
                    });
                }
                if (poz.Y > 0 && ml[-x])
                {
                    ml[-x] = false;
                    Miejsca.Push(new Point()
                    {
                        X = poz.X, Y = poz.Y - 1
                    });
                }
            }
            om.Moc = Ilość;
            return(om);
        }
        private static unsafe ProstokątNaObrazie ZnajdźSkrajnePunktuObrazu2(bool *Obraz, int x, int y, HashSet <ObiektNaMapie> tr)
        {
            ProstokątNaObrazie zwr = new ProstokątNaObrazie();

            {
                ObiektNaMapie PomocniczyObiekt = new ObiektNaMapie();
                foreach (var item in tr)
                {
                    SprawdźSkrajne(new Point(item.MinX, item.MinY), ref PomocniczyObiekt);
                    SprawdźSkrajne(new Point(item.MaxX, item.MaxY), ref PomocniczyObiekt);
                }
                zwr.Początek = new Point(PomocniczyObiekt.MinX, PomocniczyObiekt.MinY);
                zwr.Koniec   = new Point(PomocniczyObiekt.MaxX, PomocniczyObiekt.MaxY);
                List <Point> ListaOdległośi = new List <Point>();
                Point        Sierodek       = zwr.Początek.Dodaj(zwr.Koniec).Razy(0.5f);
                ListaOdległośi.Add(Sierodek);
                ListaOdległośi.Add(ZnajdźNajdalszyPunkt(zwr, Obraz, x, y, ListaOdległośi));
                ListaOdległośi.Add(ZnajdźNajdalszyPunkt(zwr, Obraz, x, y, ListaOdległośi));
                ListaOdległośi.Add(ZnajdźNajdalszyPunkt(zwr, Obraz, x, y, ListaOdległośi));
                ListaOdległośi.Add(ZnajdźNajdalszyPunkt(zwr, Obraz, x, y, ListaOdległośi));
                zwr.XNYN = ListaOdległośi[1];
                ListaOdległośi.RemoveRange(0, 2);
                int L = ZnajdźNajdalszyKąt(ListaOdległośi, zwr.XNYN, Sierodek);
                zwr.XPYP = ListaOdległośi[L];
                ListaOdległośi.RemoveAt(L);
                zwr.XNYP = ListaOdległośi[0];
                zwr.XPYN = ListaOdległośi[1];
            }
            zwr.Ustaw(new Size(x, y));
            return(zwr);
        }
        private static unsafe HashSet <ObiektNaMapie> ZnajdźKrawdzieObiektu(int *mapa, int x, int y, List <ObiektNaMapie> lista, int IloścBranych, bool BierzNajwiekszego = false)
        {
            HashSet <ObiektNaMapie>         Zwracane       = new HashSet <ObiektNaMapie>();
            Dictionary <int, ObiektNaMapie> KreskiNajdusze = new Dictionary <int, ObiektNaMapie>();
            int Dł = IloścBranych < lista.Count ? IloścBranych : lista.Count;

            for (int i = 0; i < lista.Count; i++)
            {
                lista[i].PozycjawLiście = i;
                KreskiNajdusze.Add(lista[i].Numer, lista[i]);
            }
            PointF Sierodek = new PointF(x / 2, y / 2);
            double DeltaKąt = (Math.PI * 2) / IlośćKresekSpradzających;

            for (int i = 0; i < IlośćKresekSpradzających; i++)
            {
                PointF MiejsceSprawdzane = Sierodek;
                PointF Przesóniecie = new PointF((float)Math.Cos(DeltaKąt * i), (float)Math.Sin(DeltaKąt * i));
                int    MiejsceWIntX = 1, MiejsceWIntY = 1;
                int    IlośćPrzesónieć = 1;
                HashSet <ObiektNaMapie> ListaWystąpieńwlaserze = new HashSet <ObiektNaMapie>();
                while (true)
                {
                    MiejsceWIntX = (int)(Przesóniecie.X * IlośćPrzesónieć + Sierodek.X);
                    MiejsceWIntY = (int)(Przesóniecie.Y * IlośćPrzesónieć + Sierodek.Y);
                    IlośćPrzesónieć++;
                    if (MiejsceWIntX < x && MiejsceWIntX >= 0 && MiejsceWIntY < y && MiejsceWIntY >= 0)
                    {
                        int NrKr = mapa[x * MiejsceWIntY + MiejsceWIntX];
                        if (NrKr == 0)
                        {
                            continue;
                        }
                        ObiektNaMapie ObiektDodany = KreskiNajdusze[NrKr];
                        if (ObiektDodany.PozycjawLiście <= IloścBranych)
                        {
                            Zwracane.Add(ObiektDodany);
                            break;
                        }
                        else
                        {
                            ListaWystąpieńwlaserze.Add(ObiektDodany);
                        }
                    }
                    else
                    {
                        ObiektNaMapie Dodawany = ListaWystąpieńwlaserze.Min();
                        if (Dodawany != null && BierzNajwiekszego)
                        {
                            Zwracane.Add(Dodawany);
                        }
                        break;
                    }
                }
            }
            return(Zwracane);
        }
        private static unsafe ProstokątNaObrazie ZnajdźSkrajnePunktuObrazu(bool *Obraz, int x, int y, HashSet <ObiektNaMapie> tr)
        {
            ProstokątNaObrazie zwr = new ProstokątNaObrazie();
            {
                ObiektNaMapie PomocniczyObiekt = new ObiektNaMapie();
                foreach (var item in tr)
                {
                    SprawdźSkrajne(new Point(item.MinX, item.MinY), ref PomocniczyObiekt);
                    SprawdźSkrajne(new Point(item.MaxX, item.MaxY), ref PomocniczyObiekt);
                }
                zwr.Początek = new Point(PomocniczyObiekt.MinX, PomocniczyObiekt.MinY);
                zwr.Koniec   = new Point(PomocniczyObiekt.MaxX, PomocniczyObiekt.MaxY);
            }
            int DługośćX = zwr.Koniec.X - zwr.Początek.X;

            int[] TabPoczątów = new int[DługośćX];
            int[] TabKońców   = new int[DługośćX];
            zwr.TabicaKońców     = TabKońców;
            zwr.TablicaPoczątków = TabPoczątów;
            for (int i = zwr.Początek.X; i < zwr.Koniec.X; i++)
            {
                for (int j = zwr.Początek.Y; j < zwr.Koniec.Y; j++)
                {
                    if (Obraz[j * x + i])
                    {
                        TabPoczątów[i - zwr.Początek.X] = j - zwr.Początek.Y;
                        break;
                    }
                }
                for (int j = zwr.Koniec.Y - 1; j >= zwr.Początek.Y; j--)
                {
                    if (Obraz[j * x + i])
                    {
                        TabKońców[i - zwr.Początek.X] = j - zwr.Początek.Y;
                        break;
                    }
                }
            }
            zwr.MinimalnyX   = new Point(0, (TabKońców[0]) / 2);
            zwr.MaksymalnyX  = new Point(DługośćX - 1, TabPoczątów[DługośćX - 1]);
            zwr.MinimalnyY.Y = int.MaxValue;
            for (int i = 0; i < DługośćX; i++)
            {
                if (TabPoczątów[i] < zwr.MinimalnyY.Y)
                {
                    zwr.MinimalnyY.Y = TabPoczątów[i];
                    zwr.MinimalnyY.X = i;
                }
                if (TabKońców[i] > zwr.MaksymalnyY.Y)
                {
                    zwr.MaksymalnyY.Y = TabKońców[i];
                    zwr.MaksymalnyY.X = i;
                }
            }
            return(zwr);
        }
 private static void SprawdźSkrajne(Point poz, ref ObiektNaMapie om)
 {
     if (poz.X < om.MinX)
     {
         om.MinX = poz.X;
     }
     if (poz.Y < om.MinY)
     {
         om.MinY = poz.Y;
     }
     if (poz.X > om.MaxX)
     {
         om.MaxX = poz.X;
     }
     if (poz.Y > om.MaxY)
     {
         om.MaxY = poz.Y;
     }
 }