Daten I
Viele Variablen: Arrays, Arrays in 2D, Bilder (Bitmaps), Bilder: einzelne Pixel, Bilder als Arrays, Bilder (Vektoren)
Viele Variablen: Arrays
Statt:
size(410, 200); background(255); float py1 = 10+random(height-10); float py2 = 10+random(height-10); float py3 = 10+random(height-10); float py4 = 10+random(height-10); //usw... line(10,10,10,py1); line(20,10,20,py2); line(30,10,30,py3); line(40,10,40,py4); // usw...
...eine Menge von Variablen (Feld/Array). Array deklarieren mit [].
float[] py;
Größe des Feldes festlegen mit new und [...].
py = new float[40];
Länge des Feldes abfragen mit length.
println(py.length);
Werte in das Feld speichern mit der Nummer einer Variable darin ([...], Zählen ab Null!)...
py[0] = 10+random(height-10); py[1] = 10+random(height-10); py[2] = 10+random(height-10); py[3] = 10+random(height-10); // usw...
...meist in einer Schleife.
for (int i=0; i<py.length; i++) {
py[i] = 10+random(height-10);
}
Verwenden der Variablen im Feld über ihre Nummer ([...], Zählen ab Null!).
for (int i=0; i<py.length; i++) {
line(10*i+10,10,10*i+10,py[i]);
}
Zum Beispiel...Wall Drawing #118:
size(400, 400); background(255); float[] px; float[] py; px = new float[40]; py = new float[40]; for (int i=0; i<px.length; i++) { px[i] = random(width); py[i] = random(height); } for (int i=0; i<px.length; i++) { stroke(0, 128); strokeWeight(8); point(px[i], py[i]); for (int j=0; j<px.length; j++) { stroke(0, 24); strokeWeight(1); line(px[i],py[i],px[j],py[j]); } }↑
Arrays in 2D
Arrays können auch in jedem Feld ein weiteres Array enthalten -- und damit Zeilen und Spalten bekommen. Z.B. für 10 Mal 10 zufällige Rotationen.
Anlegen mit [][]:
float[][] winkel; winkel = new float[10][10];
Füllen mit Werten (jeder Winkel ist über zwei Zahlen markiert: Zeile und Spalte)...
for (int i=0; i<winkel.length; i++) { for (int j=0; j<winkel[i].length; j++) { winkel[i][j] = random(90); } }
...und Zugriff auf die Koordinaten (wieder über zwei Zahlen):
for (int i=0; i<winkel.length; i++) { pushMatrix(); for (int j=0; j<winkel[i].length; j++) { pushMatrix(); rotate(radians(winkel[i][j])); rect(0,0,10,10); popMatrix(); translate(0, 20); } popMatrix(); translate(20, 0); }
Jetzt z.B. Drehwinkel auf Tastendruck verändern.
float[][] winkel; void setup() { size(400, 400); fill(255); noStroke(); rectMode(CENTER); winkel = new float[10][10]; for (int i=0; i<winkel.length; i++) { for (int j=0; j<winkel[i].length; j++) { winkel[i][j] = random(90); } } } void draw() { background(0); translate(110, 110); for (int i=0; i<winkel.length; i++) { pushMatrix(); for (int j=0; j<winkel[i].length; j++) { pushMatrix(); rotate(radians(winkel[i][j])); rect(0, 0, 10, 10); popMatrix(); translate(0, 20); } popMatrix(); translate(20, 0); } if (keyPressed) { for (int i=0; i<winkel.length; i++) { for (int j=0; j<winkel[i].length; j++) { winkel[i][j] = winkel[i][j] + 1; } } } }↑
Bilder (Bitmaps)
Bilder laden, in Variable speichern und darstellen. (Achtung: "Sketch/Add File..." oder von Hand nach Sketch-Folder/data!)
size(400,400); PImage bild; bild = loadImage("Monitor.jpg"); imageMode(CENTER); image(bild,width/2,height/2);↑
Bilder: einzelne Pixel
Alle Pixel eines Bildes können über PImage.get(...) abgefragt werden...
PImage bild; void setup() { size(585,439); bild = loadImage("Monitor.jpg"); } void draw() { image(bild,0,0); noStroke(); fill(bild.get(mouseX,mouseY)); rectMode(CENTER); rect(mouseX,mouseY,40,40); }
...auch nacheinander in einer doppelten Schleife (Zeilen und Spalten).
PImage bild; void setup() { size(585, 439); bild = loadImage("Monitor.jpg"); } void draw() { background(0); for (int i=0; i<bild.width; i++) { for (int j=0; j<bild.height; j++) { strokeWeight(20); if (brightness(bild.get(i,j)) > 200) { stroke(255,25); point(i,j); } } } }
Wobei natürlich alle oder nur einige der Pixel angeschaut werden können. Z.B. Pixelate:
PImage bild; int pixel = 10; void setup() { size(585, 439); bild = loadImage("Monitor.jpg"); } void draw() { background(255); noStroke(); noSmooth(); for (int i=0; i<bild.width; i = i+pixel) { for (int j=0; j<bild.height; j = j+pixel) { fill(bild.get(i,j)); rect(i,j,pixel,pixel); } } pixel = mouseX/4+1; }↑
Bilder als Arrays
Schneller als get(...) ist der Zugriff auf die Pixel als Array (pixels[]). Dazu muss das Array aller Pixel zunächst geladen werden: loadPixels().
Beim Zugriff auf das Array wird aus get(x, y) dann pixels[y*width+x].
PImage bild; void setup() { size(585,439); bild = loadImage("Monitor.jpg"); } void draw() { image(bild,0,0); noStroke(); bild.loadPixels(); fill(bild.pixels[mouseY*bild.width+mouseX]); rectMode(CENTER); rect(mouseX,mouseY,40,40); }...oder:
PImage bild; int abstand = 8; void setup() { size(585, 439); bild = loadImage("Monitor.jpg"); } void draw() { background(255); stroke(0); bild.loadPixels(); for (int i=0; i<bild.width; i=i+abstand) { for (int j=0; j<bild.height; j=j+abstand) { float helligkeit = brightness(bild.pixels[j*bild.width+i]); pushMatrix(); translate(i, j); rotate(radians(helligkeit/255.0*360)); line(0,-3,0,3); popMatrix(); } } }
Mit updatePixels() kann das Bild-Array selbst verändert werden.
PImage bild; void setup() { size(585, 439); bild = loadImage("Monitor.jpg"); bild.loadPixels(); for (int i=0; i<bild.width; i++) { for (int j=0; j<bild.height; j++) { bild.pixels[j*bild.width+i] = color(255-brightness(bild.pixels[j*bild.width+i])); } } bild.updatePixels(); } void draw() { image(bild,0,0); }↑
Bilder (Vektoren)
Vektordaten (SVG, z.B. aus Illustrator) mit PShape statt PImage, ansonsten bleibt alles ähnlich (aber: Skalierbarkeit!).
size(600,600); PShape svgbild; svgbild = loadShape("fade.svg"); background(255); shapeMode(CENTER); shape(svgbild, width/2, height/2, 800, 800); shape(svgbild, width/2, height/2, 400, 400); shape(svgbild, width/2, height/2, 200, 200); shape(svgbild, width/2, height/2);
Anders als bei Pixelbildern, lassen sich bei vektorbasierten Bildern die Processing-Styles (fill, stroke) benutzen. Z.B.
size(600,600); PShape svgbild; svgbild = loadShape("fade.svg"); svgbild.disableStyle(); background(255); shapeMode(CENTER); fill(0,0,64); shape(svgbild, width/2, height/2, 800, 800); fill(0,0,128); shape(svgbild, width/2, height/2, 400, 400); fill(0,0,192); shape(svgbild, width/2, height/2, 200, 200); fill(0,0,255); shape(svgbild, width/2, height/2);
Oder in Abhängigket von der Maus (Schaltfläche):
PShape svgbild; void setup() { size(800,400); svgbild = loadShape("fade.svg"); } PShape svgbild; void setup() { size(800, 400); svgbild = loadShape("fade.svg"); } void draw() { background(0); shapeMode(CENTER); shape(svgbild, width/2, height/2, 200, 200); if (mouseX > width/2-100 && mouseX < width/2+100 && mouseY > height/2-100 && mouseY < height/2+100) { svgbild.disableStyle(); } else { svgbild.enableStyle(); } }↑