算額(その158)
岐阜県大垣市西外側町 大垣八幡神社 天保年間
http://ryugen3.sakura.ne.jp/toukou3/wasankibousya.PDF
第10問: 直角三角形内に互いに接する 3 個の円を入れる円の直径を知って直角三角形の直角を挟む長い方の一辺(股)の長さを求めよ。
3 個の円の中心は正三角形を構成する。図において,⊿ADE と ⊿ABC は相似であり BC = 3√3r,BX = 2r, CG = r ゆえ FG = 3(1+√3)r である。したがって,「円の直径を知って」ということであれば,股の長さは円の直径の 3(1+√3)/2 = 4.098076211353316 倍である。術文では √(6.75) + 1.5 倍と書いてあるが。
図を描くためにわざわざ SymPy を使ってみる。
using SymPy
function distance(x1, y1, x2, y2, x0, y0)
p1, p2 = sympy.Point(x1, y1), sympy.Point(x2, y2)
l = sympy.Line(p1, p2)
l.distance(sympy.Point(x0, y0))^2 # 二乗距離を返す!!
end;
@syms r::positive, x::positive, y::positive;
eq1 = distance(x, 0, 0, y, r, 3r) - r^2
eq2 = sqrt(Sym(3))y - x;
res = solve([eq1, eq2], (x, y))
2-element Vector{Tuple{Sym, Sym}}:
(r*(-1 + 3*sqrt(3)), r*(9 - sqrt(3))/3)
(3*r*(1 + sqrt(3)), r*(sqrt(3) + 3))
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 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 draw(R, more)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
r = R/2
(x, y) = (3*r*(1 + sqrt(3)), r*(sqrt(3) + 3))
println("股の長さ = $x, 円の直径 = $R")
plot([0, 0, -x, 0], [0, y, 0, 0], color=:black, lw=0.5)
circle(-r, 3r, r, :blue, fill=true)
circle(-r, r, r, :blue, fill=true)
circle(-(1+√3)r, 2r, r, :blue, fill=true)
if more == true
point(-r, 3r, " A", :white)
point(-(1+√3)r, 2r, "D ", :white, :right, :bottom)
point(-r, r, "", :white)
point(-(1+3√3)r, 0, "B ", :green, :right, :bottom)
point(-r, 2r, " E", :white, :left, :bottom)
point(-3(1+√3)r, 0, "X", :green, :right, :bottom)
point(-r, 0, " C", :white, :left, :bottom)
point(0, 0, " G", :black, :left, :bottom)
point(0, x/√3, " Y", :black, :left)
segment(-r, 3r, -(3√3+1)r, 0)
segment(-r, 3r, -r, 0)
segment(-(1+√3)r, 2r, -r, 2r)
hline!([0], color=:black, lw=0.5)
vline!([0], color=:black, lw=0.5)
else
plot!(showaxis=false)
end
end;
draw(1, false)
股の長さ = 4.098076211353316, 円の直径 = 1