EasyX 用点画圆

圆形的参数方程如下:

根据这个,编写 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;
}

运行结果:

此外,这里再给出一个奇怪/低效的算法。基于如下限制:所有的点在八个方向上只存在两个点与之相近(换句话,一个像素的线绘制出来的圆形),基于此限制,设计算法如下:

  1. 给出起始点坐标(Xorg,Yorg);
  2. 生成8个方向的坐标,计算这些点位和圆心的距离,然后选择最接近半径的作为下一个点的坐标;
  3. 重复上述动作计算出所有的点(不过我还没有想明白怎么通过公式计算出点的数量)
#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;
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注