80 lines
1.9 KiB
Matlab
80 lines
1.9 KiB
Matlab
clear all;close all;clc;
|
|
% Example usage:
|
|
img = ones(250, 250);
|
|
img = drawline(img, 8, 8, 192, 154);
|
|
imshow(img); % Display the image
|
|
|
|
function img = drawline(img, x0, y0, x1, y1)
|
|
function f = fpart(x)
|
|
f = mod(x, 1);
|
|
end
|
|
|
|
function rf = rfpart(x)
|
|
rf = 1 - fpart(x);
|
|
end
|
|
|
|
steep = abs(y1 - y0) > abs(x1 - x0);
|
|
|
|
if steep
|
|
[x0, y0] = deal(y0, x0);
|
|
[x1, y1] = deal(y1, x1);
|
|
end
|
|
if x0 > x1
|
|
[x0, x1] = deal(x1, x0);
|
|
[y0, y1] = deal(y1, y0);
|
|
end
|
|
|
|
dx = x1 - x0;
|
|
dy = y1 - y0;
|
|
grad = dy / dx;
|
|
|
|
if dx == 0
|
|
grad = 1.0;
|
|
end
|
|
|
|
% handle first endpoint
|
|
xend = round(x0);
|
|
yend = y0 + grad * (xend - x0);
|
|
xgap = rfpart(x0 + 0.5);
|
|
xpxl1 = xend;
|
|
ypxl1 = floor(yend);
|
|
|
|
if steep
|
|
img(ypxl1, xpxl1) = rfpart(yend) * xgap;
|
|
img(ypxl1+1, xpxl1) = fpart(yend) * xgap;
|
|
else
|
|
img(xpxl1, ypxl1 ) = rfpart(yend) * xgap;
|
|
img(xpxl1, ypxl1+1) = fpart(yend) * xgap;
|
|
end
|
|
intery = yend + grad; % first y-intersection for the main loop
|
|
|
|
% handle second endpoint
|
|
xend = round(x1);
|
|
yend = y1 + grad * (xend - x1);
|
|
xgap = fpart(x1 + 0.5);
|
|
xpxl2 = xend;
|
|
ypxl2 = floor(yend);
|
|
if steep
|
|
img(ypxl2, xpxl2) = rfpart(yend) * xgap;
|
|
img(ypxl2+1, xpxl2) = fpart(yend) * xgap;
|
|
else
|
|
img(xpxl2, ypxl2 ) = rfpart(yend) * xgap;
|
|
img(xpxl2, ypxl2+1) = fpart(yend) * xgap;
|
|
end
|
|
|
|
% main loop
|
|
if steep
|
|
for x = (xpxl1+1):(xpxl2-1)
|
|
img(floor(intery), x) = rfpart(intery);
|
|
img(floor(intery)+1, x) = fpart(intery);
|
|
intery = intery + grad;
|
|
end
|
|
else
|
|
for x = (xpxl1+1):(xpxl2-1)
|
|
img(x, floor(intery) ) = rfpart(intery);
|
|
img(x, floor(intery)+1) = fpart(intery);
|
|
intery = intery + grad;
|
|
end
|
|
end
|
|
end
|