Optische Täuschung in Java erstellen?

1 Antwort

Ich würde dir empfehlen, dich erst einmal auf den kleinsten Schritt zu konzentrieren. Du musst ein Kästchen/Feld zeichnen können. Da es aber verschiedene Feldtypen gibt, wären ein paar Helferfunktionen nützlich.

void drawField(int x, int y, Color background) {
  // draw field ...
}

void drawMiniSquare(int x, int y, Color background) {
  // draw mini square ...
}
  
enum Orientation { LEFT, RIGHT, TOP, BOTTOM }

void drawAxisField(int x, int y, Color foreground, Color background, Orientation orientation) {
  drawField(x, y, background);

  switch (orientation) {
    case Orientation.LEFT:
      drawMiniSquare(/* ... */, foreground);
      drawMiniSquare(/* ... */, foreground);
      break;
    case Orientation.RIGHT:
      // ...
      break;
    // etc. ...
}                                                      

void drawSideField(int x, int y, Color foreground, Color background, bool leftToRight) {
  drawField(x, y, background);

  // draw field with diagonal mini squares ...
}

Es gibt auf den Zentralachsen Felder mit zwei kleinen Rechtecken, alles andere sind unifarbene Felder oder Felder, die zwei diagonal positionierte Rechtecke (nach links oder rechts ausgerichtet) beinhalten.

Als einzige flexible Faktoren spielen die Ausrichtung der kleinen Rechtecke und die Farbverteilungen eine Rolle. Daher habe ich sie oben auch als Parameter definiert. Für die Felder auf der Achse gibt es vier verschiedene Ausrichtungen, für die zur Seite stehenden nur zwei. Je nach Wert der Parameter müsstest du die Rechtecke an einer anderen Position mit einer anderen Farbe zeichnen.

Der nächste Schritt wäre es, eine einzelne Zeile von dem Gebilde zeichnen zu können. Du kannst dir dafür wieder eine Funktion schreiben.

void drawRow(int numberOfEmptyFields, int row) {
  // ...
}

Die braucht nur Information darüber, wie viele unifarbene (leere) Flächen an den Seiten gezeichnet werden müssen. Die restliche Verteilung kannst du dir mit Hilfe der Gesamtanzahl an Spalten berechnen.

Beispiel für Zeile 2:

Anzahl Spalten = 15
Anzahl leere Felder = 12
15 - 12 = 3 Felder mit Minirechtecken
1 Feld (Zentrum) hat zueinander horizontal parallel positionierte Rechtecke
2 Felder haben zueinander diagonal ausgerichtete Rechtecke

Diese Zusammensetzung kannst du dir nun mit einer / mehreren Schleifen und Verzweigungen Stück für Stück zusammenbauen. Dabei rufst du die obigen Funktionen nacheinander mit den richtigen Argumenten auf, damit sie dir deine Felder richtig zeichnen.

Für den Farbwechsel brauchst du dich nur darauf konzentrieren, ob du gerade in einem geraden oder ungeraden Spaltenindex befindest.

Beispiel:

for (int index = 0; index < 10; ++index) {
  if (index % 2 == 0) {
    System.out.println(index + " ist gerade");
  }
}

Wenn eine Zahl dividiert durch 2 keinen Rest ergibt, ist sie gerade.

Da sich der Farbwechsel schwarz-weiß-schwarz-... aber ebenso vertikal abspielt, müsstest du noch deine aktuelle Zeilenanzahl auf den Spaltenindex addieren.

Zum Nachprüfen:

Row 0, Col 0 => black   0 % 2 = 0
Row 1, Col 0 => white   1 % 2 = 1
Row 2, Col 0 => black   2 % 2 = 0

Row 1, Col 1 => black   2 % 2 = 0
Row 1, Col 3 => black   4 % 2 = 0

Dem Bild zu Folge befinden sich schwarze Felder immer auf geraden Werten und weiße Felder auf ungeraden.

Als letzten Schritt müsstest du deine drawRow-Funktion nur noch so oft aufrufen, wie es Zeilen gibt. Wie im vorherigen Schritt kannst du Schleifen und Verzweigungen einsetzen.

for (int row = 0; row < 15; ++row) {
  if (row == 0 || row == 14) {
    drawRow(15, row);
  }

  // etc. ...
}

Ob du die zentrale x-Achse ebenso in drawRow behandelst oder in der angedeuteten Schleife des letzten Snippets sei dir überlassen.