我们如何用java绘制?

时间:2013-10-10 21:33:27

标签: java ascii geometry

好的,所以我尝试过去几个小时用ASCII绘制圆圈。我有一组预定的X,Y和Radius。但我不知道如何实施这些中心(H,K)。我设法使用Math.pow()将方程式放在java中,我想使用的等式是(x-h)^ 2 +(y-k)^ 2 = radius ^ 2

这是我到目前为止所做的,如果我使用值h = 11,k = 4,我会得到一个奇怪的形状。

请帮助!

2 个答案:

答案 0 :(得分:1)

这样的事情怎么样?

public static void DrawMeACircle(int posX, int posY, int radius)   
{  
int thickness = 2;

  for (int j = 0; j<posY+radius*2 + thickness;j++)
  {
    for (int i = 0; i<posX+radius*2+thickness; i++)
    {
      if ( Math.abs(Math.pow(Math.pow(i-posX,2) + Math.pow(j-posY,2),.5) - radius*2) < thickness)
      {
        System.out.print("#"); // or X ?
      }
      else
      {
        System.out.print(" ");
      }
      //System.out.print("\n");
    }
    System.out.print("\n");
  }
}

x = 16,y = 11,radius = 5和thickness = 2的结果看起来有点像这样

        #########       
      #############     
     ###############    
    ######## ########   
   ######       ######  
  #####           ##### 
  ####             #### 
 #####             #####
 ####               ####
 ####               ####
 ####               ####
 ###                 ###
 ####               ####
 ####               ####
 ####               ####
 #####             #####
  ####             #### 
  #####           ##### 
   ######       ######  
    ######## ########   
     ###############    
      #############     
        #########       

它伸长的事实可能是字体问题......

为了提供一个“单线”圆圈,无论半径和位置如何,我想说唯一的方法是事后编辑它:

public static void DrawMeACircle(int posX, int posY, int radius) {  
  String [] result = new String [posY+radius*2+1];
  for (int j = 0; j<posY+radius*2+1;j++)
  {
    result[j] = "";
    for (int i = 0; i<posX+radius*2+1; i++)
    {
      float pointDistance = dist(i, j, posX, posY);
      if (pointDistance < radius*2) 
        result[j] +="#"; // or X ?
      else
        result[j]+=" ";
    }
  }
  boolean wholeLine = true;
  for (int j = 0; j < result.length; j++) {
    boolean started = false;
    if (!wholeLine && j < result.length-1 && !result[j+1].contains("#")) 
      wholeLine = true;

    if (!wholeLine)
      for (int i = 0; i < result[j].length()-1; i++) {
        if (result[j].charAt(i) != '#') continue;
        if (!started) 
          started = true;
        else if (started && result[j].charAt(i+1) != '#') {
        }
        else 
          result[j] = result[j].substring(0, i) + " " + result[j].substring(i+1);
      }
    if(wholeLine && result[j].contains("#")) wholeLine = false;
    System.out.println(result[j]);
  }
}
static float dist(int x1, int y1, int x2, int y2) {
  return (int)Math.abs(Math.pow(Math.pow(x1-x2, 2) + Math.pow(y1-y2, 2), .5));
}

哪个(不管你扔什么)都会产生这样的结果:

     #######     
   #         #   
  #           #  
  #           #  
 #             # 
 #             # 
 #             # 
 #             # 
 #             # 
 #             # 
 #             # 
  #           #  
  #           #  
   #         #   
     #######     

答案 1 :(得分:-1)

我不知道究竟应该如何成为你的输出,所以这是我的尝试。

public static void DrawMeACircle(int posX, int posY, int radius) {
    int h = 10; // Initial x position.
    int k = 5; 

    int x = posX - h;
    int y = posY - k;

    for (int i = 0; i <= 2*posX; i++){
        for (int j = 0; j <= 2*posY; j++){
            double dx = (x - i);
            double dy = (y - j);

            if (Math.abs(dx*dx + dy*dy - radius*radius) < 5){
                System.out.print("*");
            }
            else{
                System.out.print(" ");
            }
        }
        System.out.println();
    }
}

使用值posX=15, posY=15, radius=5, h=10 and k =5打印

    #####                  
   #     #                 
  #       #                
 #         #               
 #         #               
 #         #               
 #         #               
 #         #               
  #       #                
   #     #                 
    #####