2017-10-15 3 views
0

Dies ist, wie ich in das Netz füllen müssen:Malerei ein Dreieck auf einem Gitter

image

Für diese Methode muss ich oben im Raster wie das Bild zu füllen, die helperField meethod die während malt Raster eine bestimmte Farbe. Ich habe die erste for-Schleife gemacht, um ein schwarzes Dreieck in der oberen linken Ecke zu erzeugen, aber um ein weiteres schwarzes Dreieck darunter zu bilden, zeichnet die for-Schleife, die ich verwendete, nichts. Könnte jemand bitte erklären, wie ich die linke Seite des Gitters beenden könnte.

private static void drawHourGlassville(Grid_3x5 grid) { 
    helperField(grid, Color.GREEN); 

    // for left side triangle 
    int counter = 0; 
    for (int row=0; row < grid.getHt()-counter; row ++) { 
     for (int col= 0; col <= row; col++) { 
      grid.setColor(row, col, Color.BLACK); 
     } 
     counter++; 
    } 
     for (int row=grid.getHt()/2+2; row < grid.getHt()-counter; row ++) { 
      for (int col=grid.getWd()/3-1; col <= row; col--) { 
       grid.setColor(row, col, Color.BLACK);  
     } 
     counter++; 
    } 
} 
+0

Sie haben vergessen zu zurücksetzen "counter" zwischen den beiden äußeren Schleifen. – Andreas

+0

Warum hat die Anzahl der schwarzen Quadrate in einer Reihe für das untere linke Dreieck auch etwas mit der * Breite * des Gitters zu tun? – Andreas

Antwort

0

Ihre Logik ist übermäßig kompliziert.

Sagen wir Höhe 5. Denken Sie an zwei Dreieck so ist, überlappen sie dann und nur verwenden, wenn sie sich überlappen:

*  ***** * 
**  ****  ** 
***  ***  *** 
****  **  ** 
***** *  * 

Wenn die erste Zeile Zeile 0 ist, dann Anzahl von Plätzen in der ersten Dreieck ist row + 1 und die Anzahl der Quadrate im zweiten Dreieck ist height - row. Für die Überlappung, die Anzahl der Plätze ist die untere der beiden, das heißt

Math.min(row + 1, height - row) 

Sie können jetzt Ihre Logik für die linke Seite in einer einzigen Schleife.

Zur Veranschaulichung dieses MCVE Code druckt die Koordinaten schwarz zu färben:

int height = 9; 

for (int row = 0; row < height; row++) { 
    int cols = Math.min(row + 1, height - row); 
    for (int col = 0; col < cols; col++) { 
     System.out.printf("(%d,%d) ", col, row); 
    } 
    System.out.println(); 
} 

Ausgabe

(0,0) 
(0,1) (1,1) 
(0,2) (1,2) (2,2) 
(0,3) (1,3) (2,3) (3,3) 
(0,4) (1,4) (2,4) (3,4) (4,4) 
(0,5) (1,5) (2,5) (3,5) 
(0,6) (1,6) (2,6) 
(0,7) (1,7) 
(0,8) 

Jetzt ist die rechte Seite gleich, außer gespiegelt ist, und kann leicht sein hinzugefügt, um beide Seiten gleichzeitig zu tun:

int height = 9, width = 15; 

for (int row = 0; row < height; row++) { 
    int cols = Math.min(row + 1, height - row); 
    for (int col = 0; col < cols; col++) { 
     System.out.printf("(%d,%d) ", col, row); 
     System.out.printf("(%d,%d) ", width - col - 1, row); 
    } 
    System.out.println(); 
} 

Ausgabe

(0,0) (14,0) 
(0,1) (14,1) (1,1) (13,1) 
(0,2) (14,2) (1,2) (13,2) (2,2) (12,2) 
(0,3) (14,3) (1,3) (13,3) (2,3) (12,3) (3,3) (11,3) 
(0,4) (14,4) (1,4) (13,4) (2,4) (12,4) (3,4) (11,4) (4,4) (10,4) 
(0,5) (14,5) (1,5) (13,5) (2,5) (12,5) (3,5) (11,5) 
(0,6) (14,6) (1,6) (13,6) (2,6) (12,6) 
(0,7) (14,7) (1,7) (13,7) 
(0,8) (14,8) 

Wenn das Raster schlank sein kann, das heißt width < height, dann müssen Sie einige Prüfungen hinzu:

int height = 9, width = 5; 

for (int row = 0; row < height; row++) { 
    int cols = Math.min(row + 1, height - row); 
    for (int col = 0; col < cols; col++) { 
     int col2 = width - col - 1; 
     if (col <= col2) 
      System.out.printf("(%d,%d) ", col, row); 
     if (col2 > col) 
      System.out.printf("(%d,%d) ", col2, row); 
    } 
    System.out.println(); 
} 

Ausgabe

(0,0) (4,0) 
(0,1) (4,1) (1,1) (3,1) 
(0,2) (4,2) (1,2) (3,2) (2,2) 
(0,3) (4,3) (1,3) (3,3) (2,3) 
(0,4) (4,4) (1,4) (3,4) (2,4) 
(0,5) (4,5) (1,5) (3,5) (2,5) 
(0,6) (4,6) (1,6) (3,6) (2,6) 
(0,7) (4,7) (1,7) (3,7) 
(0,8) (4,8)