Bresenham高效畫線演算法 (轉)

worldblog發表於2007-12-04
Bresenham高效畫線演算法 (轉)[@more@]

Bresenham高效畫線演算法

  畫線的演算法不少,但要作到高速、簡單並不容易。斜率相乘法是最簡單的方法之一,但計算每個點均要花費不少時間用於乘、除法運算;下面介紹的是Bresenham's高效畫線演算法,對每個點的座標計算只要加、減法就能完成。
  簡化演算法用偽Pascal語言描述如下:
procedure DrawLine(x1, y1, x2, y2: Integer);
var
  x, y, DeltaX, DeltaY, HalfX, ErrorTerm, i: Integer;
begin
  DeltaX := x2 - x1;
  DeltaY := y2 - y1;
  HalfX := (x2 - x1) shr 1;
  ErrorTe:= 0;
  x := x1;
  y := y1;
  for i:=0 to DeltaX do
  begin
  Plot(X, Y);
  Inc(x);
  ErrorTerm := ErrorTerm + DeltaY;
  if ErrorTerm>HalfX then
  begin
  ErrorTerm := ErrorTerm - DeltaX;
  Inc(y);
  end;
  end;
end;
  為方便閱讀,上述作了簡化。實際程式應略作修正,以分別處理DeltaX與DeltaY比較大小, 必要時起始、結束點等。
  修正後的的偽Pascal演算法如下:
procedure DrawLine(x1, y1, x2, y2: Integer);
var
  x, y, DeltaX, DeltaY, HalfCount, ErrorTerm, i, Flag: Integer;
begin
  DeltaX := x2 - x1;
  DeltaY := y2 - y1;

  if Abs(DeltaY)  begin
  if DeltaX<0 then
  begin
  i := x1;  x1 := x2;  x2 := i;
  i := y1;  y1 := y2;  y2 := i;
  DeltaX := x2 - x1;
  DeltaY := y2 - y1;
  end;
  if DeltaY<0 then Flag := -1
  else Flag := 1;
  DeltaY := Abs(DeltaY);
  HalfCount := DeltaX shr 1;
  ErrorTerm := 0;
  x := x1;
  y := y1;
  for i:=0 to DeltaX do
  begin
  Plot(X, Y);
  Inc(x);
  ErrorTerm := ErrorTerm + DeltaY;
  if ErrorTerm>HalfCount then
  begin
  ErrorTerm := ErrorTerm - DeltaX;
  y := y + Flag;
  end;
  end;
  end
  else
  begin
  if DeltaY<0 then
  begin
  i := x1;  x1 := x2;  x2 := i;
  i := y1;  y1 := y2;  y2 := i;
  DeltaX := x2 - x1;
  DeltaY := y2 - y1;
  end;
  if DeltaX<0 then Flag := -1
  else Flag := 1;
  DeltaX := Abs(DeltaX);
  HalfCount := DeltaY shr 1;
  ErrorTerm := 0;
  x := x1;
  y := y1;
  for i:=0 to DeltaY do
  begin
  Plot(X, Y);
  Inc(y);
  ErrorTerm := ErrorTerm + DeltaX;
  if ErrorTerm>HalfCount then
  begin
  ErrorTerm := ErrorTerm - DeltaY;
  x := x + Flag;
  end;
  end;
  end;
end;


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-988396/,如需轉載,請註明出處,否則將追究法律責任。

相關文章