Распечатать круг ASCII указанной ширины

Я пытаюсь изменить следующий код, чтобы получить этот вывод для радиуса 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("");
        }
    }
}

person jDeveloper    schedule 20.03.2021    source источник


Ответы (2)


Вывод выглядит овальным, потому что символы не имеют одинаковой ширины и высоты. Думайте об изображении, что его пиксели не квадратные, а вертикальные прямоугольники. Я позаимствовал c# версию связанного кода @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:

введите здесь описание изображения

Надеюсь, вы сможете перевести его на java.

person saastn    schedule 20.03.2021

Вы можете нарисовать край круга внутри себя и представить Уравнение круга как:

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

Если радиус r=2 и ширина линии w=1, то круг выглядит так:

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

Предположим, что ширина двух символов равна высоте одного символа.

Попробуйте в Интернете!

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

См. также:
Распечатайте круг ASCII и оси с символами
Печать многострочной анимации ASCII в консоли

person Community    schedule 29.03.2021