Elliptic painting algorithm - (rotation, filling)

xiaoxiao2021-03-05  29

Elliptic painting algorithm - (rotation, filling)

Author: handwolf

date:

2005-4-11

Introduction:

The rectangle in the window, with rounded rectangles and ellipses can only be drawn from the GDI in the axial direction. If someone wants to rotate or skew in Windows NT, he can use the world coordinate system to transform. Unfortunately, under Windows 95/98, there is no world coordinate system transform. As a cross-platform solution, you need to do more work. The rectangle can be simulated by quadrilateral so that it can rotate and skew. However, what should I do if the ellipse is? There are basically two options.

(1) Use the Bezier curve to approximate the ellipse.

This method is visible at http://www.china-askpro.com/msg48/QA12.SHTML.

(2) Draw an ellipse using a custom function. Here is the derivative method of Bresenham ellipse method, and the general Bresenham ellipse method can look for computer graphics tutorial.

I have a variety of coefficients, such as contour color, rotation angle, line width, fill color, etc.!

The reason why the code is long, because you want to simulate a variety of contour line types, if you don't need it, you can make the appropriate crop, get the features you need.

Oh, the most important thing here is to share the code,

The C code is as follows:

#include "math.h"

#define skeep_dash 3

#define skeep_dot 1

// CDC * PDC: graphics device

// Float XC, Float Yc: Ellipse Center Point

// Float FLA: Ellipse X-axis length (horizontal)

// Float FLB: Ellipse Y-axis length (horizontal)

// ColorRef color: ellipse color

// Double Angle: Ellipse Rotation angle

// int NpenWidth: pen width

// Creater: Handwolf

2003-12-14

Void Cellipse :: Breellipse :: Breellipse (CDC * PDC, Float XC, Float Yc, Float Fla, Float FLB, ColorRef Color, Int NpenStyle, Double Angle, Int NpenWidth)

{

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;

INT bdot1 = true, bdot2 = false, bdash = false; // for dashdot / dashdotdot

INT nskeepinit, nskeep = 0;

Switch (NPENSTYLE) {CASE PS_DOT:

Case ps_dashdot:

Case ps_dashdotdot:

nskeepinit = SKEEP_DOT;

Break;

Case ps_dash:

nskeepinit = SKEEP_DASH;

Break;

DEFAULT:

Break;

}

nskeep = 0;

While (DX

{

i ;

IF (i == 3)

{

Switch (npenstyle) {

Case ps_solid: // ____________

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);

Break;

Case ps_dot: // ...........

Case ps_dash: // -------------

nskeep;

IF (nskeep <= nskeepinit) {

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);

} else {

nskeep = 0;

}

Break;

Case ps_dashdot: // __. __. __.

nskeep;

IF (nskeep <= nskeepinit) {

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);

} else {

nskeep = 0;

IF (bdot1 == true) {

BDOT1 = false;

Bdash = true;

nskeepinit = SKEEP_DASH;} else {

Bdash = false;

BDOT1 = TRUE;

nskeepinit = SKEEP_DOT;

}

}

Break;

Case ps_dashdotdot: // __.. __. __.

nskeep;

IF (nskeep <= nskeepinit) {

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);

} else {

nskeep = 0;

IF (bdot1 == true) {

BDOT1 = false;

BDOT2 = TRUE;

nskeepinit = SKEEP_DOT;

} else if (bdot2 == True) {

BDOT2 = FALSE;

Bdash = true;

nskeepinit = SKEEP_DASH;

} else {// bdash == TRUE

Bdash = false;

BDOT1 = TRUE;

nskeepinit = SKEEP_DOT;

}

}

Break;

DEFAULT:

Break;

}

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;

BDOT1 = true; // for dashdot / dashdotdot

BDOT2 = FALSE;

Bdash = false;

Switch (npenstyle) {

Case ps_dot:

Case ps_dashdot:

Case ps_dashdotdot:

nskeepinit = SKEEP_DOT;

Break;

Case ps_dash:

nskeepinit = SKEEP_DASH;

Break;

DEFAULT:

Break;

}

nskeep = 0;

While (Y> 0)

{

i ;

IF (i == 5)

{

Switch (npenstyle) {

Case ps_solid: // ____________

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);

Break;

Case ps_dot: // ...........

Case ps_dash: // -------------

nskeep;

IF (nskeep <= nskeepinit) {

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);

} else {

nskeep = 0;

}

Break;

Case ps_dashdot: // __. __. __.

nskeep;

IF (nskeep <= nskeepinit) {

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);

} else {

nskeep = 0;

IF (bdot1 == true) {

BDOT1 = false;

Bdash = true;

nskeepinit = SKEEP_DASH;

} else {

Bdash = false;

BDOT1 = TRUE;

nskeepinit = SKEEP_DOT;

}

}

Break;

Case ps_dashdotdot: // __.. __. __.

nskeep;

IF (nskeep <= nskeepinit) {

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);

} else {

nskeep = 0;

IF (bdot1 == true) {

BDOT1 = false;

BDOT2 = TRUE;

nskeepinit = SKEEP_DOT;

} else if (bdot2 == True) {

BDOT2 = FALSE;

Bdash = true;

nskeepinit = SKEEP_DASH;

} else {// bdash == TRUE

Bdash = false;

BDOT1 = TRUE;

nskeepinit = SKEEP_DOT;

}

}

Break;

DEFAULT:

Break;

}

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);

}

转载请注明原文地址:https://www.9cbs.com/read-37161.html

New Post(0)