我必须打印一个圆圈(将其作为半径输入,圆心(cx和cy)的坐标以及必须绘制的角色)。
我为轴和圆写了一系列if块。如果我单独使用它们,它们可以很好地工作,但是当我将它们放在相同的方法中时(我必须只有一种方法)它们以不合需要的方式重叠。
注意:如果角色与轴重叠,则角色具有优先权。
感谢您的帮助!!
public static void drawCircle (int radius, int cx, int cy, char symbol){
//this method verifies that there are no negative values involved(throws error/exception
verifyInput(radius,cx,cy);
//set the values for extension of the axes (aka how long are they)
int xMax = cx+radius+1;
int yMax = cy+radius+1;
for(int j=yMax; j>=0; j--){
for(int i=0; i<=xMax; i++){
//set of if-block to print the axes
if (i == 0 && j == 0){
System.out.print('+');
}
else if(i == 0){
if (j == yMax){
System.out.print('^');
}
if(j != yMax){
System.out.println('|');
}
}
else if(j == 0){
if(i == xMax){
System.out.println('>');
}
if(i != xMax){
System.out.print('-');
}
}
//if block to print the circle
if(onCircle(radius,cx,cy,i,j)==true){
System.out.print('*');
}
else{
System.out.print(' ');
}
}
//I'm not sure if I need to use the print here V
//System.out.println()
}
}
这是onCircle方法;它会验证每个i,j是否在要绘制的圆的轮廓上
public static boolean onCircle (int radius, int cx, int cy, int x, int y){
boolean isDrawn = false;
if(Math.pow(radius,2)<=(Math.pow((x-cx),2)+Math.pow((y-cy),2)) && (Math.pow((x-cx),2)+Math.pow((y-cy),2))<=(Math.pow(radius,2)+1)){
isDrawn = true;
}
return isDrawn;
}
这是我的输出(没有最后一个打印声明:
^ |
*** |
* * |
* * |
* * + - - - - -*-*-*- >
这是我的输出(带有最后一个打印语句
^
|
***
|
* *
|
* *
|
* *
+ - - - - -*-*-*- >
这是我应该得到的: enter image description here
答案 0 :(得分:3)
圆的一般方程:
在Java中可以这样实现:
(x-a)*(x-a) + (y-b)*(y-b) == r*r
在整数坐标系的情况下,它可以像这样四舍五入:
(int) Math.sqrt((x-a)*(x-a) + (y-b)*(y-b)) == r
如果半径 r=12
和圆心 a=5,b=1
,那么圆和轴看起来像这样:
r=12,a=5,b=1
^y
|
|
| * * * * * * * * *
* * * *
* * | * *
* * | * *
* * | * *
* | *
* | *
* | *
* | *
* | *
* | *
* | *
* | * *
------* ------------+---------------------------------* ---->x
* | *
* | *
* | *
* | *
* | *
* | *
* * | * *
* * | * *
* * | * *
* * * *
| * * * * * * * * *
|
|
|
// radius
int r = 12;
// center of the circle
int a = 5, b = 1;
// whitespace
int s = 3;
// print area
int xMin = a-r-s, xMax = a+r+s;
int yMin = b-r-s, yMax = b+r+s;
// output an ASCII circle and axes
System.out.println("r="+r+",a="+a+",b="+b);
for (int y = yMax; y >= yMin; y--) {
for (int x = xMin; x <= xMax; x++) {
if ((int) Math.sqrt((x-a)*(x-a) + (y-b)*(y-b)) == r) {
// circle
System.out.print("* ");
} else if (x == a && y == b) {
// center of the circle
System.out.print("* ");
} else if (x == 0 && y == 0) {
// origin of coordinates
System.out.print("+-");
} else if (x == 0) {
// ordinate axis - y
System.out.print(y == yMax ? "^y" : "| ");
} else if (y == 0) {
// abscissa axis - x
System.out.print(x == xMax ? ">x" : "--");
} else {
// whitespace
System.out.print(" ");
}
}
// new line
System.out.println();
}
另见:
• Print out an ASCII circle and axes
• Print out an ASCII circle of the specified width
答案 1 :(得分:1)
jwaddell 是对的,您的代码只需要 5 次这样的小更新(参见 // <--
之类的评论):
public static void drawCircle(int radius, int cx, int cy, char symbol) {
// this method verifies that there are no negative
// values involved (throws error/exception)
verifyInput(radius, cx, cy);
// set the values for extension of the axes
// (aka how long are they)
int xMax = cx + radius + 1;
int yMax = cy + radius + 1;
for (int j = yMax; j >= 0; j--) {
for (int i = 0; i <= xMax; i++) {
// set of if-block to print the axes
if (onCircle(radius, cx, cy, i, j) == true) { // <-- draw circle first
System.out.print(symbol); // <-- use param 'symbol' here
} else if (i == 0 && j == 0) {
System.out.print('+');
} else if (i == 0) {
if (j == yMax) {
System.out.print('^');
}
if (j != yMax) {
System.out.print('|'); // <-- don't print new line here
}
} else if (j == 0) {
if (i == xMax) {
System.out.print('>'); // <-- don't print new line here
}
if (i != xMax) {
System.out.print('-');
}
} else {
System.out.print(' ');
}
}
System.out.println(); // <-- then add new line here
}
}
您可以像这样优化 onCircle
:
public static boolean onCircle(int radius, int cx, int cy, int x, int y) {
double distance2 = Math.pow((x - cx), 2) + Math.pow((y - cy), 2);
double radius2 = Math.pow(radius, 2);
return radius2 <= distance2 && distance2 <= (radius2 + 1.0d);
}
drawCircle(5, 10, 12, '&');
的结果符合预期:
^
| &&&
| & &
| & &
|
| & &
| & &
| & &
|
| & &
| & &
| &&&
|
|
|
|
|
|
+--------------->
答案 2 :(得分:0)
格式问题似乎是您有时使用System.out.println
,而您应该使用System.out.print
。 System.out.println
将结束当前行,因此每个输出行只应使用一次。因此,您应该在外部(System.out.println
)循环的末尾使用单个空j
语句,并在整个程序的其余部分使用System.out.print
。
您还需要修复水平轴的打印,因为它会打印轴和圆,而不仅仅是圆圈。