Supongamos que tengo una cuadrícula bidimensional de píxeles (4 por 4 píxeles), y tengo una imagen del tamaño de mi boceto que se ha cortado en 16 partes. Ahora cargo las 16 partes en una matriz. Quiero mapear esta matriz en la cuadrícula 2D a su vez, para que mi imagen general se vuelva a armar correctamente. Es decir, imagen superior izquierda 0.png e imagen inferior derecha 16.png.
Simplemente no puedo encontrar la fórmula que me permita hacer esto. Por ejemplo, sé que con x+y*width puedes recorrer todos los píxeles, desde la esquina superior izquierda hasta la esquina inferior derecha, así que lo intenté. Sin *width , no encaja correctamente, con x+y*width - ArrayIndexOutOfBoundsException (seguro).
Así que pensé que necesitaba una matriz 2D, pero con images[x][y] obtengo una NullPointerException. Te adjunto una imagen de lo que estoy tratando de crear:
Este es mi código hasta ahora, sin la matriz 2D...
float pixelamount = 4; float pixelsize; PImage[] images = new PImage [16]; void setup() { size(1080, 1080); pixelsize = width/pixelamount; for (int i = 0; i < images.length; i++) { images[i] = loadImage(i + ".png"); } imageMode(CENTER); } void draw() { background(0); pushMatrix(); translate(pixelsize/2, pixelsize/2); for (int x = 0; x < pixelamount; x++) { for (int y = 0; y < pixelamount; y++) { pushMatrix(); translate(pixelsize*x, pixelsize*y); image(images[x+y], 0, 0, pixelsize, pixelsize); popMatrix(); } } popMatrix(); } Como dije, en la línea image(images[x+y], 0, 0, pixelsize, pixelsize); Simplemente no entiendo bien las matemáticas. ¿Necesito una matriz 2D para resolver esto? ¿O algo totalmente diferente?
Esto debería resolverse sin matriz 2D.
Si se conocen las dimensiones del campo 4x4, entonces posiblemente el ciclo debería ejecutarse de 0 a 4, algo como esto:
void draw() { background(0); pushMatrix(); translate(pixelsize/2, pixelsize/2); for (int x = 0; x < 4; x++) { for (int y = 0; y < 4; y++) { pushMatrix(); translate(pixelsize * x, pixelsize * y); image(images[4 * x + y], 0, 0, pixelsize, pixelsize); popMatrix(); } } popMatrix(); }Basado en la última respuesta, este es mi código, ¡funciona perfectamente!
float pixelamount = 4; float pixelsize; PImage[] images = new PImage [16]; void setup() { size(1080, 1080); pixelsize = width/pixelamount; for (int i = 0; i < images.length; i++) { images[i] = loadImage(i + ".png"); } imageMode(CENTER); } void draw() { background(0); pushMatrix(); translate(pixelsize/2, pixelsize/2); for (int x = 0; x < pixelamount; x++) { for (int y = 0; y < pixelamount; y++) { pushMatrix(); translate(pixelsize * x, pixelsize * y); image(images[x + y * int(pixelamount)], 0, 0, pixelsize, pixelsize); popMatrix(); } } popMatrix(); }