xelf.starlit.lua for mdiapp 1.00i

機能

 記号的な星空を描画します。

用法

 32bppアクティブレイヤー(空きでよい)で実行しましょう。
 それより下層に空として暗い下地を用意するとよいかも知れません。
 領域選択に対応した動作をつけました。星の中心濃度を基準に不透明度を調整するようにしました。星は境界で完全にクリップされるわけではありません。

コメント

 mdi_vertex_add, mdi_vertex_clear, mdi_img32_polygonのAPI追加記念で使ってみました。
 テーブルから関数を取り出しておいて呼び出す方が動作が速い印象です。

-- 星空 for mdiapp 1.00i
-- xelf.starlit.lua (C)2006-09-17〜2006-09-18 XELF

local w1, h1 = mdi_width(), mdi_height();
local r,g,b,a = 255,192, 64,255;
local rot = math.pi / 5;
local radius = math.sqrt(w1 * h1) / 128;
local pi2 = math.pi * 2;
local scaling = 1 / 255;
local rnd, sin, cos, mod = math.random, math.sin, math.cos, math.mod;
mdi_undo_all();
mdi_img32_bltmode_normal();
local i0 = mdi_img_layer(mdi_layer_active());
for i=0,2000 do
	mdi_vertex_clear();
	local cx,cy = rnd() * w1, rnd() * h1;
	local rot0 = rnd() * pi2;
	local rad = rnd() * radius;
	for j=0,10 do
		local rotation = rot * j + rot0;
		local rad2 = rad * (1+ mod(j, 2));
		local dx = sin(rotation) * rad2;
		local dy = cos(rotation) * rad2;
		mdi_vertex_add(cx + dx, cy + dy);
	end
	local r1,g1,b1,a1 = rnd(r, 255), rnd(g, 255), rnd(b, 255), rnd(a, 255);
	local s1 = mdi_select_pixelget(cx, cy);
	mdi_img32_polygon(i0, r1,g1,b1,a1 * s1 * scaling);
end