打印ascii圆+轴问题

时间:2017-02-24 20:32:46

标签: java if-statement ascii-art

该程序在笛卡尔平面上打印一个圆圈。

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

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

有些东西在逃避我......有人可以帮助我找到我的错误吗?

这是我的整个程序(有问题的方法是最后一个,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

正如你在图片中看到的那样,第1和第3个圆圈很好,但是与轴重叠的圆圈是分散的

3 个答案:

答案 0 :(得分: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();

}  
}

答案 1 :(得分: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)

返回 true

然后:

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

还返回 true

因此onCircle(radius,cx,cy,i,j)为此坐标返回 true

这就是你绘制符号的原因。你需要改进你的算法!

答案 2 :(得分:0)

以原点为中心的圆的一般方程

Equation of a circle

Java中可以这样实现:

i*i + j*j == r*r

但是在整数坐标系的情况下,您必须以某种方式舍入这个方程,以便圆的所有点都反映在这个坐标系中:< /p>

(int) Math.sqrt(i*i + j*j) == r

如果 r=8,则圆和轴如下所示:

r=8
        * * * * * * * * *         
      * *       *       * *       
    *           *           *     
  *             *             *   
* *             *             * * 
*               *               * 
*               *               * 
*               *               * 
* * * * * * * * * * * * * * * * * 
*               *               * 
*               *               * 
*               *               * 
* *             *             * * 
  *             *             *   
    *           *           *     
      * *       *       * *       
        * * * * * * * * *         

Try it online!

int r = 8;
System.out.println("r=" + r);
IntStream.rangeClosed(-r, r)
        .peek(i -> IntStream.rangeClosed(-r, r)
                .mapToObj(j -> i == 0 || j == 0 ||
                        (int) Math.sqrt(i*i + j*j) == r ?
                        "* " : "  ")
                .forEach(System.out::print))
        .forEach(i -> System.out.println());

另见:Print out an ASCII star in java