【问题标题】:Print out an ASCII circle of the specified width打印出一个指定宽度的ASCII圆
【发布时间】:2021-06-17 19:33:19
【问题描述】:

我正在尝试更改以下代码,以便得到半径 2 的输出:

  *****
***   ***
**     **
***   ***
  *****

任何帮助将不胜感激,因为我快要发疯了!

public class Main {
    public static void main(String[] args) {
        // dist represents distance to the center
        double dist;
        double radius = 2;

        // for horizontal movement
        for (int i = 0; i <= 2 * radius; i++) {
            // for vertical movement
            for (int j = 0; j <= 2 * radius; j++) {
                dist = Math.sqrt(
                        (i - radius) * (i - radius) +
                        (j - radius) * (j - radius));

                // dist should be in the range (radius - 0.5)
                // and (radius + 0.5) to print stars(*)
                if (dist > radius - 0.5 && dist < radius + 0.5)
                    System.out.print("*");
                else
                    System.out.print(" ");
            }
            System.out.println("");
        }
    }
}

【问题讨论】:

    标签: java algorithm formatting geometry ascii-art


    【解决方案1】:

    输出看起来是椭圆形的,因为字符的宽度和高度不同。想象一个图像,它的像素不是正方形,而是垂直的矩形。我借用了@Prasanth Rajendran 链接的代码的 版本,并做了一些修改:

    1. 添加了lineWidth 参数
    2. 添加了xScale 参数,现在每行中的每个1/xScale 字符都相当于1 数据点
    3. 通过添加 [0.5, 0.5] 偏移量将字符位置移动到其中心
    // function to print circle pattern 
    static void printPattern(int radius, int lineWidth, double xScale)
    {
        double hUnitsPerChar = 1 / xScale;
        double hChars = (2 * radius + lineWidth) / hUnitsPerChar;
        double vChars = 2 * radius + lineWidth;
        // dist represents distance to the center 
        double dist;
        double lineWidth_2 = (double)lineWidth / 2;
        double center = radius + lineWidth_2;
        // for vertical movement 
        for (int j = 0; j <= vChars - 1; j++)
        {
            double y = j + 0.5;
            // for horizontal movement 
            for (int i = 0; i <= hChars - 1; i++)
            {
                double x = (i + 0.5) * hUnitsPerChar;
                dist = Math.Sqrt(
                    (x - center) * (x - center) +
                    (y - center) * (y - center));
    
                // dist should be in the range  
                // (radius - lineWidth/2) and (radius + lineWidth/2)  
                // to print stars(*) 
                if (dist > radius - lineWidth_2 &&
                                dist < radius + lineWidth_2)
                    Console.Write("*");
                else
                    Console.Write(" ");
            }
    
            Console.WriteLine("");
        }
    }
    static void Main(string[] args)
    {
        printPattern(2, 1, 2);
        printPattern(10, 3, 2);
    }
    

    现在结果是这样的:

    printPattern(2, 1, 2):
    
      ******
    ***    ***
    **      **
    ***    ***
      ******
    
    printPattern(10, 3, 2):
    
                    **************
                **********************
             ****************************
          ***********            ***********
         ********                    ********
       ********                        ********
      *******                            *******
     *******                              *******
     ******                                ******
    ******                                  ******
    ******                                  ******
    ******                                  ******
    ******                                  ******
    ******                                  ******
     ******                                ******
     *******                              *******
      *******                            *******
       ********                        ********
         ********                    ********
          ***********            ***********
             ****************************
                **********************
                    **************
    

    它们在 CMD 中看起来更好:

    希望你能翻译成

    【讨论】:

      【解决方案2】:

      您可以在自身内部绘制一个圆的,并将圆的方程式表示为:

      double edge = (x*x + y*y) / (double) r - r;
      

      如果半径r=2和线宽w=1,那么圆是这样的:

        ******  
      ****  ****
      **      **
      ****  ****
        ******  
      r=2,w=1.0
      

      假设两个字符的宽度等于一个字符的高度。

      Try it online!

      // radius
      int r = 12;
      // line width
      double w = 3;
      // assume that the width of two characters
      // is equal to the height of one character
      for (int y = -r; y <= r; y++) {
          for (int x = -r; x <= r; x++) {
              double edge = (x*x + y*y) / (double) r - r;
              // edge is inside the circle
              if (edge > - w*4/3 && edge < 1) {
                  System.out.print("**");
              } else {
                  System.out.print("  ");
              }
          }
          System.out.println();
      }
      System.out.println("r="+r+",w="+w);
      

      输出:

                        **************                  
                    **********************              
                ******************************          
              **********              **********        
            ********                      ********      
          ********                          ********    
          ******                              ******    
        ******                                  ******  
        ******                                  ******  
      ******                                      ******
      ******                                      ******
      ******                                      ******
      ******                                      ******
      ******                                      ******
      ******                                      ******
      ******                                      ******
        ******                                  ******  
        ******                                  ******  
          ******                              ******    
          ********                          ********    
            ********                      ********      
              **********              **********        
                ******************************          
                    **********************              
                        **************                  
      r=12,w=3.0
      

      另见:
      Print out an ASCII circle and axes with characters
      Printing multiline ASCII animation in the console

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多