RosettaCodeData/Task/Bitmap-Bresenhams-line-algo.../Pluto/bitmap-bresenhams-line-algo...

28 lines
749 B
Plaintext

local canvas = require "canvas"
local function line(c, x0, y0, x1, y1, col)
local dx = math.abs(x1 - x0)
local dy = math.abs(y1 - y0)
local sx = (x0 < x1) ? 1 : -1
local sy = (y0 < y1) ? 1 : -1
local err = (dx > dy ? dx : - dy) // 2
while true do
c:set(x0, y0, col)
if x0 == x1 and y0 == y1 then break end
local e2 = err
if e2 > -dx then
err -= dy
x0 += sx
end
if e2 < dy then
err += dx
y0 += sy
end
end
end
local c = canvas.new(400, 400)
c:fill(0xffffff) -- white background
line(c, 0, 0, 399, 399, 0x0000ff) -- draw a red diagonal
io.contents("mybmp.bmp", c:tobmp()) -- save to a bitmap file