如何在二维数组中绘制三角形 (Java)

How to draw a triangle in a 2D array (Java)

对于 class 项目,我们需要能够在二维字符数组中绘制三角形。从算法上讲,我不知道该怎么做。

我目前的代码是这样的(但它不起作用):

public void fill() {
        for (int i = 0; i < h; i++) {
            double x=h;
            while(x<=0){
                drawing.setPoint(i, x, myChar);
                x=Math.ceil(x/2);
            }
        }
    }

我希望输出看起来像这样:

....*....
...***...
..*****..
.*******.
*********

我们不能使用任何预先存在的方法或 class与绘图相关的方法。

感谢您的帮助

根据您的绘图,您需要 9 列 5 行。所以,

int height = 5;
int width = 2*height - 1;

虽然我不确定 drawing.setPoint(i, x, myChar); 的作用,但我认为这个例子会让你继续下去。我将基于 chars.

构建一个 String
char fill = '*';
char blank = '.';

我将从 0 开始行,从 1 开始列,以使数学更清楚。

对于 row = 0....*.... 你需要在 column = 5 中获得一颗星。

对于 row = 1...***... 您需要 column = 4,5,6 中的三颗星。

对于 row = 3.*******. 您需要 column = 2,3,4,5,6,7,8 中的七颗星。

请注意,对于 row i,如果 height = 5column j 之间的距离小于或等于 [=30=,则需要在 column j 中添加一个星号].即当| height - column | <= row

for (int row = 0; row < height; row ++) {
    StringBuilder line = new StringBuilder(width);
    for (int column = 1; column <= width; column ++) {
        char out = Math.abs(column - height) <= row ? fill : blank;
        line.append(out);
    }
    System.out.println(line);
}

这会产生

....*....
...***...
..*****..
.*******.
*********

我假设您可以使用 Math.abs,因为您的示例有 Math.ceil。如果不是,您可以将 Math.abs 转换为 if 语句。

有很多方法可以解决这个问题,您已经看到了一个逐行绘制图片的答案。

我假设您已经有了创建 char[][] 并将该数组数组中的字符打印到屏幕的例程。看起来您也已经有了 setPoint() 方法,可以在结构中插入一个点。

作为初学者,我认为给你一个解决方案对你没有帮助。需要指点正确的方向,自己解决。

现在很多有经验的程序员都在使用测试驱动设计,你可以从中学习:从一个简单的案例开始,为它创建一个测试,让那个测试通过,重复更多的测试,直到没有更多的测试可以写。

最终你应该学习像 jUnit 这样的测试框架,但现在你可以 "test" 只需 运行 编译你的程序。所以第一个测试是,它对 height == 1 有效吗?

您可以通过此测试(目前这意味着,运行 程序并查看输出是否正确):

   public void drawTriangle(int height) {
        drawing.setPoint(0,5,'*')
   }

任务完成。

现在让它适用于 height==2:

   public void drawTriangle(int height) {
      drawing.setPoint(0,5,'*');
      if(height == 2) {
         drawing.setPoint(1,4,'*');
         drawing.setPoint(1,5,'*');
         drawing.setPoint(1,6,'*');
      }
   }

这仍然适用于 height == 1,但也适用于 height == 2

但是您可以立即看到循环替换第二行的这三个命令的机会。所以:

   public void drawTriangle(int height) {
      drawing.setPoint(0,5,'*');
      if(height == 2) {
         for(int 4; i<7; i++) {
            drawing.setPoint(1,i,'*');
         }
      }
   }

...您可以将其提取到一个方法中:

   public void drawTriangle(int height) {
      drawing.setPoint(0,5,'*');
      if(height == 2) {
          drawRow2();
      }
   }

   private void drawRow2() {
      for(int 4; i<7; i++) {
         drawing.setPoint(1,i,'*');
      }
   }

这称为重构 -- 写一些可以工作但不是最好的方式,测试它以确保它工作,然后一步一步地改变它的编写方式一次,所以它仍然有效,但以更整洁的方式。

希望你能看到这是怎么回事。您可以将 drawRow2() 修改得更通用 -- drawRow(int rowNumber),并逐渐用从 rowNumber 派生的变量替换其中的文字数字。然后你可以使用 drawRow(0) 绘制第一行,并使用 drawRow(1) 绘制第二行。然后你可以通过添加 drawRow(2) 来绘制一个三行三角形,然后你可以通过使用循环来改进它。