2017-02-24 107 views
0

该程序在笛卡尔平面打印圆圈。打印ascii圈+轴问题

输入是:半径,圆心的坐标(cx,cy)以及我们想要打印圆的字符。

如果圆的点与轴重叠,则点优先。我写了一个在方法drawCircle中打印轴的条件,但图像失真...

有些东西在躲避我...有人能帮我找到我的错误吗?

这里是我的整个程序(有问题的方法是最后一个,画圆):

public class Circle { 

public static void main (String[] args){ 

    System.out.println(onCircle(1,2,3,4,5)); 

    drawCircle(1,3,3,'*'); 
    drawCircle(3,3,3,'*'); 
    drawCircle(5,10,12,'*'); 

} 
//Question 1A 
public static boolean onCircle (int radius, int cx, int cy, int x, int y){ 
    //default answer is false, but if the inequality holds then it is set to true 
    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; 
} 

//Question 1B 
public static void verifyInput (int radius, int cx, int cy){ 
    //if radius is negative, display error message 
    if (radius<=0){ 
    throw new IllegalArgumentException(" The radius of the circle must be a positive number."); 
    } 
    //if the center of the circle with radius 'radius' causes the circle to 'overflow' into other quadrants 
    //, display error message 
    if ((cx-radius)<0 || (cy-radius)<0){ 
    throw new IllegalArgumentException("the circle with requested parameters does not fit in the quadrant." 
             +"Consider moving the center of the circle further from the axes."); 
    } 
} 

//Question 1C 
public static void drawCircle (int radius, int cx, int cy, char symbol){ 
    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 && onCircle(radius,cx,cy,i,j)==false){ 
      System.out.print('|'); 
     } 
     } 

     else if(j == 0){ 
     if(i == xMax){ 
      System.out.print('>'); 
     } 
     if(i != xMax && onCircle(radius,cx,cy,i,j) == false){ 
      System.out.print('-'); 
     } 
     } 

     //if block to print the circle 
     //verify for each coordinate (i,j) in the quadrant if they are on circle 
     //if =true print symbol, if =false print empty character 
     if(onCircle(radius,cx,cy,i,j)==true){ 
     System.out.print(symbol); 
     } 
     else{ 
     System.out.print(' '); 
     } 

    } 
    System.out.println(); 

    } 
} 
} 

这里是我得到:

enter image description here

正如你所看到的在图片中,第一和第三圈都很好,但与轴重叠一个distored

回答

0

你错过了3 continue语句: 检查出你的画圆法的修订后的版本:

public static void drawCircle (int radius, int cx, int cy, char symbol){ 
    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('+'); 
    continue; 
    } 
    else if(i == 0){ 
    if (j == yMax){ 
     System.out.print('^'); 
    } 
    if(j != yMax && onCircle(radius,cx,cy,i,j)==false){ 
     System.out.print('|'); 
     continue; 
    } 
    } 

    else if(j == 0){ 
    if(i == xMax){ 
     System.out.print('>'); 
    } 
    if(i != xMax && onCircle(radius,cx,cy,i,j) == false){ 
     System.out.print('-'); 
     continue; 
    } 
    } 

    //if block to print the circle 
    //verify for each coordinate (i,j) in the quadrant if they are on circle 
    //if =true print symbol, if =false print empty character 
    if(onCircle(radius,cx,cy,i,j)==true){ 
    System.out.print(symbol); 
    } 
    else{ 
    System.out.print(' '); 
    } 

} 
System.out.println(); 

} 
} 
+0

非常感谢!一点点新的编码,所以我有时会忘记这些事情。 –

+0

不客气。我们都在那里。祝你好运。 – alawand

0

其实在调试时,你onCircle方法得到的x = 0和Y = 4,CX = 3,Y = 3:

你有:

Math.pow(radius=3,2) = 9 
Math.pow((x - cx), 2) = 9 
Math.pow((y - cy), 2) = 1 

因此

Math.pow(radius, 2) <= Math.pow((x - cx), 2) + Math.pow((y - cy), 2)

返回

然后:

(Math.pow((x-cx),2) = 9 
Math.pow((y-cy),2)) = 1 
(Math.pow(radius,2)+1)) = 10 

因此

(Math.pow((x-cx),2)+Math.pow((y-cy),2)) <= (Math.pow(radius,2)+1)) 

返回也

因此onCircle(半径,CX,CY,I,J)返回true为这个坐标。

这就是为什么你得到你的符号绘制。你需要改进你的算法!