2017-10-15 5 views
0

上の三角形をペイントこれは私がグリッドに記入する必要があるかでありますグリッドにある色。最初のforループを作成して左上隅に黒い三角形を作成しましたが、別の黒い三角形を作成するために、私が使ったforループは何も描画しません。誰かがグリッドの左側をどのように仕上げるか説明してください。は、グリッド

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

2つの外側ループの間の「カウンタ」。 – Andreas

+0

また、左下の三角形の行にある黒い正方形の数が、グリッドの*幅*と何か関係があるのはなぜですか? – Andreas

答えて

0

あなたのロジックは非常に複雑です。

のは、彼らが重なる場所を使用し、それらの重複のみ、高さがこのような2つの三角形の5考えているとしましょう:

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

最初の行は行0の場合、最初の三角形の中に正方形の数がrow + 1です第2の三角形の正方形の数はheight - rowである。重複のために、正方形の数は、2の低い、すなわち

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

あなたが今、単一のループで左側のためのあなたのロジックを行うことができます。例示する

、このMCVEコードは、座標が黒色に印刷:

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

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

出力は次に、右側のミラーを除いて、同じであり、かつ容易にすることができますコードに加えて、同時に両面を行う:

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

出力

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

グリッドは、スリムなことができれば、あなたはいくつかのチェックを追加するすなわちwidth < height必要があります:あなたがリセットするのを忘れ

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

出力

(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) 
関連する問題