На этом шаге мы рассмотрим данный алгоритм.
Для вывода контура круга можно использовать соотношение между координатами 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].
На следующем шаге мы рассмотрим алгоритм вывода эллипса.