如何仅使用 characters/symbols 在 c 中打印出一个空心圆

How to print out a hollow circle in c using just characters/symbols

给定用户的圆半径,程序应使用等式 (x^2+y^2=r^2) 打印出圆。

它有效,但我没有得到任何东西:

  1. 为什么圆的点数这么少,有没有办法让点数多一些?
  2. 为什么它看起来更像 ellipse/oval?

代码:

#include <stdio.h>
#include <stdlib.h>
void display(int r){
    int x,y;
    // x and y representing coordinates on an imaginary cartisian plane 
    for(x=-r;x<=r;x++)
    {  
        printf("\t\t\t");//some tabs to make it kinda "centered"
        for(y=-r;y<=r;y++)
        {
            /*if the coordinate:(x,y) is a point of the equation x^2+y^2=r^2 prints the char:*, if 
            not leaves that space empty*/
            if( x*x+y*y == r*r) 
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }
}
int main(){
    int r;
    printf("Enter radius:");
    scanf("%d",&r);
    display(r);
    return 0;
}

为什么圆的点数这么少,有没有办法让点数多一些?

原因是您无法表示小数部分,您在终端中处理整数和字符。您可以将 r 乘以 4(小心溢出)并减小终端的 fontSize 以实现此结果。

为什么它看起来更像 ellipse/oval?

终端中的字符高度大于宽度。原因是能够舒适地阅读它们,也可能与 16/9 分辨率有关。

您可以通过调整方程式再次获得所需的输出...但此时您可能只想使用图形库!除非你掌握一些 ASCII 艺术...

_____  // I used 4 dash horizontally and 3 vertically.
_   _
_____

首先,默认情况下字符的纵横比为 1:2,因此为避免出现椭圆形,您必须每点打印 2 个字符。

而且为了填补点之间的空隙,你必须对这些空隙进行插值 这是一个简单的解决方案:

#include <stdio.h>
#include <stdlib.h>
void display(int r)
{
    int x, y;
    // x and y representing coordinates on an imaginary cartisian plane
    for (x = -r; x <= r; x++)
    {
        printf("\t\t\t"); //some tabs to make it kinda "centered"
        for (y = -r; y <= r; y++)
        {
            if (abs(x * x + y * y - r * r) < r - 1)
                printf("**");
            else
                printf("--");
        }
        printf("\n");
    }

    for (x = -r; x <= r; x++)
    {
        printf("\t\t\t"); //some tabs to make it kinda "centered"
        for (y = -r; y <= r; y++)
        {
            printf("%s%d", (abs(x * x + y * y - r * r) > 10 ? " " : "  "), abs(x * x + y * y - r * r));
        }
        printf("\n");
    }
}
int main()
{
    int r;
    printf("Enter radius:");
    scanf("%d", &r);
    display(r);
    return 0;
}
Enter radius:6
                                **********        
                              **          **      
                            **              **    
                          **                  **  
                        **                      **
                        **                      **
                        **                      **
                        **                      **
                        **                      **
                          **                  **  
                            **              **    
                              **          **      
                                **********   
  1. 条件x*x + y*y == r*r只有在xyr描述直角三角形的边长时才满足。对于整数,只有“毕达哥拉斯三元组”如 3,4,5 和 5,12,13 等满足该条件。

    允许 x*x + y*y 落在以 r*r 为中心的范围内可以绘制更多的点,例如,在 (r-½)² 之间和 (r+½)².

    因为 (r-½)² = r²-r+¼,和 (r+½)² = r²+r+¼, 我们可以忽略 ¼为简单起见,使用范围 r*r-rr*r+r.

#include <stdio.h>
#include <stdlib.h>
void display(int r){
    int x,y;
    int xsq, ysq;
    int rsq = r*r;
    // x and y representing coordinates on an imaginary cartisian plane 
    for(x=-r;x<=r;x++)
    {  
        xsq = x*x;
        printf("\t\t\t");//some tabs to make it kinda "centered"
        for(y=-r;y<=r;y++)
        {
            /*if the coordinate:(x,y) is a point of the equation x^2+y^2=r^2 prints the char:*, if 
            not leaves that space empty*/
            int ysq = y*y;
            int dsq = xsq + ysq;
            if( dsq > rsq - r && dsq < rsq + r)
                printf("*");
            else
                printf(" ");
        }
        printf("\n");
    }
}
int main(){
    int r;
    printf("Enter radius:");
    scanf("%d",&r);
    display(r);
    return 0;
}

Input/output:

$ circle
Enter radius:10
                               *******
                             **       **
                            *           *
                           *             *
                          *               *
                         *                 *
                         *                 *
                        *                   *
                        *                   *
                        *                   *
                        *                   *
                        *                   *
                        *                   *
                        *                   *
                         *                 *
                         *                 *
                          *               *
                           *             *
                            *           *
                             **       **
                               *******

考虑到 (r-½)² 和 (r+½)² 的扩展中被忽略的 ¼,条件可以从 dsq > rsq - r && dsq < rsq + r 更改为 dsq > rsq - r && dsq <= rsq + r。这将稍微改变一些半径的输出。

  1. 圆圈看起来被拉长了,因为字体使用了非正方形的矩形网格。