#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。
C 曲線
https://blog.goo.ne.jp/r-de-r/e/f5aa8e4436033d181824365a32640b91
ファイル名: drawC.jl 関数名:
翻訳するときに書いたメモ
これも,奥村先生のプログラムを参考に書いたもののはず。アルゴリズム辞典の表紙に描いてあった。
R での実行を観察すると,線分を逐次描いている様子がわかる。しかしこれがネックで,DrawCmain1 はとてつもなく実行時間がかかる。
R ではさほどでもないのだが,Julia では,ハングアップしたかと思うほど。plot!() の呼出にコストが掛かっているのだ。
n が 1 増えると,実行時間は 4 倍くらいになるのかな。
そこで,線分の座標のみを蓄積して,最後に一度だけ plot!() するようにすれば爆速になった。
n = 13 のときには,2000 倍ということだ。
drawCmain1(0, 4, 0, -4, 11) # 7.971522
drawCmain1(0, 4, 0, -4, 12) # 33.294714
drawCmain1(0, 4, 0, -4, 13) # 159.953883
drawCmain2(0, 4, 0, -4, 11) # 0.049090
drawCmain2(0, 4, 0, -4, 12) # 0.063444
drawCmain2(0, 4, 0, -4, 13) # 0.081188 単位 sec.
==========#
using Plots
function drawCmain1(ax, ay, bx, by, n)
function drawC(ax, ay, bx, by, n)
x = bx-ax
y = ay-by
z = (x-y)/2
cx = ax+z
cy = by-z
if n == 0
plot!([ax, cx, bx], [ay, cy, by])
else
drawC(ax, ay, cx, cy, n-1)
drawC(cx, cy, bx, by, n-1)
end
end
gr(grid=false, showaxis=false, color=:red, ticks=false,
aspect_ratio=1, label=false)
plt = plot(xlims=(-8, 4), ylims=(-8, 8));
drawC(ax, ay, bx, by, n) # 0, 4, 0, -4, 14
savefig("drawc.png")
display(plt)
end
drawCmain1(0, 4, 0, -4, 11)
using Plots
function drawCmain2(ax, ay, bx, by, n)
function drawC(ax, ay, bx, by, n)
x = bx-ax
y = ay-by
z = (x-y)/2
cx = ax+z
cy = by-z
if n == 0
append!(savedx, [ax, cx, bx])
append!(savedy, [ay, cy, by])
else
drawC(ax, ay, cx, cy, n-1)
drawC(cx, cy, bx, by, n-1)
end
end
gr(grid=false, showaxis=false, color=:red, ticks=false,
aspect_ratio=1, label=false)
plt = plot(xlims=(-8, 4), ylims=(-8, 8));
savedx = []
savedy = []
drawC(ax, ay, bx, by, n) # 0, 4, 0, -4, 14
plot!(savedx, savedy)
savefig("drawc.png")
display(plt)
end
drawCmain2(0, 4, 0, -4, 15)
※コメント投稿者のブログIDはブログ作成者のみに通知されます