Шаг 32.
Основы компьютерной графики.
Базовые растровые алгоритмы. Алгоритм вывода окружности

    На этом шаге мы рассмотрим данный алгоритм.

    Для вывода контура круга можно использовать соотношение между координатами X и Y для точек круга X2 + Y2 = R2 и построить алгоритм прямого вычисления координат. Однако тогда необходимо вычислять квадратный корень, а это в цифровом компьютере выполняется медленно.

    Дадим запись инкрементного алгоритма Брезенхэма на языке C++:

void Circle (HDC hdc,int xc, int yc, int radius)
{
  int x,y,dxt;
  long r2,dst,t,s,e,ca,cd,indx;
  r2=(long)radius*(long)radius;
  dst=4*r2;
  dxt=(double)radius/1.414213562373;
  t=0;
  s=-4*r2*(long)radius;
  e=(-s/2)-3*r2;
  ca=-6*r2;
  cd=-10*r2;
  x=0;
  y=radius;
  SetPixel(hdc,xc,yc+radius,0);
  SetPixel(hdc,xc,yc-radius,0);
  SetPixel(hdc,xc+radius,yc,0);
  SetPixel(hdc,xc-radius,yc,0);
  for(indx=1;indx<=dxt;indx++)
  {
    x++;
    if(e>=0) e+=t+ca;
    else
    {
      y--;
      e+=t-s+cd;
      s+=dst;
    }
    t-=dst;
    SetPixel(hdc,xc+x,yc+y,0);
    SetPixel(hdc,xc+y,yc+x,0);
    SetPixel(hdc,xc+y,yc-x,0);
    SetPixel(hdc,xc+x,yc-y,0);
    SetPixel(hdc,xc-x,yc-y,0);
    SetPixel(hdc,xc-y,yc-x,0);
    SetPixel(hdc,xc-y,yc+x,0);
    SetPixel(hdc,xc-x,yc+y,0);
  }
}
Полный текст программы можно взять здесь.

    Результат работы приложения изображен на рисунке 1.


Рис.1. Результат работы приложения

    В этом алгоритме использована симметрия круга - в основном цикле вычисляются координаты точек круга только одного октанта и сразу рисуются восемь симметрично расположенных пикселей [1].


(1)Эгрон Ж. Синтез изображений. Базовые алгоритмы. - М.: Радио и связь, 1993. - 316 с.

    На следующем шаге мы рассмотрим алгоритм вывода эллипса.




Предыдущий шаг Содержание Следующий шаг