在网格上绘制一个三角形

时间:2017-10-15 16:44:31

标签: java for-loop grid

这就是我需要填写网格的方法:

image

对于这种方法,我需要像上面的图片一样填写网格,helperField meethod将while网格描绘成某种颜色。我做了第一个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++;
    }
}

1 个答案:

答案 0 :(得分:0)

你的逻辑过于复杂。

假设高度为5.想象这样的两个三角形,然后将它们重叠并仅用于它们重叠的位置:

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

如果第一行是第0行,则第一个三角形中的方块数为row + 1,第二个三角形中的方格数为height - row。对于重叠,平方数是两者中的较低者,即

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

现在,您可以在一个循环中为左侧执行逻辑。

为了说明,这个MCVE代码将坐标打印为黑色:

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

输出

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