裏 RjpWiki

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

Julia の小ネタ--034 13日の金曜日

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

次の 13 日の金曜日はいつか?
https://blog.goo.ne.jp/r-de-r/e/272d3d9769162586c72cf886bd89de27

は Dates パッケージで簡単に求まる。

2021/01/01 〜 2029/12/31 までの 13 日の金曜日は?

using Dates
dr = Date(2021):Day(1):Date(2029, 12, 31);
result = filter(dr) do x
   dayofweek(x) == Fri && day(x) == 13
end
#=
14-element Vector{Date}:
 2021-08-13
 2022-05-13
 2023-01-13
 2023-10-13
 2024-09-13
 2024-12-13
 2025-06-13
 2026-02-13
 2026-03-13
 2026-11-13
 2027-08-13
 2028-10-13
 2029-04-13
 2029-07-13
=#

確認

dayname.(result)
#=
14-element Vector{String}:
 "Friday"
 "Friday"
 "Friday"
 "Friday"
 "Friday"
 "Friday"
 "Friday"
 "Friday"
 "Friday"
 "Friday"
 "Friday"
 "Friday"
 "Friday"
 "Friday"
=#

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia の小ネタ--033 大きな配列も省略せずに全部表示

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

多くの言語において,REPL では大きな配列は全部表示しないで途中を省略して表示する。

それは便利だが,ときどき全部表示したいときもある。

そんなとき Julia ではこうする。

x = randn(50, 3);

制限なしにする
io = IOContext(stdout, :limit => false)
Base.print_matrix(io, x) # 全部表示される
Base.print_matrix(io, round.(x, digits=2), "", "\t", "\n") # 全部表示される
Base.print_array(io, x) # 全部表示される
x # REPL では省略されて表示される

制限ありにする(デフォルトに戻す)
io = IOContext(stdout, :limit => true)
Base.print_matrix(io, x) # 省略されて表示される
それ以外の用法でも同じ

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia の小ネタ--032 IO バッファー

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

入力バッファー

複数行の文字列

a ="""
10 200
abc def
xyz
"""

a は "10 200\nabc def\nxyz\n" という文字列と同じ。つまり,改行文字 "\n" が含まれる。

文字列を IO バッファーに設定する。

io = IOBuffer(a)
#=
IOBuffer(data=UInt8[...], readable=true, writable=false, seekable=true, append=false, size=19, maxsize=Inf, ptr=1, mark=-1)
=#

io から readlines() で,全てを入力する。
改行で区切って,文字列ベクトルとして入力される。

readlines(io)
#=
3-element Vector{String}:
 "10 200"
 "abc def"
 "xyz"
=#

readline() では一行ずつ入力される。

io = IOBuffer(a)
readline(io) # "10 200"
readline(io) # "abc def"
readline(io) # "xyz"
readline(io) # "" 最終行まで読み込んだ後は空がかえされるだけ

前もって読み込む行がどのようになっているかわかっているなら,普通の readline(stdin) と同じように扱える。 

io = IOBuffer(a)
parse.(Int, split(readline(io)))
#=
2-element Vector{Int64}:
  10
 200
=#

出力バッファー

IOBuffer で data 引数を省略すると出力バッファーになる。

io = IOBuffer()
#=
IOBuffer(data=UInt8[...], readable=true, writable=true, seekable=true, append=false, size=0, maxsize=Inf, ptr=1, mark=-1)
=#

出力バッファーに書き出すのは write() である。
write() するごとに,内容が追加される。改行文字は自動的には付かない。

write(io, "hello, world!")
write(io, "goodbye")

バッファーの中身を取り出すのは take!()。ただし,take!() で得られるのは Vector{UInt8} なので,普通の文字列にするには String() を適用する。

String(take!(io)) # "hello, world!goodbye"

取り出した後は,出力バッファーは空になる。

上に引き続いてすぐに。

String(take!(io)) # ""

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia の小ネタ--031 日本語での月と曜日の名前と略称

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

日本語での月と曜日の名前と略称

using Dates

最初に以下を定義しておく

japanese_months = ["睦月", "如月", "弥生", "卯月", "皐月", "水無月",
                   "文月", "葉月", "長月", "神無月", "霜月", "師走"];

japanese_monts_abbrev = string.(1:12) .* "月";
japanese_days = ["月曜日","火曜日","水曜日","木曜日","金曜日","土曜日","日曜日"];
# japanese_days_abbrev = ["月","火","水","木","金","土","日"];
japanese_days_abbrev = ["(月)","(火)","(水)","(木)","(金)","(土)","(日)"];
Dates.LOCALES["japanese"] = Dates.DateLocale(japanese_months, japanese_monts_abbrev,
                                             japanese_days, japanese_days_abbrev);

そのあと,locale="japanese" を指定して関数を呼ぶ

t = Date(2021, 8, 24)
Dates.monthname(t; locale="japanese")    # "葉月"
Dates.monthabbr(t; locale="japanese")    # "8月" 略称
Dates.dayname(t; locale="japanese")      # "月曜日"
Dates.dayabbr(t; locale="japanese")      # "(月)" 略称

要するに,japanese_months,japanese_monts_abbrev,japanese_days,japanese_days_abbrev を好みで定義する。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で,k 番目の順列を取得するプログラム

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

順列を一瞬で取得するプログラム
https://itakanaya9.hatenablog.com/entry/2014/02/17/121428

を Julia に移植する。

function nthpermutation(x, k)
    k -= 1
    result = x
    if k > 0
        x = copy(x)
        n = length(x)
        reminder = zeros(Int, n)
        for i = 1:n
            reminder[i] = k % i + 1
            k ÷= i
        end
        for i = 1:n
            at = reminder[n-i+1]
            result[i] = x[at]
            deleteat!(x, at)
        end
    end
    return result
end

function nthpermutation(x)
    n = length(x)
    nrow = factorial(n)
    result = fill(x[1], nrow, n)
    for i = 1:nrow
        result[i, :] = nthpermutation(x, i)
    end
    return result
end

x = ["A", "B", "C", "D"]
nthpermutation(x, 10)
#=
4-element Vector{String}:
 "B"
 "C"
 "D"
 "A"
=#

x がどんな型でも,同じ型の結果を返す(当たり前だが)

x = collect(1:3)
for i = 1:factorial(length(x))
    println("$i, $(nthpermutation(x, i))")
end
#=
1, [1, 2, 3]
2, [1, 3, 2]
3, [2, 1, 3]
4, [2, 3, 1]
5, [3, 1, 2]
6, [3, 2, 1]
=#

引数が 1 つだと,全ての順列を返す関数が呼ばれる。

nthpermutation(x)
#=
6×3 Matrix{Int64}:
 1  2  3
 1  3  2
 2  1  3
 2  3  1
 3  1  2
 3  2  1
=#

x が重複する要素を持つ場合も,重複した順列を返すので注意。

a = nthpermutation([false, false, true, true, true])

重複を省いた結果を求める場合は unique() を使う。

unique(a, dims=1)
#=
10×5 Matrix{Bool}:
 0  0  1  1  1
 0  1  0  1  1
 0  1  1  0  1
 0  1  1  1  0
 1  0  1  0  1
 1  0  1  1  0
 1  0  0  1  1
 1  1  0  1  0
 1  1  0  0  1
 1  1  1  0  0
=#

k が大きかろうが小さかろうが,計算時間は同じ。

10 個の要素の最後の順列は 3628800 番目であるが,計算は瞬時。

@time nthpermutation(collect(1:10), 3628800)
#=
0.000003 seconds (4 allocations: 640 bytes)

10-element Vector{Int64}:
10
9
8
7
6
5
4
3
2
1
=#

実は,Conbinatrics の nthperm は同じことをしている(コーディングは洗練されているが)

using Combinatorics
@time nthperm(collect(1:10), 3628800)
#=
0.000004 seconds (2 allocations: 320 bytes)

10-element Vector{Int64}:
10
9
8
7
6
5
4
3
2
1
=#

ほとんど同じ計算時間である。

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で,ベクトル要素の全てと互いに素である整数のリストを求める

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

お題

ベクトル要素のそれぞれと互いに素である整数のリストを求める

ベクトル a の全ての要素との gcd(最大公約数)が 1(つまり,互いに素)である m 以下の整数を列挙する。
例えば,
a = [4, 6] で,m = 20 のとき
a に含まれる数の約数は,2, 3 の2個
1 〜 20 までの数のうち,
2 で割りきれるものは,題意を満たさない(gcd は 2)。題意を満たすのは 1,3,5,7,9,11,13,15,17,19 の 10 個
そのうち,3 で割りきれるものは,題意を満たさない(gcd は 3)。題意を満たすのは 1, 5, 7, 11, 13, 17, 19 の 7 個

エラトステネスの篩と同じ考え方

1 〜 m の集合の内,既存の数の倍数(a の各要素の約数の集合)を全部潰していって,残ったのが解の集合ということ。

# 約数の候補
function divisor(n)
    n % 2 == 0 && return 2
    maxitr = floor(Int, sqrt(n))
    for i = 3:2:maxitr
        n % i == 0 && return i
    end
    n
end

# 約数の集合
function factorization(n)
    result = []
    while n > 1
        div = divisor(n)
        append!(result, div)
        while n % div == 0
            n ÷= div
        end
    end
    result
end

# どの約数でも割りきれない数を残す
function f(n, m, a)
    set = Set()
    for i in a
        union!(set, Set(factorization(i)))
    end
    lengthofset = length(set)
    intvector = trues(m)
    for i in set
        maxindex = m ÷ i
        for j = 1:maxindex
            intvector[j*i] = false
        end
    end
    println(sum(intvector .== true))
    for (i, element) in enumerate(intvector)
        if element
            println(i)
        end
    end
end

a = [4, 6]
m = 20

f(length(a), m, a)
#=
7
1
5
7
11
13
17
19
=#

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ひねくれ者のプログラマー(追記あり)

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

普通に書いたら何の面白味もないので,ひねくれた書き方をしてみる。

追記:何点か(たくさん)修正しました(赤字の部分)。2021/08/26

お題

整数値をとる引数が,1〜125 なら 1,126〜211 なら 2,212〜214 なら 3 を返す関数を定義せよ。

まともな解答??

function f1(N::Int64)
    if 1 <= N <= 125
        return 1
    elseif 126 <= N <= 211
        return 2
    elseif 212 <= N <= 214
        return 3

    else
        return "error"
    end
end

f1(215) # "error" という文字列を返す
f1(3.5) # Julia から "MethodError: no method matching f1(::Float64)" を返す

ひねくれ者の解答

1〜214  のときに返す値のベクトルを用意しておいて,整数引数を添え字として値を返す。
添え字範囲を超えると Julia が  BoundsError を返す

function f2(N::Int64)
    return vcat(fill(1, 125), fill(2, 86), fill(3, 3))[N]
end

一行で書くならば,

f3(N::Int64) = vcat(fill(1, 125), fill(2, 86), fill(3, 3))[N]

多項式近似して

f4(N::Int64) = round(Int, sum([1.15683106318897e+00, -3.85131039015425e-02, 2.25503374685424e-03, -5.10900952943894e-05, 5.19543217094899e-07, -2.36769347431069e-09, 3.95939127643363e-12] .* (N.^(0:6))))

というのもありか。

追記

中澤さんからのコメントで,新たなアルゴリズムが提示されました。
Rだと
f5 <- function(N) { (N %/% 1 > 0) + (N %/% 126 > 0) + (N %/% 211 > 0) }

それに基づいて,なるべくちゃんとした結果を返す Julia プログラムを書いてみました。

f5(N::Int) =  0 < N < 215 ? 1 + (N ÷ 126 > 0) + (N ÷ 212 > 0) : "error"

f5(1)   # 1
f5(125) # 1
f5(126) # 2
f5(211) # 2
f5(212) # 3
f5(214) # 3
f5(215) # "error"
f5(1.3) # MethodError
f5(0)   # "error"
f5(-1)  # "error"

ちゃんとした結果を返すプログラムを書くのは,けっこう大変ですね。

コメント (3)
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で円をモチーフにした格子模様を描く with cherry blossoms(5)

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

Julia で円をモチーフにした格子模様を描く(5)

plotter.jl を include
https://blog.goo.ne.jp/r-de-r/e/bd71a52a09801335d56f7c47d879bfe3

include("plotter.jl")

function en5(nx=6, ny=5; r=1, factor=0.985, width=600, height=400)
    function unit(x, y, r)
        deg = 180:0.25:270
        xs = zeros(length(deg), 2)
        ys = similar(xs)
        for (i, θ) = enumerate(deg)
            xs[i, 1] = cosd(θ)factor + r
            xs[i, 2] = cosd(θ-180)factor
            ys[i, 1] = sind(θ)factor + r
            ys[i, 2] = sind(θ-180)factor
        end
        xs = reshape(xs, :, 1)
        ys = reshape(ys, :, 1)
        xs2 = copy(xs)
        ys2 = copy(ys)
        for θ = 0:90:270 # degree
            for i = 1:length(xs)
                xs2[i], ys2[i] = xs[i]cosd(θ) + ys[i]sind(θ), xs[i]sind(θ) - ys[i]cosd(θ)
            end
            plotpolygon(x .+ xs2, y .+ ys2, lwd=0, col=:palegreen4, fcol=:palegreen4)
        end
    end
    function cherryblossom(x, y, r)
        R = 0.6r
        deg = -asind(r/2R):0.5:asind(r/2R)
        n = floor(Int, 0.9length(deg))
        xs = zeros(n);
        ys = similar(xs);
        for i = 1:n
            xs[i] = cosd(deg[i])R - cosd(asind(r/2R))R
            ys[i] = sind(deg[i])R + 0.5r
        end
        xs = vcat(xs, -reverse(xs))
        ys = vcat(ys, reverse(ys))
        xs[n+1] = 0.5(xs[n] + xs[n+1])
        ys[n+1] = 0.85r
        xs2 = copy(xs)
        ys2 = copy(ys)
        randdeg = rand(0:35)
        for θ = 36+randdeg:72:324+randdeg # degree
            sine, cosine = sincosd(θ)
            for i = 1:length(xs)
                xs2[i], ys2[i] = xs[i]cosine + ys[i]sine, xs[i]sine - ys[i]cosine
            end
            plotpolygon(x .+ xs2, y .+ ys2, col=:pink, fcol=:pink)
        end
        plotcircle(x, y, 0.08r, col=:white, fcol=:white)
    end
    x1, y1, x2, y2 = 0, r, 2nx, 2ny+r
    println("(width, height) = ($(x2 - x1), $(y2 - y1))")
    plotbegin(w=width, h=height)
    plotlimit(x1, y1, x2, y2)
    for y = 1:2ny+1
        for x = 0:2nx
            if y % 2 != x %2
                unit(x, y, r)
                cherryblossom(x, y, 0.4r)
            end
        end
    end
    plotend()
end

@time en5(5, 4, width=600, height=480)
savefig("en5.png")

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で円をモチーフにした格子模様を描く(4)

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

Julia で円をモチーフにした格子模様を描く(4)

plotter.jl を include
https://blog.goo.ne.jp/r-de-r/e/bd71a52a09801335d56f7c47d879bfe3

include("plotter.jl")

function en4(nx=6, ny=5; r=1, factor=0.985, width=600, height=400)
    function unit(x, y, r)
        deg = 180:0.25:270
        xs = zeros(length(deg), 2)
        ys = zeros(length(deg), 2)
        for (i, θ) = enumerate(deg)
            xs[i, 1] = cosd(θ)factor + r
            xs[i, 2] = cosd(θ-180)factor
            ys[i, 1] = sind(θ)factor + r
            ys[i, 2] = sind(θ-180)factor
        end
        xs = reshape(xs, :, 1)
        ys = reshape(ys, :, 1)
        xs2 = copy(xs)
        ys2 = copy(ys)
        for θ = 0:90:270 # degree
            sine, cosine = sincosd(θ)
            for i = 1:length(xs)
                xs2[i], ys2[i] = xs[i]cosine + ys[i]sine, xs[i]sine - ys[i]cosine

            end
            plotpolygon(x .+ xs2, y .+ ys2, lwd=0, fcol=:black)
        end

    end
    x1, y1, x2, y2 = r, r, 2nx+r, 2ny+r
    println("(width, height) = ($(x2 - x1), $(y2 - y1))")
    plotbegin(w=width, h=height)
    #plotlimit(x1, y1, x2, y2)
    #plotbox(x1, y1, x2, y2, col=:gray, fcol=:gray)
    for y = 1:ny
        for x = 1:nx
          unit(2x, 2y, r)
        end
    end
    plotend()
end

en4(6, 4, width=600, height=400)
savefig("en4.png")

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で円をモチーフにした格子模様を描く(3)

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

Julia で円をモチーフにした格子模様を描く(3)

plotter.jl を include
https://blog.goo.ne.jp/r-de-r/e/bd71a52a09801335d56f7c47d879bfe3

include("plotter.jl")

function en3(nx=6, ny=5; r=1, factor=0.95, width=600, height=400)
    function unit(x, y, r)
        deg = 180:0.25:270
        xs = zeros(length(deg))
        ys = zeros(length(deg))
        for (i, θ) = enumerate(deg)
            xs[i] = cosd(θ)factor + r
            ys[i] = sind(θ)factor + r
        end
        xs2 = copy(xs)
        ys2 = copy(ys)
        for θ = 0:90:270 # degree
            for i = 1:length(xs)
                xs2[i], ys2[i] = xs[i] * cosd(θ) + ys[i] * sind(θ), xs[i] * sind(θ) - ys[i] * cosd(θ)
            end
            plotpolygon(x .+ xs2, y .+ ys2, fcol=:black)
        end

    end
    nx += 1
    ny += 1
    x1, y1, x2, y2 = r, r, nx, ny
    println("(width, height) = ($(x2 - x1), $(y2 - y1))")
    plotbegin(w=width, h=height)
    plotlimit(x1, y1, x2, y2)
    for y = 1:ny
        for x = 1:nx
          unit(x, y, r)
        end
    end
    plotend()
end

en3(6, 4, width=600, height=400)
savefig("en3.png")

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で千鳥格子を描く

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

Julia で千鳥格子を描く

千鳥格子は利休間道(りきゅうかんとう)ともいい,英語ではハウンズ・トゥース(猟犬のキバ)とのこと。

plotter.jl を include
https://blog.goo.ne.jp/r-de-r/e/bd71a52a09801335d56f7c47d879bfe3

include("plotter.jl")

function chidorigousi(nx, ny; a=1, width=600, height=400)
    function unit(x, y)
        col = :dodgerblue3
        plotpolygon(x .+ [0, 0.5,  0,    0, 1,   1, 1.5, 1, 1,  0.5, 0]a,
                    y .+ [0, 0,   -0.5, -1, 0, 0.5, 1,   1, 1.5,  1, 1]a,
                    col=col, fcol=col)
        plotpolygon(x .+ [1, 1.5, 2, 2]a, y .+ [0, 0, 0.5, 1]a,
                   
col=col, fcol=col)
    end
    nx += 1
    ny += 1
    x1, y1, x2, y2 = 2.5a, 2.5a, 2a*nx+0.5a, 2a*ny+0.5a
    println("(width, height) = ($(x2 - x1), $(y2 - y1))")
    plotbegin(w=width, h=height)
    plotlimit(x1, y1, x2, y2)
    for i = 1:nx
        for j = 1:ny
            unit(2i*a, 2j*a)
        end
    end
    plotend()
end

chidorigousi(6, 4, a=2, width=480, height=320)
savefig("chidorigousi.png")

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で亀甲ベースの格子模様を描く(8)

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

Julia で亀甲ベースの格子模様を描く(8)

plotter.jl を include
https://blog.goo.ne.jp/r-de-r/e/bd71a52a09801335d56f7c47d879bfe3

plotter.jl に plotarc() を追加した(未完成だが一応使える)

include("plotter.jl")

function kikkou8(nx=6, ny=5; r=1, R=0.7r, width=600, height=400)
    function unit(x, y, r, R)
        udrl1 = [:left, :left, :lower, :right, :upper, :upper]
        θ = asind(0.5r / R)
        xs = [0.5rsqrt3, 0, 0.5rsqrt3 - (1 - cosd(θ))R, NaN, 0.5rsqrt3]
        ys = [0.5r, 0, 0, NaN, -0.5r]
        xs2 = copy(xs)
        ys2 = copy(ys)
        for θ = 0:60:300 # degree
            for i = 1:length(xs)
                xs2[i], ys2[i] = xs[i] * cosd(θ) + ys[i] * sind(θ), xs[i] * sind(θ) - ys[i] * cosd(θ)
            end
            plotline(x .+ xs2, y .+ ys2, lwd=2, col=:cornsilk)
            plotarc(x + xs2[1], y + ys2[1], x + xs2[end], y + ys2[end], R,
                    udrl=udrl1[θ÷60+1], lwd=2, col=:cornsilk)
        end
    end
    sqrt3 = 
    rsqrt3 = sqrt(3)r
    nx += 1
    ny += 1
    x1, y1, x2, y2 = rsqrt3, r, (nx + 0.5) * rsqrt3, (1.5ny + 0.5)r
    println("(width, height) = ($(x2 - x1), $(y2 - y1))")
    plotbegin(w=width, h=height)
    plotlimit(x1, y1, x2, y2)
    plotbox(x1, y1, x2, y2, col=:gray, fcol=:gray)
    for y = 1:ny
        for x = 1:nx
            unit((x  + (y % 2)/2) * sqrt3 * r, y * 1.5r, r, R)
        end
    end
    plotend()
end

kikkou8(4, 3, width=625, height=440)
savefig("fig8.png")

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で亀甲ベースの格子模様を描く(7)

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

Julia で亀甲ベースの格子模様を描く(7)

plotter.jl を include
https://blog.goo.ne.jp/r-de-r/e/bd71a52a09801335d56f7c47d879bfe3

plotter.jl に plotarc() を追加した(未完成だが一応使える)

include("plotter.jl")

function kikkou7(nx=6, ny=5; r=1, d=r/3, width=600, height=400)
    function unit(x, y, r, d)
        udrl1 = [:lower, :lower, :lower, :upper, :upper, :upper]
        udrl2 = [:upper, :lower, :lower, :lower, :upper, :upper]
        xs = [0, sqrt3*r/2, sqrt3*r/2, NaN, sqrt3*d/2, sqrt3*d/2];
        ys = [0, r/2,       -r/2,      NaN, d/2,       -d/2];
        xs2 = copy(xs)
        ys2 = copy(ys)
        for θ = 0:60:300 # degree
            for i = 1:length(xs)
                xs2[i], ys2[i] = xs[i] * cosd(θ) + ys[i] * sind(θ), xs[i] * sind(θ) - ys[i] * cosd(θ)
            end
            plotline(x .+ xs2, y .+ ys2, lwd=4, col=:cornsilk)
            plotline(x .+ xs2[5:6], y .+ ys2[5:6], lwd=6, col=:cornsilk)
            cx, cy = (xs2[5] + xs2[6])/2, (ys2[5] + ys2[6])/2
            plotarc(x + cx, y + cy, x + xs2[2], y + ys2[2], 0.55r, udrl=udrl1[θ÷60+1], lwd=3, col=:cornsilk)
            plotarc(x + cx, y + cy, x + xs2[3], y + ys2[3], 0.55r, udrl=udrl2[θ÷60+1], lwd=3, col=:cornsilk)
        end
    end
    sqrt3 = sqrt(3)
    nx += 2
    ny += 1
    x1, y1, x2, y2 = r * sqrt3, 2r, nx * r * sqrt3, (1.5ny + 3)r
    println("(width, height) = ($(x2 - x1), $(y2 - y1))")
    plotbegin(w=width, h=height)
    plotlimit(x1, y1, x2, y2)
    plotbox(x1, y1, x2, y2, col=:gray, fcol=:gray)
    for y = 1:ny
        for x = 1:nx
            unit(x * sqrt3 * r, (2y + (x % 2))r, r, d)
        end
    end
    plotend()
end

(8.660254037844387, 7).*70
kikkou7(4, 3, width=610, height=490)
savefig("fig7.png")

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で亀甲ベースの格子模様を描く(6)

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

Julia で亀甲ベースの格子模様を描く(6)

plotter.jl を include
https://blog.goo.ne.jp/r-de-r/e/bd71a52a09801335d56f7c47d879bfe3

plotter.jl に plotarc() を追加した(未完成だが一応使える)

include("plotter.jl")

function kikkou6(nx=6, ny=5; r=1, d=r/4, width=600, height=400)
    function unit(x, y, r, d)
        udrl1 = [:lower, :lower, :lower, :upper, :upper, :upper]
        udrl2 = [:upper, :lower, :lower, :lower, :upper, :upper]
        xs = [0, sqrt3*r/2, sqrt3*r/2, NaN, sqrt3*d/2, sqrt3*d/2];
        ys = [0, r/2,       -r/2,      NaN, d/2,       -d/2];
        xs2 = copy(xs)
        ys2 = copy(ys)
        for θ = 0:60:300 # degree
            for i = 1:length(xs)
                xs2[i], ys2[i] = xs[i] * cosd(θ) + ys[i] * sind(θ), xs[i] * sind(θ) - ys[i] * cosd(θ)
            end
            plotline(x .+ xs2, y .+ ys2, lwd=4, col=:cornsilk)
            plotline(x .+ xs2[5:6], y .+ ys2[5:6], lwd=6, col=:cornsilk)
            cx, cy = (xs2[5] + xs2[6])/2, (ys2[5] + ys2[6])/2
            plotarc(x + cx, y + cy, x + xs2[2], y + ys2[2], 0.55r, udrl=udrl1[θ÷60+1], lwd=3, col=:cornsilk)
            plotarc(x + cx, y + cy, x + xs2[3], y + ys2[3], 0.55r, udrl=udrl2[θ÷60+1], lwd=3, col=:cornsilk)
        end
    end
    sqrt3 = sqrt(3)
    nx += 1
    ny += 1
    x1, y1, x2, y2 = r * sqrt3, r, (nx + 0.5) * r * sqrt3, (1.5ny + 0.5)r
    println("(width, height) = ($(x2 - x1), $(y2 - y1))")
    plotbegin(w=width, h=height)
    plotlimit(x1, y1, x2, y2)
    plotbox(x1, y1, x2, y2, col=:gray, fcol=:gray)
    for y = 1:ny
        for x = 1:nx
            unit((x  + (y % 2)/2) * sqrt3 * r, y * 1.5r, r, d)
        end
    end
    plotend()
end

kikkou6(4, 3, width=625, height=440)
savefig("fig6.png")

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Julia で円をモチーフにした格子模様を描く(2)

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

Julia で円をモチーフにした格子模様を描く(2)

plotter.jl を includehttps://blog.goo.ne.jp/r-de-r/e/bd71a52a09801335d56f7c47d879bfe3

include("plotter.jl")

function en2(nx=6, ny=5; r=1, lwd=2, width=600, height=400)
    plotbegin(w=width, h=height)
    nx += 3
    ny += 2
    x1, y1, x2, y2 = 1.5r*√3, r, (nx + 0.5)r * √3, (1.5ny + 0.5)r
    println("(width, height) = ($(x2 - x1), $(y2 - y1))")
    plotlimit(x1, y1, x2, y2)
    plotbox(x1, y1, x2, y2, col=:gray, fcol=:gray)
    for y = 1:ny
        for x = 1:nx
            plotcircle((x + (y % 2)/2)r*√3, y * 1.5r, r, lwd=lwd, col=:cornsilk)
        end
    end
    plotend()
end

en2(5, 4, width=520, height=425)
savefig("en2.png")

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村