算額(その223)
中村信弥「改訂増補 長野県の算額」
http://www.wasan.jp/zoho/zoho.html
県内の算額3(200)
長野県北佐久郡軽井沢町峠 熊野神社 安政4年(1857)
短辺が 240 寸,長辺がその倍の 480 寸の長方形内に円弧を 4 個描き,区切られた領域に大円 4 個,小円 2 個を描く。大円は円弧と長方形の辺に内接し,小円は互いに外接すると同時に円弧にも外接している。このとき,大円と小円の径はいかほどか。
算額の図では「円弧」は楕円の 1/4 のように見えるが,短辺の中点で接する円弧である(長辺の中点で交わる)。
長方形の短辺と長辺の長さの 1/2 を y,2y とおく。
円弧がその一部である外円の中心座標と半径が (2y, r0), r0,
大円の中心座標と半径が (2y - r1, y - r1), r1
小円の中心座標と半径が (r2, 0), r2
とする。
以下の連立方程式を解く。
using SymPy
@syms r0::positive, r1::positive, r2::positive, x::positive, y::positive;
y = 240 // 2
x = 2y
eq1 = x^2 + (r0 - y)^2 - r0^2 # (0, y) が 外円の円周上にあることより
eq2 = r1^2 + (r0 - y + r1)^2 - (r0 - r1)^2 # 大円が外円に内接することより
eq3 = (x - r2)^2 + r0^2 - (r0 +r2)^2; # 小円が外円に外接することより
res = solve([eq1, eq2, eq3], (r0, r1, r2))
1-element Vector{Tuple{Sym, Sym, Sym}}:
(300, -480 + 240*sqrt(5), 160/3)
r0 = 300.000, x = 240.000; y = 120.000; r1 = 56.656; r2 = 53.333
大円の径 = 2r1 = 113.313; 小円の径 = 2r2 = 106.667
大円の径は 2\*240\*(sqrt(5)-2) = 113.3126291998991 である。術では sqrt(5)≒2.236 で近似して,113.2800000000001 を 113寸2分8厘としている。
小円の径は 2\*160/3 = 106 + 2/3 である。術では正しく (106と2/3)寸となっている。
y を未知数として解くと,r0 = y*(5/2), r1 = y*(2sqrt(5) - 4), r2 = y*(4/9) である。
using Plots
using Printf
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.5)
end
end;
function circle4(x, y, r, color=:red)
circle(x, y, r, color)
circle(x, -y, r, color)
circle(-x, y, r, color)
circle(-x, -y, r, color)
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 draw(more)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
(r0, r1, r2) = res[1]
y = 240 / 2
x = 2y
@printf("r0 = %.3f, x = %.3f; y = %.3f; r1 = %.3f; r2 = %.3f\n", r0, x, y, r1, r2)
@printf("大円の径 = 2r1 = %.3f; 小円の径 = 2r2 = %.3f\n", 2r1, 2r2)
plot([x, x, -x, -x, x], [-y, y, y, -y, -y], color=:orange, lw=0.5)
circle4(x, r0, r0, :green)
circle4(x - r1, y - r1, r1, :blue)
circle(r2, 0, r2)
circle(-r2, 0, r2)
if more == true
point(x, r0, "(2y,r0)", :green, :left, :bottom)
point(x - r1, y - r1, "(2y-r1,y-r1)", :blue, :left, :bottom)
point(x, 0, " 2y", :black, :left, :bottom)
point(0, x/2, " y", :black, :left, :bottom)
point(r2, 0, "r2", :red, :left, :bottom)
hline!([0], color=:black, lw=0.5)
vline!([0], color=:black, lw=0.5)
else
plot!(showaxis=false, xlims=(-250, 250), ylims=(-130, 130))
end
end;