-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathintline.m
49 lines (44 loc) · 1.15 KB
/
intline.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
function [x, y] = intline(x1, x2, y1, y2)
%INTLINE Integer-coordinate line drawing algorithm.
% [X, Y] = INTLINE(X1, X2, Y1, Y2) computes an
% approximation to the line segment joining (X1, Y1) and
% (X2, Y2) with integer coordinates. X1, X2, Y1, and Y2
% should be integers. INTLINE is reversible; that is,
% INTLINE(X1, X2, Y1, Y2) produces the same results as
% FLIPUD(INTLINE(X2, X1, Y2, Y1)).
% Copyright 1993-2002 The MathWorks, Inc. Used with permission.
% $Revision: 1.4 $ $Date: 2003/11/21 14:38:20 $
dx = abs(x2 - x1);
dy = abs(y2 - y1);
% Check for degenerate case.
if ((dx == 0) & (dy == 0))
x = x1;
y = y1;
return;
end
flip = 0;
if (dx >= dy)
if (x1 > x2)
% Always "draw" from left to right.
t = x1; x1 = x2; x2 = t;
t = y1; y1 = y2; y2 = t;
flip = 1;
end
m = (y2 - y1)/(x2 - x1);
x = (x1:x2).';
y = round(y1 + m*(x - x1));
else
if (y1 > y2)
% Always "draw" from bottom to top.
t = x1; x1 = x2; x2 = t;
t = y1; y1 = y2; y2 = t;
flip = 1;
end
m = (x2 - x1)/(y2 - y1);
y = (y1:y2).';
x = round(x1 + m*(y - y1));
end
if (flip)
x = flipud(x);
y = flipud(y);
end