繁体   English   中英

如何在2D数组中绘制三角形(Java)

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

对于类项目,我们需要能够在2D字符数组中绘制一个三角形。 从算法上讲,我无法解决该怎么做。

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

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

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

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

我们不能使用任何与绘图相关的现有方法或类。

谢谢你的帮助

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

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

即使我不确定使用什么drawing.setPoint(i, x, myChar); 确实,我认为这个例子可以帮助您。 我将基于char构建一个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之间的距离小于或等于i则在column j需要星号。 也就是说,当| height - column | <= row | 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这样的测试框架,但是现在您可以仅通过运行程序来“测试”。 因此,第一个测试是,它对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)来绘制一个三行三角形,然后可以通过使用循环来改善它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM