使用字符JAVA打印圆和xy轴

时间:2017-02-24 02:26:46

标签: java

我必须打印一个圆圈(将其作为半径输入,圆心(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

3 个答案:

答案 0 :(得分:3)

圆的一般方程

Equation of a circle

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
      *             |                                 *       
      *             |                                 *       
      *             |                                 *       
        *           |                               *         
        *           |                               *         
          *         |                             *           
          * *       |                           * *           
            * *     |                         * *             
              * *   |                       * *               
                  * *                   * *                   
                    | * * * * * * * * *                       
                    |                                         
                    |                                         
                    |                                         

Try it online!

// 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.printSystem.out.println将结束当前行,因此每个输出行只应使用一次。因此,您应该在外部(System.out.println)循环的末尾使用单个空j语句,并在整个程序的其余部分使用System.out.print

您还需要修复水平轴的打印,因为它会打印轴和圆,而不仅仅是圆圈。