RosettaCodeData/Task/Bitmap-Bresenhams-line-algorithm/Erlang/bitmap-bresenhams-line-algorithm-2.erl

31 lines
755 B
Erlang
Raw Permalink Normal View History

2013-04-10 16:19:29 -07:00
line({X0, Y0}, {X1, Y1}) ->
2014-01-17 05:32:22 +00:00
SX = step(X0, X1),
SY = step(Y0, Y1),
DX = abs(X1 - X0),
DY = abs(Y1 - Y0),
Err = DX - DY,
line({X0, Y0}, {X1, Y1}, {SX, SY}, {DX, DY}, Err, []).
2013-04-10 16:19:29 -07:00
line({X1, Y1}, {X1, Y1}, _, _, _, Acc) ->
2014-01-17 05:32:22 +00:00
lists:reverse([{X1, Y1} | Acc]);
2013-04-10 16:19:29 -07:00
line({X, Y}, {X1, Y1}, {SX, SY}, {DX, DY}, Err, Acc) ->
2014-01-17 05:32:22 +00:00
DE = 2 * Err,
{X0, Err0} = next_x(X, SX, DY, Err, DE),
{Y0, Err1} = next_y(Y, SY, DX, Err0, DE),
line({X0, Y0}, {X1, Y1}, {SX, SY}, {DX, DY}, Err1, [{X, Y} | Acc]).
2013-04-10 16:19:29 -07:00
step(P0, P1) when P0 < P1 ->
2014-01-17 05:32:22 +00:00
1;
2013-04-10 16:19:29 -07:00
step(_, _) ->
2014-01-17 05:32:22 +00:00
-1.
2013-04-10 16:19:29 -07:00
next_x(X, SX, DY, E, DE) when DE > -DY ->
2014-01-17 05:32:22 +00:00
{X + SX, E - DY};
2013-04-10 16:19:29 -07:00
next_x(X, _SX, _DY, E, _DE) ->
2014-01-17 05:32:22 +00:00
{X, E}.
2013-04-10 16:19:29 -07:00
next_y(Y, SY, DX, E, DE) when DE < DX ->
2014-01-17 05:32:22 +00:00
{Y + SY, E + DX};
2013-04-10 16:19:29 -07:00
next_y(Y, _SY, _DX, E, _DE) ->
2014-01-17 05:32:22 +00:00
{Y, E}.