Bitmap/Bresenham's line algorithm: Difference between revisions
Content added Content deleted
m (simpler wp link) |
|||
Line 353: | Line 353: | ||
(declare (type rgb-pixel pixel)) |
(declare (type rgb-pixel pixel)) |
||
(let* ((dist-x (abs (- x1 x2))) |
(let* ((dist-x (abs (- x1 x2))) |
||
(dist-y (abs (- y1 y2))) |
(dist-y (abs (- y1 y2))) |
||
(steep (> dist-y dist-x))) |
(steep (> dist-y dist-x))) |
||
(when steep |
(when steep |
||
(psetf x1 y1 y1 x1 |
(psetf x1 y1 y1 x1 |
||
x2 y2 y2 x2)) |
x2 y2 y2 x2)) |
||
(when (> x1 x2) |
(when (> x1 x2) |
||
(psetf x1 x2 x2 x1 |
(psetf x1 x2 x2 x1 |
||
y1 y2 y2 y1)) |
y1 y2 y2 y1)) |
||
(let* ((delta-x (- x2 x1)) |
(let* ((delta-x (- x2 x1)) |
||
(delta-y (abs (- y1 y2))) |
(delta-y (abs (- y1 y2))) |
||
(error (floor delta-x 2)) |
(error (floor delta-x 2)) |
||
(y-step (if (< y1 y2) 1 -1)) |
(y-step (if (< y1 y2) 1 -1)) |
||
(y y1)) |
(y y1)) |
||
(loop |
(loop |
||
:for x :upfrom x1 :to x2 |
:for x :upfrom x1 :to x2 |
||
:do |
:do (if steep |
||
(setf (rgb-pixel buffer x y) pixel) |
(setf (rgb-pixel buffer x y) pixel) |
||
(setf (rgb-pixel buffer y x) pixel)) |
(setf (rgb-pixel buffer y x) pixel)) |
||
(setf error (- error delta-y)) |
(setf error (- error delta-y)) |
||
(when (< error 0) |
(when (< error 0) |
||
(incf y y-step) |
(incf y y-step) |
||
(incf error delta-x |
(incf error delta-x)))) |
||
buffer))</lang> |
buffer))</lang> |
||