2017-02-24 11 views
0

このプログラムは、デカルト平面に円を印刷します。print ascii circle + axes問題

入力は、半径、円の中心座標(cx、cy)、円を印刷する文字です。

円の点が軸と重なっている場合、点が優先されます。私はdrawCircleメソッドで軸の印刷のための条件を書きましたが、画像が歪んでいます...

何かが私を逃しています...誰かが私の間違いを見つけるのを助けることができますか?ここで

は私のプログラム全体(の問題を持っている方法は、drawCircle最後の1である)である:

enter image description here

をあなたが見ることができるように:ここでは

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(); 

    } 
} 
} 

は、私が取得していますものです画像では、1番目と3番目の円はうまくいきますが、軸と重なっているものが逸れています

答えて

0

3つの続き文: チェックアウトあなたのdrawCircle方法のこの改訂版:

実際
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、CY = 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この座標はです。

あなたのシンボルが描かれた理由です。あなたのアルゴリズムを改善する必要があります!

関連する問題