Еще остался один примитив, который является одним из главных. Это естественно окружность, а как примитив с расширенными возможностями лучше сразу рассмотреть эллипс. Над прорисовкой эллипса тоже постарался Брезенхейм и облегчил задачу всем программистам до сегодняшних дней.
Вот код рисования эллипса:
int CGIScreen::Ellipse(int exc, int eyc, int ea, int eb , unsigned char Color)
{
int elx, ely;
long aa, aa2, bb, bb2, d, dx, dy;
elx = 0; ely = eb; aa = (long)ea * ea; aa2 = 2 * aa;
bb = (long)eb * eb; bb2 = 2 * bb;
d = bb - aa * eb + aa/4; dx = 0; dy = aa2 * eb;
PutPixel(exc, eyc - ely, Color); PutPixel(exc, eyc + ely, Color);
PutPixel(exc - ea, eyc, Color); PutPixel(exc + ea, eyc, Color);
while (dx < dy)
{
if (d > 0) { ely--; dy-=aa2; d-=dy;}
elx++; dx+=bb2; d+=bb+dx;
PutPixel(exc + elx, eyc + ely, Color);
PutPixel(exc - elx, eyc + ely, Color);
PutPixel(exc + elx, eyc - ely, Color);
PutPixel(exc - elx, eyc - ely, Color);
};
d+=(3 * (aa - bb)/2 - (dx + dy))/2;
while (ely > 0)
{
if (d < 0) {elx++; dx+=bb2; d+=bb + dx;}
ely--; dy-=aa2; d+=aa - dy;
PutPixel(exc + elx, eyc + ely, Color);
PutPixel(exc - elx, eyc + ely, Color);
PutPixel(exc + elx, eyc - ely, Color);
PutPixel(exc - elx, eyc - ely, Color);
};
return 0;
};/*Ellipse*/
Здесь координатами центральной точки эллипса являются параметры exc,eyc. Параметры ea,eb это ширина и высота эллипса, подставив вместо них одинаковые значения Вы сможете нарисовать окружность.
Теперь еще два более крупных примитива состоящих из линий. Первый это прямоугольник:
int CGIScreen::Rectangle(int x1,int y1,int x2,int y2, unsigned char color)
{
Line(x1,y1,x2,y1,color);
Line(x1,y1,x1,y2,color);
Line(x2,y1,x2,y2,color);
Line(x1,y2,x2,y2,color);
}/*Rectangle*/
и закращенный прямоугольник:
int CGIScreen::FillRectangle(int X1,int Y1,int X2,int Y2, unsigned char Color)
{
int I;
if (Y1>Y2) {I=Y1;Y1=Y2;Y2=I;};
for (I=Y1;I<=Y2;I++) line(X1,I,X2,I,Color);
}/*FillRectangle*/
Теперь на этой базе вы сможете строить более сложные объекты.