算額(その176)
岐阜県大垣市外野釜笛 釜笛八幡神社 慶応元年(1865)
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF
第5問: 囲円を 6 個の等円で囲む。楕円の短径の端は囲円に接する。楕円の長径と短径を知って囲円の径を求めよ。
囲円の半径を r,楕円の長径,短径を a, b と置く。
⊿OAB は正三角形である。
楕円の接線 https://blog.goo.ne.jp/r-de-r/e/b19211e3045786a3a9108d7dc4f41b6d を参照。
図で,r + b = sqrt(3a^2 + b^2) である。つまり,r = sqrt(3a^2 + b^2) - b である。
using Plots
function circle(ox, oy, r, color=:red; beginangle=0, endangle=360, fill=false)
θ = beginangle:0.1:endangle
x = r.*cosd.(θ)
y = r.*sind.(θ)
if fill
plot!(ox .+ x, oy .+ y, linecolor=color, linewidth=0.5, seriestype=:shape, fillcolor=color)
else
plot!(ox .+ x, oy .+ y, color=color, linewidth=0.25)
end
end;
function point(x, y, string="", color=:green, position=:left, vertical=:top; mark=true)
mark && scatter!([x], [y], color=color, markerstrokewidth=0)
annotate!(x, y, text(string, 10, position, color, vertical))
end;
function segment(x1, y1, x2, y2, color=:black; linestyle=:solid, linewidth=0.5)
plot!([x1, x2], [y1, y2], color=color, linestyle=linestyle, linewidth=linewidth)
end;
function ellipse(ox, oy, ra, rb; φ=0, beginangle=0, endangle=360,
color=:black, lty=:solid, lwd=0.5, fcolor="")
"""
(ox, oy) を中心,ra, rb を半径とする楕円(楕円弧)。
fcolor を指定すると塗りつぶし。
"""
θ = beginangle:0.1:endangle
if φ == 0
if fcolor == ""
plot!(ra .* cosd.(θ) .+ ox, rb .* sind.(θ) .+ oy,
linecolor=color, linestyle=lty, linewidth=lwd)
else
plot!(ra .* cosd.(θ) .+ ox, rb .* sind.(θ) .+ oy,
linecolor=color, linestyle=lty, linewidth=lwd,
seriestype=:shape, fillcolor=fcolor)
end
else
x = ra .* cosd.(θ)
y = rb .* sind.(θ)
cosine = cosd(φ)
sine = sind(φ)
if fcolor == ""
plot!(cosine .* x .- sine .* y .+ ox,
sine .* x .+ cosine .* y .+ oy,
linecolor=color, linestyle=lty, linewidth=lwd)
else
plot!(cosine .* x .- sine .* y .+ ox,
sine .* x .+ cosine .* y .+ oy,
linecolor=color, linestyle=lty, linewidth=lwd,
seriestype=:shape, fillcolor=fcolor)
end
end
end;
function draw(a, b, more)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
r = sqrt(3a^2 + b^2) - b
plot()
circle(0, 0, r, :aquamarine3, fill=true)
for i = 120:60:420
ellipse((r + b)cosd(i - 90), (r + b)sind(i - 90), a, b, φ = i)
end
if more == true
point(0, r, " r")
point(0, r + b, " r+b")
point(0, 0, " O")
segment(-7, r + b, 7, r + b)
segment(0, 0, 12cosd(60), 12sind(60))
segment(0, 0, -12cosd(60), 12sind(60))
point((r + b)/sqrt(3), (r + b), " A")
point(-(r + b)/sqrt(3), (r + b), "B ", :green, :right)
point((r + b)cosd(30), (r + b)sind(30), "(x0,y0)")
hline!([0], color=:black, lw=0.5)
vline!([0], color=:black, lw=0.5)
else
plot!(showaxis=false)
end
end;