少し流行に乗り遅れた感がありますが,HSPでシダを描画したので載せます.
元ネタ
ソースコード
tytyさんによる「再帰モジュール」が別途必要です.
ダウンロードし,m_rec.hspファイルを同じディレクトリに配置してください.
Nの値を調節すると,いい具合の時間で終わります.
sida.hsp
#include "hsp3dish.as"
#include "m_rec.hsp"
rec_init 100000
#module
#defcfunc W1x double px, double py
return 0.836 * px + 0.044 * py
#defcfunc W1y double px, double py
return -0.044 * px + 0.836 * py + 0.169
#defcfunc W2x double px, double py
return -0.141 * px + 0.302 * py
#defcfunc W2y double px, double py
return 0.302 * px + 0.141 * py + 0.127
#defcfunc W3x double px, double py
return 0.141 * px - 0.302 * py
#defcfunc W3y double px, double py
return 0.302 * px + 0.141 * py + 0.169
#defcfunc W4x double px, double py
return 0.0
#defcfunc W4y double px, double py
return 0.175337 * py
#global
#const N 20
screen 0, 640, 480
*main
// 画面の書き換えを止める
redraw 0
color 255, 255, 255
boxf
pos 10, 10
color 0, 0, 0
mes "Drawing..."
k = N
x = 0.0
y = 0.0
rec_begin k, x, y
if (0 < k) {
rec_call k-1, W1x(x, y), W1y(x, y)
if (rnd(3) == 0) :rec_call k-1, W2x(x, y), W2y(x, y)
if (rnd(3) == 0) :rec_call k-1, W3x(x, y), W3y(x, y)
if (rnd(3) == 0) :rec_call k-1, W4x(x, y), W4y(x, y)
} else {
color 0, 255, 0
dx = int(x*ginfo_winx) + ginfo_winx/2
dy = ginfo_winy - int(y*ginfo_winy)
boxf dx, dy, dx+1, dy+1
}
rec_end
color 255, 255, 255
boxf 0, 0, 100, 100
pos 10, 10
color 0, 0, 0: mes "Finished"
// 画面の書き換えを反映
redraw 1