41 lines
808 B
Plaintext
41 lines
808 B
Plaintext
let draw_line ~img ~color ~p0:(x0,y0) ~p1:(x1,y1) =
|
|
|
|
let steep = abs(y1 - y0) > abs(x1 - x0) in
|
|
|
|
let plot =
|
|
if steep
|
|
then (fun x y -> put_pixel img color y x)
|
|
else (fun x y -> put_pixel img color x y)
|
|
in
|
|
|
|
let x0, y0, x1, y1 =
|
|
if steep
|
|
then y0, x0, y1, x1
|
|
else x0, y0, x1, y1
|
|
in
|
|
let x0, x1, y0, y1 =
|
|
if x0 > x1
|
|
then x1, x0, y1, y0
|
|
else x0, x1, y0, y1
|
|
in
|
|
|
|
let delta_x = x1 - x0
|
|
and delta_y = abs(y1 - y0) in
|
|
let error = -delta_x / 2
|
|
and y_step =
|
|
if y0 < y1 then 1 else -1
|
|
in
|
|
let rec loop x y error =
|
|
plot x y;
|
|
if x <= x1 then
|
|
let error = error + delta_y in
|
|
let y, error =
|
|
if error > 0
|
|
then (y + y_step), (error - delta_x)
|
|
else y, error
|
|
in
|
|
loop (succ x) y error
|
|
in
|
|
loop x0 y0 error
|
|
;;
|