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