如何在二维数组中绘制三角形 (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);
的作用,但我认为这个例子会让你继续下去。我将基于 char
s.
构建一个 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
之间的距离小于或等于 [=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)
来绘制一个三行三角形,然后你可以通过使用循环来改进它。
对于 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);
的作用,但我认为这个例子会让你继续下去。我将基于 char
s.
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
之间的距离小于或等于 [=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)
来绘制一个三行三角形,然后你可以通过使用循环来改进它。