EasyX 用点画椭圆

椭圆的参数方程:

源代码:

#include <graphics.h>  // EasyX图形库头文件
#include <conio.h>     // 用于_getch()
#include <math.h>    

#define a 100
#define b 50

int main()
{
    int x,y;
    // 初始化640x480像素的图形窗口
    initgraph(640, 480);

    for (int i = 0; i < 360; i++) {
        x = 320 + a * cos(i * 3.1415 / 180); // sin 用弧度做参数
        y=  240+ b * sin(i * 3.1415 / 180); // cos 用弧度做参数
        putpixel(x, y, RED);  
    }

    // 保持窗口显示
    _getch();

    // 关闭图形窗口
    closegraph();
    return 0;
}

运行结果:

和之前画圆类似,直接用点的方法计算:

#include <graphics.h>  // EasyX图形库头文件
#include <conio.h>     // 用于_getch()
#include <math.h>    
#include <stdio.h>  

#define Xcenter 320
#define Ycenter 240

// 长轴
#define A 50
// 短轴
#define B 30

// 焦点F1坐标
#define Xf1 (Xcenter-(int)(sqrt(A*A-B*B)))
#define Yf1 Ycenter
// 焦点F2坐标
#define Xf2 (Xcenter+(int)(sqrt(A*A-B*B)))
#define Yf2 Ycenter

// 计算 (x,y) 到焦点F1和F2的距离之和
double CalculateDistance(int x, int y)
{
    double f1 = sqrt((x - Xf1) * (x - Xf1) + (y - Yf1) * (y - Yf1));
    double f2 = sqrt((x - Xf2) * (x - Xf2) + (y - Yf2) * (y - Yf2));
    return (f1+f2);
}

// 找到下一个点位
// 输入当前点位坐标 (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 = fabs(CalculateDistance(Xcurrent - 1, Ycurrent) - 2 * A);
        if (gap > tmp) {
            gap = fabs(CalculateDistance(Xcurrent - 1, Ycurrent) - 2 * A);
            *Xnext = Xcurrent - 1;
            *Ynext = Ycurrent;
        }
    }
    // 左上
    if ((Xcurrent-1 != Xlast) || (Ycurrent-1!= Ylast)) {
        tmp = fabs(CalculateDistance(Xcurrent - 1, Ycurrent - 1) - 2 * A);
        if (gap > tmp) {
            gap = fabs(CalculateDistance(Xcurrent - 1, Ycurrent-1) - 2 * A);
            *Xnext = Xcurrent - 1;
            *Ynext = Ycurrent-1; 
        }
    }
    // 上
    if ((Xcurrent!= Xlast) || (Ycurrent - 1 != Ylast)) {
        tmp = fabs(CalculateDistance(Xcurrent, Ycurrent - 1) - 2 * A);
        if (gap > tmp) {
            gap = fabs(CalculateDistance(Xcurrent, Ycurrent - 1) - 2 * A);
            *Xnext = Xcurrent;
            *Ynext = Ycurrent - 1;
        }
    }
    // 右上
    if ((Xcurrent+1 != Xlast) || (Ycurrent - 1 != Ylast)) {
        if (gap > fabs(CalculateDistance(Xcurrent+1, Ycurrent - 1) - 2 * A)) {
            gap = fabs(CalculateDistance(Xcurrent+1, Ycurrent - 1) - 2 * A);
            *Xnext = Xcurrent+1;
            *Ynext = Ycurrent - 1;
        }
    }
    // 右
    if ((Xcurrent + 1 != Xlast) || (Ycurrent != Ylast)) {
        if (gap > fabs(CalculateDistance(Xcurrent + 1, Ycurrent) - 2 * A)) {
            gap = fabs(CalculateDistance(Xcurrent + 1, Ycurrent) - 2 * A);
            *Xnext = Xcurrent + 1;
            *Ynext = Ycurrent;
        }
    }
    // 右下
    if ((Xcurrent + 1 != Xlast) || (Ycurrent+1 != Ylast)) {
        if (gap > fabs(CalculateDistance(Xcurrent + 1, Ycurrent+1) - 2 * A)) {
            gap = fabs(CalculateDistance(Xcurrent + 1, Ycurrent+1) - 2 * A);
            *Xnext = Xcurrent + 1;
            *Ynext = Ycurrent + 1;
        }
    }
    // 下
    if ((Xcurrent != Xlast) || (Ycurrent +1!= Ylast)) {
        if (gap > fabs(CalculateDistance(Xcurrent, Ycurrent+1) - 2 * A)) {
            gap = fabs(CalculateDistance(Xcurrent, Ycurrent+1) - 2 * A);
            *Xnext = Xcurrent;
            *Ynext = Ycurrent+1;
        }
    }
    // 左下
    if ((Xcurrent-1 != Xlast) || (Ycurrent + 1 != Ylast)) {
        if (gap > fabs(CalculateDistance(Xcurrent-1, Ycurrent + 1) - 2 * A)) {
            gap = fabs(CalculateDistance(Xcurrent-1, Ycurrent + 1) - 2 * A);
            *Xnext = Xcurrent-1;
            *Ynext = Ycurrent + 1;
        }
    }

}
int main()
{
    int x=0, y= 0;
    int Xlast = Xcenter - A, Ylast = Ycenter;
    int Xcurrent = Xcenter - A, Ycurrent = Ycenter;

    // 初始化640x480像素的图形窗口
    initgraph(640, 480);

    for (int i = 0; i < 255; i++) {
        FindNextPoint(Xcurrent, Ycurrent,Xlast,Ylast,&x,&y);

        //printf("%d %d\n", x- Xcenter, y-Ycenter);
        putpixel(Xcurrent, Ycurrent, RED);
        Xlast = Xcurrent;
        Ylast = Ycurrent;
        Xcurrent = x;
        Ycurrent = y;

        if ((i != 0) && (Xcurrent == Xcenter - A) && (Ycurrent == Ycenter)) {
            printf("-->%d \n",i);
        }

    }

    // 保持窗口显示
    _getch();

    // 关闭图形窗口
    closegraph();
    return 0;
}

之前提到计算周长的问题,椭圆周长公式【参考】:L=T(r+R),其中的 T 是短轴长轴的比例。比如,这里我们 A=50, B=30 因此,T=3.190874858, 计算结果是255.2,上述代码运行之后会输出 “–>231” 意思是在 234 的时候到了起始位置,结果和预期有可比性。

参考:

1。https://baike.baidu.com/item/%E6%A4%AD%E5%9C%86/684466

发表回复

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