На этой странице я хотел бы предложить тебе основные алгоритмы, использующиеся в
компьютерной графике. Думаю, что это будет интересно не только специалистам в этой
области (они всё это и так знают :)) ), но и обычному любителю программировать. Ведь
интересно же знать как поступает компилятор, когда ему встречается, например,такая строчка
line(-10,-10,100,100);
Кстати, здесь и далее будут приведены тексты программ, написанные на
Паскале.
NEW!!! Подробный отчёт о растровой развёртке эллипса!!! Здесь!!!
Итак, основные алгоритмы :
-
Растровая развёртка отрезка (Алгоритм
Брезенхема)
-
Растровая развёртка отрезка (Алгоритм
ЦДА)
-
Растровая развёртка окружности (Алгоритм
Брезенхема)
Да, ещё. Здесь не будут описаны алгоритмы отсечения. Хотя не исключено, что
они могут появиться со временем.
procedure lineBres(x1,
y1, x2, y2 : integer);
var
x, y, xend, yend, s, dx, dy, d, inc1, inc2 : integer;
begin
dx := abs(x2-x1); dy := abs(y2-y1);
if dx > dy then begin {почти горизонтальна}
 inc1 := 2*dy; inc2 := 2*(dy - dx); d := 2*dy - dx;
if x1 < x2 then begin
x := x1; y := y1; xend:= x2;
 if y1 < y2 then s := 1
 else s := -1;
end
else begin
x := x2; y := y2; xend := x1;
if y1 > y2 then s := 1
 else s := -1;
end;
putpixel(x, y, cc); {ставим точку цветом СС}
while x < xend do begin
inc(x);
if d > 0 then begin
inc(y,s);
inc(d, inc2);
end
else inc(d, inc1);
putpixel(x, y, cc);
end
end
else...{совершенно аналогично}
procedure lineBres(x1,y1, x2, y2 : integer);
var
x, y,xend, yend, dx, dy : integer;
k, xf, yf : float; {тип float - один из вещественныхтипов}
begin
dx := abs(x2-x1); dy := abs(y2-y1);
if dx > dy then begin {почти горизонтальна}
k := (y2 - y1)/(x2 - x1);
if x1 < x2 then begin
yf := y1; x := x1; xend := x2;
end
else begin
x := x2; xend := x1; yf := y2;
end;
repeat
putpixel(x, round(yf),cc){ставим точку цветом СС}
inc(x); inc(yf, k);
until x > xend;
end
else if dy = 0 then putpixel(x1, y1, cc)
else ... {совершенно аналогично}
Растровая развёртка
окружности(Алгоритм Брезенхема)
procedure circle(xc,yc, r : integer);
var
d, x, y : integer;
begin
x := 0; y := r; d := 3 - 2*r;
putpixel8(xc, yc, 0, r); {по одной точке можно поставить ещё 7}
while x < y do begin
if d <= 0 then
d := d + 4*x + 6
else begin
d := d + 4*(x - y) + 10; dec(y);
end;
inc(x);
putpixel8(xc, yc, x, y);
end;
end;
При подготовке страницы использованы
материалы лекций С.З.Свердлова