我正在尝试使用以下公式将圆圈打印到终端:
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;
}
我在这里做错了什么?
正如上面所讨论的,你的字体的宽高比是 ~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 度,然后镜像它。