//po zajęciu powierzchni matrycy przez prostokąt musimy odnotować to w tablicy zajętości private void aktualizacja_tablic_zajetosci(Punkt p, int[] zajetosc_x) { int poczatek_x = min_x(p); int koniec_x = max_x(p); for (int i = poczatek_x; i < koniec_x; i++) { zajetosc_x[i] = p.y; } }
//przesuwamy położenie prostokąta maksymalnie w prawo private void idz_max_w_prawo(Punkt p, int[] tab_zaj_x, int odstep) { int max_wart_x = zwroc_max_x_prostokat(p, tab_zaj_x, odstep); if (max_wart_x != tab_zaj_x.Length - 1) { max_wart_x -= odstep; } p.x = max_wart_x - max_x(p) + min_x(p); }
//ustalamy pozycje: potrzebna jest matryca (przede wszystkim tablica zajetosci) i punkt (domyślny punkt zaczepienia, tj. 0,0) public bool ustal_pozycje(Punkt p, Matryca m, int odstep) { bool start = false; if (polozenie_poczatkowe_prostokat(p, m.zajetosc_x, odstep)) //sprawdzamy czy w ogóle można umieścić prostokąt na matrycy { start = true; idz_max_w_gore(p, m.zajetosc_x, odstep); idz_max_w_prawo(p, m.zajetosc_x, odstep); idz_max_w_gore(p, m.zajetosc_x, odstep); aktualizacja_tablic_zajetosci(p, m.zajetosc_x); //po wykonaniu powyższych trzech kroków, znajdujemy punkt zaczepienia prostokąta na matrycy i aktualizujemy tablicę zajętości } return(start); }
//zwracamy minimalną wartość x jaką może zająć prostokąt - nie używamy tej metody private int zwroc_min_x_prostokat(Punkt p, int[] tab_zaj_y) { int poczatek_y = min_y(p); int koniec_y = max_y(p); int max = 0; for (int i = poczatek_y; i <= koniec_y; i++) { if (tab_zaj_y[i] > max) { max = tab_zaj_y[i]; } } return(max); }
//zwracamy maksymalną wartość x jaką może zajmować prostokąt private int zwroc_max_x_prostokat(Punkt p, int[] tab_zaj_x, int odstep) { int y_max = max_y(p); int poczatkowy_max_x = max_x(p); int poczatek_x = poczatkowy_max_x; int rozmiar_tab = tab_zaj_x.Length; if (poczatek_x + odstep < tab_zaj_x.Length - 1) { poczatek_x += odstep; } for (int i = poczatek_x; i < rozmiar_tab; i++) { poczatek_x = i; if ((tab_zaj_x[i] < y_max)) { break; } } return(poczatek_x); }
public MatrycaFiguraPunkt(int nr, Prostokat fig, Punkt punkt) { nr_matrycy = nr; figura = fig; p = punkt; }
//przekazujemy punkt i otrzymujemy minimalną wartość y danego prostokąta public int min_y(Punkt p) { return(p.y); }
//przekazujemy punkt i otrzymujemy minimalną wartość x danego prostokąta public int min_x(Punkt p) { return(p.x); }
//dla danego położenia sprawdzamy czy można iść w góre - tej metody nie używyamy (w bieżącej wersji zamiast sprawdzać mozna po prostu pójść w góre) private bool probkuj_gore(Punkt p, int[] tab_zaj_x, int odstep) { int max_wart_y = zwroc_max_y_prostokat(p, tab_zaj_x, odstep); return(max_wart_y > p.y + max_y(p) - min_y(p)); }
//przesuwamy położenie prostokąta maksymalnie w góre private void idz_max_w_gore(Punkt p, int[] tab_zaj_x, int odstep) { int max_wart_y = zwroc_max_y_prostokat(p, tab_zaj_x, odstep); p.y = max_wart_y - max_y(p) + min_y(p); }
//przekazujemy punkt i otrzymujemy maksymalną wartość y danego prostokąta public int max_y(Punkt p) { return(p.y + wysokosc); }
//przekazujemy punkt i otrzymujemy maksymalną wartość x danego prostokąta public int max_x(Punkt p) { return(p.x + szerokosc); }