椭圆的参数方程:

源代码:
#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 的时候到了起始位置,结果和预期有可比性。
参考: