The main idea of this program is from the BRESEHAM algorithm, the evolutionary thing is to increase the rotation! The algorithm description is not written, and it is tired to beat!
List the program!
The MFC code is as follows:
// BREELLIPSE
// (XC, YC) ---------- Elliptic Center
// Fla, FLB ---------- The radius of the horizontal axis and the vertical axis
// Double ---------- The angle of rotation
Void Breellipse (CDC * PDC, Float XC, Float Yc, Float Fla, Float FLB, Double Angle)
{
INT I;
Float A, B, X, Y;
Double DX, DY, DI, AA, BB, SINA, COSA;
COSA = COS (ANGLE);
sina = sin (Angle);
A = FLA;
B = FLB;
AA = a * a;
BB = b * b;
Float flx [4], fly [4];
X = 0;
y = b;
DX = 0;
DY = 2 * aa * y;
Di = BB-AA * B AA / 4;
FLX [0] = XC X * COSA-Y * SINA;
FLX [1] = XC X * COSA Y * SINA;
FLX [2] = XC-X * COSA-Y * SINA;
FLX [3] = XC-X * COSA Y * SINA;
Fly [0] = YC Y * COSA X * SINA;
Fly [1] = YC-Y * COSA X * SINA;
Fly [2] = YC Y * COSA-X * SINA;
Fly [3] = YC-Y * COSA-X * SINA;
i = 0;
While (DX { i ; IF (i == 5) { PDC-> MoveTo (FLX [0], Fly [0]); PDC-> LINETO (XC X * COSA-Y * SINA, YC Y * COSA X * SINA); PDC-> MoveTo (FLX [1], Fly [1]); PDC-> LineTo (XC X * COSA Y * SINA, YC-Y * COSA X * SINA); PDC-> MoveTo (FLX [2], Fly [2]); PDC-> LINETO (XC-X * COSA-Y * SINA, YC Y * COSA-X * SINA); PDC-> MoveTo (FLX [3], Fly [3]); PDC-> LINETO (XC-X * COSA Y * SINA, YC-Y * COSA-X * SINA); FLX [0] = XC X * COSA-Y * SINA; FLX [1] = XC X * COSA Y * SINA; FLX [2] = XC-X * COSA-Y * SINA; FLX [3] = XC-X * COSA Y * SINA; Fly [0] = YC Y * COSA X * SINA; Fly [1] = YC-Y * COSA X * SINA; Fly [2] = YC Y * COSA-X * SINA; Fly [3] = YC-Y * COSA-X * SINA; i = 0; } X ; DX = 2 * BB; Di = DX BB; IF (di> = 0) { DY- = 2 * aa; Di- = DY; Y-- } } PDC-> MoveTo (FLX [0], Fly [0]); PDC-> LINETO (XC X * COSA-Y * SINA, YC Y * COSA X * SINA); PDC-> MoveTo (FLX [1], Fly [1]); PDC-> LineTo (XC X * COSA Y * SINA, YC-Y * COSA X * SINA); PDC-> MoveTo (FLX [2], Fly [2]); PDC-> LINETO (XC-X * COSA-Y * SINA, YC Y * COSA-X * SINA); PDC-> MoveTo (FLX [3], Fly [3]); PDC-> LINETO (XC-X * COSA Y * SINA, YC-Y * COSA-X * SINA); DI = INT ((3 * (AA-BB) -2 * (DX-DY)) / 4 0.5); FLX [0] = XC X * COSA-Y * SINA; FLX [1] = XC X * COSA Y * SINA; FLX [2] = XC-X * COSA-Y * SINA; FLX [3] = XC-X * COSA Y * SINA; Fly [0] = YC Y * COSA X * SINA; Fly [1] = YC-Y * COSA X * SINA; Fly [2] = YC Y * COSA-X * SINA; Fly [3] = YC-Y * COSA-X * SINA; i = 0; While (Y> 0) { i ; IF (i == 5) { PDC-> MoveTo (FLX [0], Fly [0]); PDC-> LINETO (XC X * COSA-Y * SINA, YC Y * COSA X * SINA); PDC-> MoveTo (FLX [1], Fly [1]); PDC-> LineTo (XC X * COSA Y * SINA, YC-Y * COSA X * SINA); PDC-> MoveTo (FLX [2], Fly [2]); PDC-> LINETO (XC-X * COSA-Y * SINA, YC Y * COSA-X * SINA); PDC-> MoveTo (FLX [3], Fly [3]); PDC-> LINETO (XC-X * COSA Y * SINA, YC-Y * COSA-X * SINA); FLX [0] = XC X * COSA-Y * SINA; FLX [1] = XC X * COSA Y * SINA; FLX [2] = XC-X * COSA-Y * SINA; FLX [3] = XC-X * COSA Y * SINA; Fly [0] = YC Y * COSA X * SINA; Fly [1] = YC-Y * COSA X * SINA; Fly [2] = YC Y * COSA-X * SINA; Fly [3] = YC-Y * COSA-X * SINA; i = 0; } Y-- DY- = 2 * aa; Di = aa-dy; IF (di <0) { DX = 2 * BB; Di = DX; X ; } } PDC-> MoveTo (FLX [0], Fly [0]); PDC-> LINETO (XC X * COSA-Y * SINA, YC Y * COSA X * SINA); PDC-> MoveTo (FLX [1], Fly [1]); PDC-> LineTo (XC X * COSA Y * SINA, YC-Y * COSA X * SINA); PDC-> MoveTo (FLX [2], Fly [2]); PDC-> LINETO (XC-X * COSA-Y * SINA, YC Y * COSA-X * SINA); PDC-> MoveTo (FLX [3], Fly [3]); PDC-> LINETO (XC-X * COSA Y * SINA, YC-Y * COSA-X * SINA);