Вывод линий, алгоритм Брезенкема, алгоритм ЦДА
На этой странице приведены основные алгоритмы, использующиеся в компьютерной графике. Думаю, что это будет интересно не только специалистам в этой области (они всё это и так знают :)) ), но и обычному любителю программировать. Ведь интересно же знать как поступает компилятор, когда ему встречается, например, такая строчка
line(-10,-10,100,100);
Кстати, здесь и далее будут приведены тексты программ, написанные на Паскале.
Итак, основные алгоритмы :
Растровая развёртка отрезка (Алгоритм Брезенхема)
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 ... {совершенно аналогично}
Оставить комментарий
Комментарии
1.
+0 / -1


12 июня 2006, 21:40:26
не понимаю смысла публикации последнего очень медленного алгоритма
