76 lines
1.8 KiB
Plaintext
76 lines
1.8 KiB
Plaintext
using Images
|
|
|
|
fpart(x) = mod(x, one(x))
|
|
rfpart(x) = one(x) - fpart(x)
|
|
|
|
function drawline!(img::Matrix{Gray{N0f8}}, x0::Integer, y0::Integer, x1::Integer, y1::Integer)
|
|
steep = abs(y1 - y0) > abs(x1 - x0)
|
|
|
|
if steep
|
|
x0, y0 = y0, x0
|
|
x1, y1 = y1, x1
|
|
end
|
|
if x0 > x1
|
|
x0, x1 = x1, x0
|
|
y0, y1 = y1, y0
|
|
end
|
|
|
|
dx = x1 - x0
|
|
dy = y1 - y0
|
|
grad = dy / dx
|
|
|
|
if iszero(dx)
|
|
grad = oftype(grad, 1.0)
|
|
end
|
|
|
|
# handle first endpoint
|
|
xend = round(Int, x0)
|
|
yend = y0 + grad * (xend - x0)
|
|
xgap = rfpart(x0 + 0.5)
|
|
xpxl1 = xend
|
|
ypxl1 = floor(Int, 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(Int, x1)
|
|
yend = y1 + grad * (xend - x1)
|
|
xgap = fpart(x1 + 0.5)
|
|
xpxl2 = xend
|
|
ypxl2 = floor(Int, 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 in xpxl1+1:xpxl2-1
|
|
img[floor(Int, intery), x] = rfpart(intery)
|
|
img[floor(Int, intery)+1, x] = fpart(intery)
|
|
intery += grad
|
|
end
|
|
else
|
|
for x in xpxl1+1:xpxl2-1
|
|
img[x, floor(Int, intery) ] = rfpart(intery)
|
|
img[x, floor(Int, intery)+1] = fpart(intery)
|
|
intery += grad
|
|
end
|
|
end
|
|
|
|
return img
|
|
end
|
|
|
|
img = fill(Gray(1.0N0f8), 250, 250);
|
|
drawline!(img, 8, 8, 192, 154)
|