2017-10-15 17 views
0

Voilà comment je dois remplir la grille:Peindre un triangle sur une grille

image

Pour cette méthode, je dois remplir la grille comme l'image ci-dessus, le helperField meethod peint le tout grille une certaine couleur. J'ai fait la première boucle for pour créer un triangle noir dans le coin en haut à gauche, mais pour faire un autre triangle noir en dessous, la boucle for que j'ai utilisée ne dessine rien. Quelqu'un pourrait-il expliquer comment je pourrais finir le côté gauche de la grille?

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

Vous avez oublié de réinitialiser 'counter' entre les deux boucles externes. – Andreas

+0

En outre, pourquoi le nombre de carrés noirs dans une rangée pour le triangle inférieur gauche a-t-il quelque chose à voir avec la * largeur * de la grille? – Andreas

Répondre

0

Votre logique est trop compliquée.

Disons que la hauteur est 5. Pensez à deux triangle comme celui-ci, puis se chevaucher et utiliser uniquement là où ils se chevauchent:

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

Si la première ligne est la ligne 0, puis nombre de places dans le premier triangle est row + 1 et le nombre de carrés dans le deuxième triangle est height - row. Pour le recouvrement, le nombre de places est le plus faible des deux, à savoir

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

Vous pouvez maintenant faire votre logique pour le côté gauche dans une seule boucle.

Pour illustrer, ce MCVE code affiche les coordonnées à la couleur noire:

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(); 
} 

Sortie

(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) 

Maintenant, le côté droit est le même, sauf en miroir, et peut être facilement ajouté au code, pour faire les deux côtés en même temps:

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(); 
} 

Sortie

(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) 

Si la grille peut être mince, c.-à-width < height, alors vous devez ajouter quelques contrôles:

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(); 
} 

Sortie

(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)