| 查看: 305 | 回复: 0 | |||
| 当前主题已经存档。 | |||
sdlj8051金虫 (著名写手)
|
[交流]
Bresenham高效画线算法
|
||
|
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; ErrorTerm := 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) 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; [ Last edited by 幻影无痕 on 2006-11-16 at 07:30 ] |
» 猜你喜欢
0857调剂
已经有5人回复
欢迎采矿、地质、岩土、计算机、人工智能等专业的同学报考
已经有5人回复
279求调剂
已经有4人回复
284求调剂
已经有8人回复
材料复试调剂
已经有4人回复
本子写完了,给DS兄弟看了,得了92分
已经有7人回复
求调剂
已经有6人回复
材料学硕318求调剂
已经有13人回复
一志愿郑大材料学硕298分,求调剂
已经有5人回复
材料化工调剂
已经有13人回复













回复此楼
10