日本古来の「麻の葉格子」を描いてみる。
using Plots で使える関数を直接使っても当然描けるが,使い勝手のよいように糖衣をかぶせた関数群を用意している。以前このブログにも掲載したが,その後少々手直しをして使っている。この関数群は plotter.jl というファイルに用意しているので,使うためには include する。using で使えるようにしてもよいのだが,かえって面倒くさいようなので,このようにしている。
include("plotter.jl")
参照:Plots で使える描画関数に糖衣をかぶせた自作描画関数群
なお,以下の出画例は png ファイルであるが,pdf ファイルで保存するとジャギーでない綺麗な(拡大縮小が自在な)図形が描かれると思う。
麻の葉格子は何通りかあるが,一番オーソドックスなのが以下のもの。繰り返しの基本パターンを unit() で定義している。それを二重の for 文で領域に敷き詰めていく。
function asanoha(nx=6, ny=5; r=1, width=600, height=400)
a = r * sqrt(3) / 2
b = r / 2
c = a / 3
function unit(x, y)
plotline(x .+ [-a, -a, -c, 0, -a+c, -a, 0, 0], y .+ [0, b, b, 0, 0, b, 0, b])
plotline(x .+ [ a, a, c, 0, a-c, a, 0, 0], y .+ [0, b, b, 0, 0, b, 0, b])
plotline(x .+ [-a, -a, -c, 0, -a+c, -a, 0, 0], y .+ [0, -b, -b, 0, 0, -b, 0, -b])
plotline(x .+ [ a, a, c, 0, a-c, a, 0, 0], y .+ [0, -b, -b, 0, 0, -b, 0, -b])
end
plotbegin(w=width, h=height)
x1, y1, x2, y2 = a, b, 2(nx + 0.5) * a, (2ny + 1) * b
println("(width, height) = ($(x2 - x1), $(y2 - y1))")
plotlimit(x1, y1, x2, y2)
plotbox(x1, y1, x2, y2)
for x = 1:nx
for y = 1:ny
unit(2a * x, 2b * y)
end
end
plotend()
end
asanoha(4, 3, width=500, height=216)
savefig("fig.png")
2 つ目は,よく似ているが,三菱マークが挿入されているもの。これも基本パターンを unit2() で定義しているのを,二重の for ループで,領域内に敷き詰めていく。
function asanoha2(nx=6, ny=5; r=1, width=600, height=400)
function unit2(x, y)
xs = [b, c, 0, a, c]
ys = [r2, r2, 0, 0, r2]
xs2 = copy(xs)
ys2 = copy(ys)
for θ = 0:60:300 # degree
for i = 1:5
xs2[i], ys2[i] = xs[i] * cosd(θ) + ys[i] * sind(θ), xs[i] * sind(θ) - ys[i] * cosd(θ)
end
plotline(x .+ xs2, y .+ ys2)
end
end
sqrt3 = sqrt(3)
a = r / sqrt3
b = a / 2
c = 3b
r2 = r / 2
plotbegin(w=width, h=height)
x1, y1, x2, y2 = 1.5r * sqrt3, r, (nx + 1.5) * r * sqrt3, (1.5ny + 0.5)r
println("(width, height) = ($(x2 - x1), $(y2 - y1))")
plotlimit(x1, y1, x2, y2)
plotbox(x1, y1, x2, y2)
for y = 1:ny
for x = 1:nx + 1
unit2(x * sqrt3 * r + (y % 2) * sqrt3 * r / 2, y * r * 1.5)
end
end
plotend()
end
asanoha2(5, 4, width=500, height=318)
savefig("fig2.png")
3 つ目は,2 つ目の麻の葉格子に円を加えたもの。ちょっとした違いだが,印象はかなり違ってくる。
function asanoha3(nx=6, ny=5; r=1, width=600, height=400)
function unit2(x, y)
xs = [b, c, 0, a, c]
ys = [r2, r2, 0, 0, r2]
xs2 = copy(xs)
ys2 = copy(ys)
for θ = 0:60:300 # degree
for i = 1:5
xs2[i], ys2[i] = xs[i] * cosd(θ) + ys[i] * sind(θ), xs[i] * sind(θ) - ys[i] * cosd(θ)
end
plotline(x .+ xs2, y .+ ys2)
plotcircle(x, y, r)
end
end
sqrt3 = sqrt(3)
a = r / sqrt3
b = a / 2
c = 3b
r2 = r / 2
plotbegin(w=width, h=height)
x1, y1, x2, y2 = 1.5r * sqrt3, r, (nx + 1.5) * r * sqrt3, (1.5ny + 0.5)r
println("(width, height) = ($(x2 - x1), $(y2 - y1))")
plotlimit(x1, y1, x2, y2)
plotbox(x1, y1, x2, y2)
for y = 1:ny
for x = 1:nx + 1
unit2(x * sqrt3 * r + (y % 2) * sqrt3 * r / 2, y * r * 1.5)
end
end
plotend()
end
asanoha3(5, 4, width=500, height=318)
savefig("fig3.png")
※コメント投稿者のブログIDはブログ作成者のみに通知されます