|
Графика и обработка изображений. Фракталы.
Рисование окружностей по алгоритму Брезенхейма.
Целочисленный алгоритм рисования окружностей.
Пример кода на языке С.
void Circle(int x, int y, int r,unsigned char color)
{
int x1,y1,yk = 0;
int sigma,delta,f;
x1 = 0;
y1 = r;
delta = 2*(1-r);
do
{
PutPixel(x+x1,y+y1,color);
PutPixel(x-x1,y+y1,color);
PutPixel(x+x1,y-y1,color);
PutPixel(x-x1,y-y1,color);
f = 0;
if (y1 < yk)
break;
if (delta < 0)
{
sigma = 2*(delta+y1)-1;
if (sigma <= 0)
{
x1++;
delta += 2*x1+1;
f = 1;
}
}
else
if (delta > 0)
{
sigma = 2*(delta-x1)-1;
if (sigma > 0)
{
y1--;
delta += 1-2*y1;
f = 1;
}
}
if (!f)
{
x1++;
y1--;
delta += 2*(x1-y1-1);
}
}
while(1);
}
На Паскале:
Procedure Circle(x,y,rr:integer);
var xi,yi,r,di,lim,s,ss:integer;
label 1,2,3,4,10,20,30;
Begin
r:=rr;
xi:=0; yi:=r; di:=2*(1-r); lim:=0;
1: SetPixel(xi+x,yi+y);
SetPixel(xi+x,-yi+y);
SetPixel(-xi+x,yi+y);
SetPixel(-xi+x,-yi+y);
if yi0then goto 3;
if di=0 then goto 20;
2: s:=2*di+2*yi-1;
if s<=0then goto 10;
if s>0then goto 20;
3: s:=2*di+2*xi-1;
if s<=0then goto 20;
if s>0then goto 30;
10:xi:=xi+1;
di:=di+2*xi+1;
goto 1;
20:xi:=xi+1;
yi:=yi-1;
di:=di+2*xi-2*yi+2;
goto 1;
30:yi:=yi-1;
di:=di-2*yi+1;
goto 1;
4:
end;
 Вверх по странице, к оглавлению и навигации.
| |