圆形的参数方程如下:

根据这个,编写 EasyX 代码如下:
#include <graphics.h> // EasyX图形库头文件
#include <conio.h> // 用于_getch()
#include <math.h>
#define RAD 100
int main()
{
int x,y;
// 初始化640x480像素的图形窗口
initgraph(640, 480);
for (int i = 0; i < 360; i++) {
x = 320 + RAD * sin(i * 3.1415 / 180); // sin 用弧度做参数
y= 240+ RAD * cos(i * 3.1415 / 180); // cos 用弧度做参数
putpixel(x, y, RED);
}
// 保持窗口显示
_getch();
// 关闭图形窗口
closegraph();
return 0;
}
运行结果:

此外,这里再给出一个奇怪/低效的算法。基于如下限制:所有的点在八个方向上只存在两个点与之相近(换句话,一个像素的线绘制出来的圆形),基于此限制,设计算法如下:
- 给出起始点坐标(Xorg,Yorg);
- 生成8个方向的坐标,计算这些点位和圆心的距离,然后选择最接近半径的作为下一个点的坐标;
- 重复上述动作计算出所有的点(不过我还没有想明白怎么通过公式计算出点的数量)
#include <graphics.h> // EasyX图形库头文件
#include <conio.h> // 用于_getch()
#include <math.h>
//#include <stdio.h>
#define Xcenter 320
#define Ycenter 240
#define RAD 100
// 计算 (x,y) 到圆心的距离
double CalculateDistance(int x, int y)
{
return (sqrt((x - Xcenter) * (x - Xcenter) + (y - Ycenter) * (y - Ycenter)));
}
// 找到下一个点位
// 输入当前点位坐标 (Xcurrent,Ycurrent)
// 前一个点位坐标 (Xlast,Ylast
void FindNextPoint(int Xcurrent, int Ycurrent, int Xlast, int Ylast, int *Xnext, int *Ynext)
{
double gap= 1000000000.0;
double tmp;
// 左
if ((Xcurrent - 1 != Xlast) || (Ycurrent != Ylast)) {
tmp = CalculateDistance(Xcurrent - 1, Ycurrent);
tmp = fabs(tmp - RAD);
if (gap > tmp) {
gap = fabs(CalculateDistance(Xcurrent - 1, Ycurrent) - RAD);
*Xnext = Xcurrent - 1;
*Ynext = Ycurrent;
}
}
// 左上
if ((Xcurrent-1 != Xlast) || (Ycurrent-1!= Ylast)) {
if (gap > fabs(CalculateDistance(Xcurrent - 1, Ycurrent-1) - RAD)) {
gap = fabs(CalculateDistance(Xcurrent - 1, Ycurrent-1) - RAD);
*Xnext = Xcurrent - 1;
*Ynext = Ycurrent-1;
}
}
// 上
if ((Xcurrent!= Xlast) || (Ycurrent - 1 != Ylast)) {
if (gap > fabs(CalculateDistance(Xcurrent, Ycurrent - 1) - RAD)) {
gap = fabs(CalculateDistance(Xcurrent, Ycurrent - 1) - RAD);
*Xnext = Xcurrent;
*Ynext = Ycurrent - 1;
}
}
// 右上
if ((Xcurrent+1 != Xlast) || (Ycurrent - 1 != Ylast)) {
if (gap > fabs(CalculateDistance(Xcurrent+1, Ycurrent - 1) - RAD)) {
gap = fabs(CalculateDistance(Xcurrent+1, Ycurrent - 1) - RAD);
*Xnext = Xcurrent+1;
*Ynext = Ycurrent - 1;
}
}
// 右
if ((Xcurrent + 1 != Xlast) || (Ycurrent != Ylast)) {
if (gap > fabs(CalculateDistance(Xcurrent + 1, Ycurrent) - RAD)) {
gap = fabs(CalculateDistance(Xcurrent + 1, Ycurrent) - RAD);
*Xnext = Xcurrent + 1;
*Ynext = Ycurrent;
}
}
// 右下
if ((Xcurrent + 1 != Xlast) || (Ycurrent+1 != Ylast)) {
if (gap > fabs(CalculateDistance(Xcurrent + 1, Ycurrent+1) - RAD)) {
gap = fabs(CalculateDistance(Xcurrent + 1, Ycurrent+1) - RAD);
*Xnext = Xcurrent + 1;
*Ynext = Ycurrent + 1;
}
}
// 下
if ((Xcurrent != Xlast) || (Ycurrent +1!= Ylast)) {
if (gap > fabs(CalculateDistance(Xcurrent, Ycurrent+1) - RAD)) {
gap = fabs(CalculateDistance(Xcurrent, Ycurrent+1) - RAD);
*Xnext = Xcurrent;
*Ynext = Ycurrent+1;
}
}
// 左下
if ((Xcurrent-1 != Xlast) || (Ycurrent + 1 != Ylast)) {
if (gap > fabs(CalculateDistance(Xcurrent-1, Ycurrent + 1) - RAD)) {
gap = fabs(CalculateDistance(Xcurrent-1, Ycurrent + 1) - RAD);
*Xnext = Xcurrent-1;
*Ynext = Ycurrent + 1;
}
}
}
int main()
{
int x=0, y= 0;
int Xlast = Xcenter - RAD, Ylast = Ycenter;
int Xcurrent = Xcenter - RAD, Ycurrent = Ycenter;
// 初始化640x480像素的图形窗口
initgraph(640, 480);
for (int i = 0; i < 800; i++) {
FindNextPoint(Xcurrent, Ycurrent,Xlast,Ylast,&x,&y);
//printf("%d %d\n", x, y);
putpixel(Xcurrent, Ycurrent, RED);
Xlast = Xcurrent;
Ylast = Ycurrent;
Xcurrent = x;
Ycurrent = y;
}
// 保持窗口显示
_getch();
// 关闭图形窗口
closegraph();
return 0;
}