Шаг 18 - Вывод примитивов на экран (часть 2)

Еще остался один примитив, который является одним из главных. Это естественно окружность, а как примитив с расширенными возможностями лучше сразу рассмотреть эллипс. Над прорисовкой эллипса тоже постарался Брезенхейм и облегчил задачу всем программистам до сегодняшних дней.

Вот код рисования эллипса:

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*/

Теперь на этой базе вы сможете строить более сложные объекты.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Кузин Андрей - 10.05.2000