Questa è una domanda strana per la quale ho avuto difficoltà a scrivere un titolo.Un algoritmo per iterare su un'area rettangolare all'interno di un array monodimensionale (bitmapping)
Sto lavorando con pixel (bitmap, più specificamente) e non riesco a capire la (semplice) matematica per accedere pragmaticamente a ogni cella di matrice.
La tela è [n16 x 16] pixel, n è sempre 1 o maggiore.
Ecco una foto di un n base = 2 tela:
http://i.imgur.com/mabwQfJ.png
Quello che voglio il mio algoritmo magico da fare è eseguire 0-495 senza toccare quella zona grigia più leggero passare da 16 a 512 (che in realtà è la cella 511, la mia cattiva) senza toccare l'area grigio scuro.
Quindi, da 0 a 15, passare da 16 a 31 seguita da 32 a 47, ecc
E per n = 3:
http://i.imgur.com/TqJMWl6.png
In questo caso sarebbe 0-735 saltando le aree più chiare di grigio, 16-751 saltando le aree su ciascun lato e 32-767 saltando le aree di grigio più scuro.
quello che ho provato:
Ecco un estratto dal mio codice, speriamo che sia utile e dimostra quello che ho provato già. È la parte che identifica il valore di '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];
}
}
Probabilmente hai un'idea. Mi sembra semplice, ma non riesco a capirlo.
Oh, e non mi interessa una libreria magica in grado di gestire tutte le mie risorse bitmap per me, non sono in una posizione in cui posso usarne una.
iterazione sempre nell'intervallo [0, 496) esclusivamente: row = i/16; column = i% 16; gray_index = row * total_number_of_columns + current_gray * 16 + column; –
Non riesco a capire questo "In questo caso sarebbe 0-735 saltare le aree grigie più chiare, 16-751 saltare le aree su ciascun lato e 32-767 saltare le aree di grigio più scuro." È corretto? – ANjaNA
Mi piacciono le foto qui sopra. Questo ti porta un po 'di amore in più da parte mia. –