这就是我需要填写网格的方法:
对于这种方法,我需要像上面的图片一样填写网格,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++;
}
}
答案 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)