裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

描画関数を組み合わせて「麻の葉格子」を描く

2021年08月10日 | ブログラミング

日本古来の「麻の葉格子」を描いてみる。

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")

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« R の gmp, Rmpfr が動かない | トップ | Plots で使える描画関数に糖... »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事