Вывод линий, алгоритм Брезенкема, алгоритм ЦДА
На этой странице приведены основные алгоритмы, использующиеся в компьютерной графике. Думаю, что это будет интересно не только специалистам в этой области (они всё это и так знают :)) ), но и обычному любителю программировать. Ведь интересно же знать как поступает компилятор, когда ему встречается, например, такая строчка
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
не понимаю смысла публикации последнего очень медленного алгоритма