使用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
相关产品推荐
相关产品推荐

