To jest dziwne pytanie, na które trudno mi było napisać tytuł.Algorytm do iteracji na prostokątnym obszarze wewnątrz tablicy jednowymiarowej (bitmapping)
Pracuję z pikselami (mapy bitowe, bardziej szczegółowo) i nie mogę obliczyć (prostych) matematyki dla pragmatycznego dostępu do każdej komórki macierzy.
Moje płótno ma wymiary [n16 x 16] pikseli, n oznacza zawsze 1 lub więcej.
Oto zdjęcie podstawowego n = 2 płótno:
http://i.imgur.com/mabwQfJ.png
Co chcę mój magiczny algorytm zrobić to uruchomić od 0 do 495, bez dotykania że zapalniczki szarej strefie następnie przejdź od 16 do 512 (co jest w rzeczywistości komórką 511, moja zła) bez dotykania ciemnoszarego obszaru.
więc 0 do 15 przejść 16 do 31, a następnie przez 32 do 47 itd
i dla n = 3:
http://i.imgur.com/TqJMWl6.png
W tym przypadku jest będzie 0-735 pomijając jaśniejsze szare obszary, 16-751 pomijając obszary po obu stronach i 32-767 pomijając ciemniejsze szare obszary.
Co próbowałem:
Oto wyciąg z mojego kodu, mam nadzieję, że jest to przydatne i pokazuje, co już próbowałem. Jest to część, która określa wartość "idxpos".
// Let's say length = 3 for now.
for (int character = 0; character < length; ++character)
{
// in case you're wondering, it grabs 16x16 characters from an ASCII spritesheet
charpos = (string[character] - ' ') * 16 * 16;
// Runs through the spritesheet character map
// this is a huge 16x1520 bitmap.
for (int pixel = 0; pixel < 16 * 16; ++pixel)
{
// ignore this, just me messing around with pixel tinting
r = (((CharMap[charpos + pixel] >> 0) & 0xFF) + 255 - u);
g = (((CharMap[charpos + pixel] >> 8) & 0xFF) + 255 - v);
b = (((CharMap[charpos + pixel] >> 16) & 0xFF) + 255 - w);
newcolour = RGB(r, g, b);
// THIS is the part I am stuck on:
idxpos = pixel + (character * 16 * 16);
bitmap[idxpos] = CharMap[charpos + j];
}
}
Prawdopodobnie wpadłeś na pomysł. Brzmi dla mnie prosto, ale nie mogę tego rozgryźć.
Aha, i nie jestem zainteresowany jakąś magiczną biblioteką, która poradzi sobie z wszystkimi moimi bitmapowymi rzeczami, nie jestem w sytuacji, w której mógłbym użyć jednego.
Zawsze iteracji z przedziału [0, 496) wyłącznie: row = i/16; column = i% 16; gray_index = wiersz * liczba_sumowanych_kolumn + zmienna_główna * 16 + kolumna; –
Nie mogę tego zrozumieć "W tym przypadku byłoby 0-735 pomijanie jaśniejszych szarych obszarów, 16-751 pomijanie obszarów po obu stronach i 32-767 pomijanie ciemniejszych szarości." Czy to prawda? – ANjaNA
Podoba mi się zdjęcia powyżej. To daje mi dodatkową miłość. –