2017-02-24 108 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爲這個座標。

這就是爲什麼你得到你的符號繪製。你需要改進你的算法!