用 C 中的二维数组在终端上打印一个圆

问题描述 投票:0回答:1

我正在尝试使用以下公式将圆圈打印到终端:

x = r * sin(角度) && y = r * cos(角度)

但由于某种原因,输出圆呈椭圆形而不是完美的圆..

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

我不知道这是怎么发生的,是我的代码有问题还是我的公式有问题?

代码如下:

#include <stdio.h>
#include <math.h>
#include <string.h>

int main(void)
{
    float angle = 0;
    float sinAngle, cosAngle;

    int r = 10;
    int origin = 50;

    static char plane[100][100];
    memset(plane, ' ', sizeof(plane));
    
    for (float counter = 0; counter < 360; counter++ && angle++)
    {
        sinAngle = sin(angle);
        cosAngle = cos(angle);

        int x = (r * sinAngle) + 10;
        int y = (r * cosAngle) + 90;
    
        plane[y][x] = '#';
    }
        
    for (int counter_1 = 0; counter_1 < 100; counter_1++)
    {
        for (int counter_2 = 0; counter_2 <100; counter_2++)
        {
            printf("%c", plane[counter_1][counter_2]);
        }

        printf("\n");
    }
    
    return 0;
}

我在这里做错了什么?

c ascii trigonometry coordinate-systems
1个回答
0
投票

正如上面所讨论的,你的字体的宽高比是 ~2 的倍数 x。使用常量和 sizeof 而不是魔法值。最小化变量范围。消除了

counter
变量。调整 X_OFFSET 和 Y_OFFSET 以避免剪裁。添加剪辑以避免意外越界写入。使用
round()
比截断
x
y
得到更好的圆。

#include <math.h>
#include <stdio.h>
#include <string.h>

#define R 10
#define X_OFFSET 20
#define X_LEN 100
#define Y_OFFSET 80
#define Y_LEN 100
#define ASPECT_RATIO 2

int main(void) {
    char plane[Y_LEN][X_LEN];
    memset(plane, ' ', sizeof plane);
    for (int angle = 0; angle < 360; angle++) {
        int x = round(ASPECT_RATIO * (R * sin(angle)) + X_OFFSET);
        if(x >= X_LEN)
            x = X_LEN - 1;
        int y = round((R * cos(angle)) + Y_OFFSET);
        if(y >= Y_LEN)
            y = Y_LEN - 1;
        plane[y][x] = '#';
    }
    for (int counter_1 = 0; counter_1 < Y_LEN; counter_1++) {
        for (int counter_2 = 0; counter_2 < X_LEN; counter_2++)
            printf("%c", plane[counter_1][counter_2]);
        printf("\n");
    }
    return 0;
}

结果:

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

如果您愿意,可以将

cos(angle)
替换为
sin(angle + M_PI/2)
(在我的系统上,我必须先
#define __USE_OPEN
在包含 M_PI 常量的 math.h 之前)。

圆是对称的,所以你可以只计算,比如说,只有 45 度,然后镜像它。

© www.soinside.com 2019 - 2024. All rights reserved.