FireAlpaca用ブラシスクリプト「定規ブラシ」を作成しました
あったら便利だろうなー、となんとなく思って「定規ブラシ」というものを作ってみました。曲線に目盛りを打つことも可能です。
ブラシのDownloadは記事下部のリンク先より行ってください。
仕様
F-Ruler_10i.bs のほうは大きい目盛りが 10 inch 、100 mm、100 pixel、
F-Ruler_ni.bs のほうは大きい目盛りが 1 inch、10mm、100 pixel
ごとに描画されるようになっています。0.5単位ごとに半分の幅の、0.1単位ごとにその半分の目盛りが描画されます。
最大描画幅はブラシ幅と同じです。
パラメータ
「太さ」についてはそのままです。
チェックボックスについては一つ目のチェックボックスの設定が優先されます。
スクリプト
function default_size()
return 120 , 1
end
function param1()
return "太さ" , 0 , 100 , 35
end
function param2()
return "10 mm" , 0 , 1 , 0
end
function param3()
return "100 pixel" , 0 , 1 , 0
end
function main ( x , y , p )
ww = bs_param1() * 0.1
local w = bs_width()
if w < 5 then
w = 5
end
local k = 1
if bs_param2() == 1 then
k = 1 / 2.54
elseif bs_param3() == 1 then
k = 100 / bs_canvas_dpi()
end
if not firstDraw then
local distance = bs_distance( lastDrawX - x , lastDrawY - y )
if distance < n_Inch * k then
return 0
end
end
if j % 10 == 0 then
w = 0.5 * w
elseif j % 5 == 0 then
w = 0.25 * w
else
w = 0.125 * w
end
local dx , dy = bs_dir()
local nx , ny = bs_normal()
bs_polygon( x + dx * ww * 0.5 - nx * w , y + dy * ww * 0.5 - ny * w )
bs_polygon( x + dx * ww * 0.5 + nx * w , y + dy * ww * 0.5 + ny * w )
bs_polygon( x - dx * ww * 0.5 + nx * w , y - dy * ww * 0.5 + ny * w )
bs_polygon( x - dx * ww * 0.5 - nx * w , y - dy * ww * 0.5 - ny * w )
local r , g , b = bs_fore()
bs_fill( r ,g , b , 255 )
lastDrawX = x
lastDrawY = y
firstDraw = false
j = j + 1
end
n_Inch = bs_canvas_dpi() / 10
j = 0
lastDrawX = 0
lastDrawY = 0
firstDraw = true
※ F-Ruler_ni.bs
スクリプト解説
定規の特性
定規は目盛りによって長さ(ブラシ幅)が異なる。この長さを決定しているのが
if j % 10 == 0 then
w = 0.5 * w
elseif j % 5 == 0 then
w = 0.25 * w
else
w = 0.125 * w
end
という部分で、j によって制御されている。j は最初、クローバル変数としてmain関数の外で宣言され、main関数の中で目盛りをひとつ描画するたびに値が1 増えるようになっている。
dip から inch への変換
画像にはそれぞれデータ精度としてdpiが指定されている。dpiは「dots per inch」の略で、1 inch あたり(1平方inchではない)にどれだけの dot があるかを示す値であるので、例えば 350 dpi の画像で1 inch を測りたいときは dpi の数だけ数えればいいことになる。ただし、F-Ruler_ni.bs では 1 inch を大きな目盛りとして扱いたいので、
n_Inch = bs_canvas_dpi() / 10
として1 inch の 1 / 10 の目盛りを描画するためにグローバル宣言を行っている。(実際にコードの中では pixel 値として扱われている)
inch から mm、pixcel への変換と描画間隔
25.4 mm = 1 inchで、dot (pixel)の関係は上で示した 通りなので、最後の描画中心座標からの現在のペンの座標に距離(恐らく n_Inch というグローバル変数を main 関数内部から変更できないから) k を媒介して比較し、次の描画中心座標を決定している。
local k = 1
if bs_param2() == 1 then
k = 1 / 2.54
elseif bs_param3() == 1 then
k = 100 / bs_canvas_dpi()
end
if not firstDraw then
local distance = bs_distance( lastDrawX - x , lastDrawY - y )
if distance < n_Inch * k then
return 0
end
end
そのため、n_Inch * k に対してペン軌道の曲率が大きすぎなければ、直線でなくでもほぼ正確な目盛りを描画することができる。
粒子(目盛り)の描画
下図の通り。
Download
ブラシのDownloadは以下のリンク先から行ってください。