Files
zeichenmaschine/examples/zm_gallery/Gallery.java

258 lines
6.0 KiB
Java

import schule.ngb.zm.Color;
import schule.ngb.zm.Zeichenmaschine;
/**
* Eine Bildergallerie von Bildern eines Informatikkurses des 10. Jahrgangs.
*/
public class Gallery extends Zeichenmaschine {
public static void main(String[] args) {
new Gallery();
}
public void setup() {
setSize(600, 600);
setTitle("ZM: Gallery");
}
/**
* Wählt ein zufälliges Bild aus und zeigt es an.
*/
public void draw() {
drawRandom();
}
/**
* Zeigt ein zufälliges Bild an.
*/
public void drawRandom() {
switch (random(0, 4)) {
case 0:
rainbow();
break;
case 1:
snowman();
break;
case 2:
deathstar();
break;
case 3:
prideflag();
break;
}
}
/**
* Bei Betätigen der Leertaste ein Zufallsbild anzeigen.
*/
public void keyPressed() {
if (keyCode == 32) {
drawRandom();
}
}
/**
* Startet eine fortlaufende Präsentation aller Bilder.
*
* @param pWartezeit Die Wartezeit zum nächsten Bildwechsel in Millisekunden.
*/
public void slideshow(int pWartezeit) {
int i = 0;
while (true) {
switch (i) {
case 0:
rainbow();
break;
case 1:
snowman();
break;
case 2:
deathstar();
break;
case 3:
prideflag();
break;
}
i = (i + 1) % 4;
delay(pWartezeit);
}
}
/**
* Regenbogen
* <p>
* von
*/
public void rainbow() {
// Blauer Hintergrund
drawing.clear(60, 155, 217);
// Einige Werte berechnen, um Bild an Bildgröße anzupassen
double size = (width + height) * 0.03333;
double r = width / 2.0;
// Kleiner werdende Kreise in den Farben des Bogens zeichnen
drawing.noStroke();
drawing.setFillColor(207, 71, 67);
drawing.circle(width / 2.0, height, r - 1 * size);
drawing.setFillColor(235, 134, 42);
drawing.circle(width / 2.0, height, r - 2 * size);
drawing.setFillColor(234, 181, 58);
drawing.circle(width / 2.0, height, r - 3 * size);
// Mitte mit "himmelfarbe" übermalen, um Ringe zu erzeugen
drawing.setFillColor(60, 155, 217);
drawing.circle(width / 2.0, height, r - 4 * size);
// Sonne zeichnen
drawing.setFillColor(232, 200, 52);
drawing.circle(width * 0.8333, size * 2.6666, size * 2);
// Bild auf Leinwand übertragen
redraw();
}
/**
* LGBTQ-Flagge
* <p>
* von
*/
public void prideflag() {
// Schwarzer Hintergrund
drawing.clear(0);
drawing.setStrokeColor(0);
// Farben der Streifen festlegen
Color[] colors = new Color[] {
RED, ORANGE, YELLOW, GREEN, BLUE, PURPLE
};
// Breite der Streifen an Bildgröße anpassen
double size = height * 0.06666;
double borderX = width / 6.0, borderY = height / 6.0;
// Flaggenstab zeichnen
drawing.setFillColor(BROWN);
drawing.rect(borderX, borderY, size, height - 2 * borderY, NORTHWEST);
// Streifen zeichnen
for (int i = 0; i < colors.length; i++) {
drawing.setFillColor(colors[i]);
drawing.rect(borderX, borderY + i * size, width - 2 * borderX, size, NORTHWEST);
}
// Bild auf Leinwand übertragen
redraw();
}
/**
* Todesstern
* <p>
* von Niklas, Henry und Ben
*/
public void deathstar() {
// Sternenhimmel zeichnen
drawing.clear(0);
drawing.noStroke();
drawing.setFillColor(WHITE);
// Zufällig erzeugte Sterne
for (int i = 0; i < (width + height) / 4; i++) {
drawing.circle(random(0.0, width), random(0.0, height), random(1, 3));
}
// Einige Werte berechnen, die später verwendet werden, um
// die Zeichnung an die Bildschirmgröße anzupassen.
double radius = limit(width * 0.6666, 0.0, height * 0.6666) / 2.0;
double w2 = width / 2.0, h2 = height / 2.0;
double r2 = radius / 2.0,
r3 = radius / 3.0, r4 = radius / 4.0,
r5 = radius / 5.0, r10 = radius / 10.0;
// Korpus zeichnen
drawing.setFillColor(128);
drawing.circle(width / 2.0, height / 2.0, radius);
// Graben am Äquator zeichnen
drawing.setStrokeColor(0);
drawing.setStrokeWeight(1.4);
drawing.arc(width / 2.0, height / 2.0, radius + radius, r2, 180, 360);
// Schüssel zeichnen
drawing.setFillColor(96);
drawing.circle(w2 + r2, h2 - r3, r4);
drawing.setFillColor(84);
drawing.circle(w2 + r2 + 2, h2 - r3 - 2, r10);
// Strahlen des Lasers zeichnen
int beams = 8; // Anzahl Strahlen
for (int i = 0; i < beams; i++) {
drawing.setStrokeColor(GREEN);
drawing.setStrokeType(SOLID);
drawing.setStrokeWeight(1.6);
drawing.line(
w2 + r2 - r4 * cos(radians(360 / beams * i)),
h2 - r3 + r4 * sin(radians(360 / beams * i)),
w2 + r2 + 2 + r5,
h2 - r3 - 2 - r5);
drawing.setStrokeType(DASHED);
drawing.setStrokeWeight(3.0);
drawing.line(
w2 + r2 - r4 * cos(radians(360 / beams * i)),
h2 - r3 + r4 * sin(radians(360 / beams * i)),
w2 + r2 + 2 + r5,
h2 - r3 - 2 - r5);
drawing.setStrokeColor(WHITE);
drawing.setStrokeType(SOLID);
drawing.setStrokeWeight(1.0);
drawing.line(
w2 + r2 - r4 * cos(radians(360 / beams * i)),
h2 - r3 + r4 * sin(radians(360 / beams * i)),
w2 + r2 + 2 + r5,
h2 - r3 - 2 - r5);
}
// Hauptstrahl
drawing.setStrokeColor(GREEN);
drawing.setStrokeType(SOLID);
drawing.setStrokeWeight(4);
drawing.line(w2 + r2 + 2 + r5, h2 - r3 - 2 - r5, width, h2 - w2 + radius / 6.0);
drawing.setStrokeWeight(1);
drawing.setStrokeColor(255);
drawing.line(w2 + r2 + 2 + r5, h2 - r3 - 2 - r5, width, h2 - w2 + radius / 6.0);
// Bild auf Leinwand übertragen
redraw();
}
/**
* Schneemann
* <p>
* von
*/
public void snowman() {
// Hellblauer Hintergrund
drawing.clear(219, 253, 255);
drawing.noStroke();
drawing.setFillColor(255);
// Drei Schneekugeln
drawing.circle(width / 2.0, height - 100, 100);
drawing.circle(width / 2.0, height - 180 - 60, 60);
drawing.circle(width / 2.0, height - 180 - 110 - 40, 40);
// Zwei Augen
drawing.setFillColor(0);
drawing.circle(width / 2.0 - 15, height - 345, 4);
drawing.circle(width / 2.0 + 15, height - 345, 4);
// Nase
drawing.setFillColor(255, 147, 0);
drawing.triangle(width / 2.0, height - 335, width / 2.0 - 5, height - 330, width / 2.0 + 5, height - 330);
// Bild auf Leinwand übertragen
redraw();
}
}