Views
LineStippleSnippet
With the removal of setLineStipple in LÖVE 0.8.0 here is an alternative, based on Bresenham's Line Drawing Algorithm.
function lineStipple( x1, y1, x2, y2, dash, gap )
local dash = dash or 10
local gap = dash + (gap or 10)
local steep = math.abs(y2-y1) > math.abs(x2-x1)
if steep then
x1, y1 = y1, x1
x2, y2 = y2, x2
end
if x1 > x2 then
x1, x2 = x2, x1
y1, y2 = y2, y1
end
local dx = x2 - x1
local dy = math.abs( y2 - y1 )
local err = dx / 2
local ystep = (y1 < y2) and 1 or -1
local y = y1
local maxX = x2
local pixelCount = 0
local isDash = true
local lastA, lastB, a, b
for x = x1, maxX do
pixelCount = pixelCount + 1
if (isDash and pixelCount == dash) or (not isDash and pixelCount == gap) then
pixelCount = 0
isDash = not isDash
a = steep and y or x
b = steep and x or y
if lastA then
love.graphics.line( lastA, lastB, a, b )
lastA = nil
lastB = nil
else
lastA = a
lastB = b
end
end
err = err - dy
if err < 0 then
y = y + ystep
err = err + dx
end
end
end
local dash = dash or 10
local gap = dash + (gap or 10)
local steep = math.abs(y2-y1) > math.abs(x2-x1)
if steep then
x1, y1 = y1, x1
x2, y2 = y2, x2
end
if x1 > x2 then
x1, x2 = x2, x1
y1, y2 = y2, y1
end
local dx = x2 - x1
local dy = math.abs( y2 - y1 )
local err = dx / 2
local ystep = (y1 < y2) and 1 or -1
local y = y1
local maxX = x2
local pixelCount = 0
local isDash = true
local lastA, lastB, a, b
for x = x1, maxX do
pixelCount = pixelCount + 1
if (isDash and pixelCount == dash) or (not isDash and pixelCount == gap) then
pixelCount = 0
isDash = not isDash
a = steep and y or x
b = steep and x or y
if lastA then
love.graphics.line( lastA, lastB, a, b )
lastA = nil
lastB = nil
else
lastA = a
lastB = b
end
end
err = err - dy
if err < 0 then
y = y + ystep
err = err + dx
end
end
end
Here's an alternative to the alternative above. This uses the function P(t) = A + t*(B-A), where A = (x1, y1) and B = (x2, y2) to find n = length/size points and draw n lines using love.graphics.line with distance = interval*size between each line.
function dottedLine(x1, y1, x2, y2, size, interval)
local size = size or 5
local interval = interval or 2
local dx = (x1-x2)*(x1-x2)
local dy = (y1-y2)*(y1-y2)
local length = math.sqrt(dx+dy)
local t = size/interval
for i = 1, math.floor(length/size) do
if i % interval == 0 then
love.graphics.line(x1+t*(i-1)*(x2-x1), y1+t*(i-1)*(y2-y1),
x1+t*i*(x2-x1), y1*t*i*(y2-y1))
end
end
end
local size = size or 5
local interval = interval or 2
local dx = (x1-x2)*(x1-x2)
local dy = (y1-y2)*(y1-y2)
local length = math.sqrt(dx+dy)
local t = size/interval
for i = 1, math.floor(length/size) do
if i % interval == 0 then
love.graphics.line(x1+t*(i-1)*(x2-x1), y1+t*(i-1)*(y2-y1),
x1+t*i*(x2-x1), y1*t*i*(y2-y1))
end
end
end