You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用C语言二维数组在终端打印圆形却显示为椭圆的问题排查

终端打印圆形变成椭圆的问题排查

问题描述

尝试用公式 x = r * sin(angle) 和 y = r * cos(angle) 在终端打印圆形,但输出呈现为椭圆,字符图形如下:

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

对应的代码如下:

#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;
}

错误点及修正方案

1. 三角函数的角度单位错误

C语言标准库的sin()和cos()函数接收的是弧度值,但代码里直接传入了角度值(0到360),这会导致坐标计算完全偏离预期。
修正方法:将角度转换为弧度,公式为 弧度 = 角度 * π / 180,代码调整为:

sinAngle = sin(angle * M_PI / 180.0f);
cosAngle = cos(angle * M_PI / 180.0f);

如果编译时M_PI未定义,可以手动添加:#define M_PI 3.14159265358979323846。

2. 终端字符宽高比导致图形拉伸

终端中每个字符的高度通常是宽度的2倍左右(常见1:2比例),垂直方向(对应终端行的y轴)的坐标会被自然拉长,圆形因此变成椭圆。
修正方法:对y方向的坐标进行缩放,抵消终端的宽高比,比如乘以0.5:

int y = (r * cosAngle * 0.5f) + 90;

可根据自己终端的实际比例调整系数(0.4~0.6区间均可)。

3. 循环逻辑冗余且存在问题

代码里的counter++ && angle++写法逻辑冗余,counter变量完全多余,直接简化循环:

for (angle = 0; angle < 360; angle++)

既清晰又避免逻辑错误。

4. 坐标偏移不合理且origin变量未使用

代码定义了origin = 50但未利用,当前x偏移10、y偏移90会让图形靠近终端右下角。若想让圆形居中,可调整偏移值:

int x = (r * sinAngle) + origin;
int y = (r * cosAngle * 0.5f) + origin;

修正后的示例代码

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

#define M_PI 3.14159265358979323846

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 (angle = 0; angle < 360; angle++)
    {
        sinAngle = sin(angle * M_PI / 180.0f);
        cosAngle = cos(angle * M_PI / 180.0f);

        int x = (r * sinAngle) + origin;
        int y = (r * cosAngle * 0.5f) + origin;
    
        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;
}

内容的提问来源于stack exchange,提问作者Abdelrahman Tawfik

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 14:48:26