LineStippleSnippet (日本語)

これは LÖVE 0.8.0 で廃止された setLineStipple であり、ブレゼンハムの線描アルゴリズムを元にした代替品です。

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

これは関数 P(t) = A + t*(B-A) を使用しており、場所は A = (x1, y1) および B = (x2, y2) にて n = 点の長さ(length)÷大きさ(size)の検出をして各線間の距離(distance ) = 区間 (interval) ×大きさ(size) により線 n を love.graphics.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