裏 RjpWiki

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

Julia に翻訳--218 バットマン,方程式による描画

2021年05月05日 | ブログラミング

#==========
Julia の修行をするときに,いろいろなプログラムを書き換えるのは有効な方法だ。
以下のプログラムを Julia に翻訳してみる。

バットマン方程式- バットサインの数式による描画 
http://www.r-bloggers.com/the-batman-equation/

ファイル名: batman.jl  関数名: batman

翻訳するときに書いたメモ

最初にプロット領域を宣言しなくてよいのは楽

==========#

using Plots

x11 = 3:0.001:7
x12 = 7:-0.001:4
y1 = vcat(3*sqrt.(1 .- (x11 ./ 7) .^ 2), -3sqrt.(1 .- (x12 ./ 7) .^2));
x2 = 4:-0.001:0
y2 = x2 ./ 2 .- (3*sqrt(33)-7) .* x2 .^ 2 ./112 .- 3 .+ sqrt.(1 .- (abs.(x2 .- 2) .- 1) .^ 2);
x345 = [1, 0.75, 0.5, -0.5, -0.75, -1, 1];
y345 = [1, 3, 2.25, 2.25, 3, 1, 1];
x6 = 1:0.001:3;
y6 = 1.5 .- 0.5 .* x6 .+ 6sqrt(10) .* (1/7 .- sqrt.(4 .- (x6 .- 1) .^2) ./14);
plt = plot(x345, y345, seriestype=:shape, grid=false, tick_direction=:out, ticks=false, showaxis=false,
               color=:black, size=(500, 215), aspect_ratio=1, label="")
plot!(vcat(0, x6, x11, x12, x2, 0), vcat(1, y6, y1, y2, 1), seriestype=:shape, color=:black, label="")
plot!(-vcat(0, x6, x11, x12, x2, 0), vcat(1, y6, y1, y2, 1), seriestype=:shape, color=:black, label="")
display(plt)
savefig("batman.png")

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

1/3 ずつに分割せよ...変わったケーキカット

2021年05月05日 | ブログラミング

円を二本の平行な直線で分割して,3分割された面積が等しくなるようにする方法を求める。

単位円で,第1象限のみを考える。YP が 片方の直線で,直径から Y だけ離れた点を通る平行線で切るということだ。OP より下の扇形の面積を S3,OP より上の扇形の面積を S1+S2 とする。S1 = 2(S2 + S3) であれば,題意を満たす。
S1 + S2 = (π - θ) / 4
S2 = sin(θ) * cos(θ) / 2
S3 = θ / 2
Y = sin(θ)

using Plots

function drawcake()
    θ = range(0, π/2, length= 2000)
    x, y = cos.(θ), sin.(θ)
    plt = plot(x, y, grid=false, tick_direction=:out, ticks=false, showaxis=false,
               color=:black, size=(400, 400), aspect_ratio=1, label="")
    plot!([0, 0, 1], [1, 0, 0], color=:black, label="")
    θ0 = 0.5
    x, y = cos(θ0), sin(θ0)
    plot!([0, x], [y, y], color=:black, label="")
    plot!([0, x], [0, y], color=:black, linestyle=:dash, label="")
    plot!([x, x], [0, y], color=:black, linestyle=:dash, label="")
    annotate!.([0, x, 0, 1, 0], [0, 0, y, 0, 1],
               text.(["O", "X", "Y ", "1", "1 "], 8, :right, :top))
    annotate!.([x, 0.4, 0.2, 0.6], [y, 0.7, 0.25, 0.2], text.([" P", "S1", "S2", "S3"], 8, :left))
    display(plt)
end

drawcake(); savefig("fig.png")

S1, S2, S3 の関係から,f(θ) = sin(θ) * cos(θ) + θ - π / 6 = 0 を満たす θ を求めればよい。
二分法により θ を求める。 

using Roots
func(θ) = sin(θ)*cos(θ) + θ - π/6
θ0 = find_zero(func, (0, π/2))
println("θ0 = $θ0,  func(θ0) = $(func(θ0))") # θ0 = 0.26813348949444527,  func(θ0) = 0.0
Y の y 座標値は sin(θ0)
println("sin(θ0) = $(sin(θ0))") # sin(θ0) = 0.26493208460277684

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

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

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