Difference between revisions of "LineStippleSnippet (日本語)"
(Created page with "これは LÖVE 0.8.0 で廃止された setLineStipple であり、ブレゼンハムの線描アルゴリズムを元にした代替品です。 <source lang="lua"> fun...") |
m |
||
Line 1: | Line 1: | ||
− | これは LÖVE [[0.8.0]] で廃止された setLineStipple であり、ブレゼンハムの線描アルゴリズムを元にした代替品です。 | + | これは LÖVE [[0.8.0 (日本語)|0.8.0]] で廃止された setLineStipple であり、ブレゼンハムの線描アルゴリズムを元にした代替品です。 |
<source lang="lua"> | <source lang="lua"> | ||
Line 74: | Line 74: | ||
[[Category:Snippets (日本語)]] | [[Category:Snippets (日本語)]] | ||
+ | {{#set:LOVE Version=any}} | ||
+ | {{#set:Description=0.8.0 で廃止された setLineStipple 関数の代用。}} |
Latest revision as of 00:43, 15 November 2016
これは 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