Grafika w konsoli

0

Hey. Mam problem z zadaniem. Polega ono na implementacji pewnych działań na obrazach występujących na płaszczyźnie i składających się z '0' i '1'.
Dane wejściowe składają się z:

  • ilości obrazów, na których będą wykonywane działania (1-100 obrazów)
  • parametrów w/w obrazów w ilości równej ilości obrazów i składających się z numeru obrazu (1-10k) i współrzędnych (przeciwległe punkty prostokąta: x1, y1, x2, y2 - (x1,y1) i (x2, y2), przy czym szerokość i wysokość obrazu nie przekraczają 0,5k punktów, ale współrzędne punktów zawierają się w zakresie od -10k do 10k.

Jak w najprostszy i zżerający jak najmniej pamięci sposób tworzyć te obrazy, tak aby potem swobodnie móc je wyświetlać i operować na znajdujących się w nich '0' i '1' poprzez wykonywanie poleceń danych jako: < nazwa polecenia > < numer obrazu (1-10k) > < ... > ?

Zakładamy, że obrazy nie nachodzą na siebie, tj. nie możemy tworzyć obrazów składających się z tych samych punktów i wykonywać operacji jednocześnie na kilku obrazach.

Z góry dzięki za jakiekolwiek propozycje. Mam nadzieję, że nie zapisałem tego w zbyt zagmatwany sposób :)

!!! NIE MOŻNA używać dynamicznej alokacji pamięci, a jedyne pliki nagłówkowe jakie można dołączyć to <iostream> i <string>

0

Na ile rozumiem pytasz o reprezentacje wewnętrzną.
Na ile rozumiem o fakcie że są to obrazy wie tylko autor programu i tylko z powodu że łatwiej było tak wytłumaczyć sens zadania, program już n ie musi wiedzieć.
Więc

vector<vector<bool>> obraz(height,vector<bool>(width));
0

Jak ma być "aż tak surowo", to nie ma wyjścia...

  1. Przy znanych wymiarach całości płaszczyzny obrazu, tablica z wierszami w postaci wartości uint32_t dla arch. 32-bitowej lub uint64_t dla arch. 64-bitowej.
  2. Następnie obliczenia jaki bit w wartości zapalić/zgasić/wyświetlić (przesunięcia bitowe) oraz którą wartość (czyli % 32 dla uint32_t i % 64 dla uint64_t)
  3. Całość opakować sensowną klasą która :
  • obsłuży "dodanie obrazka" (tak nazwę te składowe obrazki)
  • obsłuży dostęp do bitów danego "obrazka"
  • obsłuży polecenia których dotyczy pytanie
  • ...

Po drodze wiele obliczeń i optymalizacji (np. trzymanie informacji o przesunięciu bitowym oraz indeksie do wartości).

... o ile dobrze zrozumiałem pytającego...

0
Mokrowski napisał(a):
  1. Przy znanych wymiarach całości płaszczyzny obrazu, tablica z wierszami w postaci wartości uint32_t dla arch. 32-bitowej lub uint64_t dla arch. 64-bitowej.
    do -10k do 10k czyli zakres (10k-(-10k))=20k, ponieważ kwadratowa to (20k*20k)=400m zapisujemy w bitach to (400m/8)=50m, zaś ograniczenie pamięciowe to 14m.
0

Złe obliczenia albo zostałem źle zrozumiany... albo... niech się wypowie autor :-)
Ja zrozumiałem że:

  1. Obrazków jest max. 100 i mają numery 1-10000
  2. Szerokość i wysokość każdego obrazka to 500 pkt.
  3. Obrazki zawierają jedynie 0/1 więc bit wystarcza na reprezentację piksela.

Stąd:
[ 100(obrazków) * 500 (pkt. szerokości) * 500 (pkt. wysokości) ] / 8 (bitów na bajt) = 3125000 (bajtów) -> ok. 3 megabajtów

... i tyle wg. mnie wystarczy pamięci na przechowanie bitów obrazków o ile je dobrze zrozumiałem.

Tak, trzeba będzie trochę w tej klasie policzyć bo "na linearnej abstrakcji pamięci umieszczane mają być twory 2-wymiarowe" i trochę tych "tworów" będzie (100) :-)

Pytanie jednak ogólne (bo o radę) i myślę że pomimo uciążliwości (jak bym nie był ograniczony jak autor pytania, użył bym std::array oraz std::bitset), to odpowiedź .... bliżej optimum optymalizacji zajętości pamięci :-)

0

Nie do końca rozumiem:
"1. Przy znanych wymiarach całości płaszczyzny obrazu, tablica z wierszami w postaci wartości uint32_t dla arch. 32-bitowej lub uint64_t dla arch. 64-bitowej."

Maksymalne wymiary jednego obrazu to 500x500 jednak współrzędne punktów są zawarte w przedziałach -10000 do 10000, a obrazów może być 100.

A więc teoretycznie powinienem mieć 100 tablic 500x500 ?

1 użytkowników online, w tym zalogowanych: 0, gości: 1