На этой странице я хотел бы предложить тебе основные алгоритмы, использующиеся в компьютерной графике. Думаю, что это будет интересно не только специалистам в этой области (они всё это и так знают :)) ), но и обычному любителю программировать. Ведь интересно же знать как поступает компилятор, когда ему встречается, например,такая строчка

 line(-10,-10,100,100);

Кстати, здесь  и далее будут приведены тексты программ, написанные на Паскале.

Итак, основные алгоритмы :

  1. Растровая развёртка отрезка (Алгоритм Брезенхема)

  2. Растровая развёртка отрезка (Алгоритм ЦДА)

  3. Растровая развёртка окружности (Алгоритм Брезенхема)

Да, ещё. Здесь не будут описаны алгоритмы отсечения. Хотя не исключено, что они могут появиться со временем.

Растровая развёртка отрезка (Алгоритм Брезенхема)

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); {по одной точке можно поставить ещё 8}
   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;


При подготовке страницы использованы материалы лекций С.З.Свердлова


 

Сайт управляется системой uCoz