[英]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 = 5
与column 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.