算額(その1124)
三十一 岩手県一関市舞川 観福寺内地蔵堂前額 明治34年(1901)
山村善夫:現存 岩手の算額,昭和52年1月30日,熊谷印刷,盛岡市.
http://www.wasan.jp/yamamura/yamamura.html
キーワード:等球6個,円錐,3次元
円錐の側面に 6 個の等球が接している。等球はの中心は全て円錐の底面に平行な水平面にあり,中は互いに接し合っている。円錐の底面の(円の)直径と高さが与えられているとき等球の直径はいかほどか。
なお,「問」には書かれていないが(術には書かれている),等球の中心がある水平面と円錐の底面との距離も「答」に必要である。
左上は,真横から見た図。6 個の球の中心は同じ平面上にある。
右上は,やや上から見た図
左下は,円錐の頂点 H と底面の円の縁が重なるように見える位置からの図。このとき,上にある球が底面の円に接しているように見えているが,それはその球が円錐の側面に接していることを意味する。
右下は,真上から見た図。6個の球は互いに外接。している。
円錐の底面の円の半径を r,円錐の高さを h,水平面と底面の距離を z
等球の半径 を r,円錐の軸から等球の中心までの距離を x
とおき,以下の連立方程式を解く。
条件1. 円錐の側面から等球の中心までの距離は等球の直径に等しい
条件2. 円錐の軸から等球の中心までの距離の sin(π/6) = 1/2 倍が等球の半径である
include("julia-source.txt")
using SymPy
@syms a::positive, h::positive, z::positive,
x::positive, r::positive
eq1 = dist2(0, h, a, 0, x, z, r) # 円錐の側面から等球の中心までの距離は等球の直径に等しい
eq2 = x/2 - r; # 2 つの等球の半径感の距離の関係
res = solve([eq1, eq2], (r, x))[2]
(2*a*h*(-h + z)/(a^2 - 3*h^2) + a*sqrt(a^2 + h^2)*(-h + z)/(a^2 - 3*h^2), 4*a*h*(-h + z)/(a^2 - 3*h^2) + 2*a*sqrt(a^2 + h^2)*(-h + z)/(a^2 - 3*h^2))
等球の半径
res[1] |> simplify |> println
a*(-2*h - sqrt(a^2 + h^2))*(h - z)/(a^2 - 3*h^2)
円錐の軸から等球の中心までの距離
全ての等球は,この距離を半径とする円の上にある。
res[2] |> simplify |> println
2*a*(-2*h - sqrt(a^2 + h^2))*(h - z)/(a^2 - 3*h^2)
底面の円の半径が 10,高さが 18 の円錐で,等球の中心までの距離が 9 の場合の,パラメータの実際の数値
式を見ればわかるが,x = 2r である(6 個の等球なので,eq2 より)。
(a, h, z) = (10, 18, 9)
#= r =# a*(-2*h - sqrt(a^2 + h^2))*(h - z)/(a^2 - 3*h^2) |> println
#= x =# 2*a*(-2*h - sqrt(a^2 + h^2))*(h - z)/(a^2 - 3*h^2) |> println
5.840841084148692
11.681682168297383
底面の直径が 20,高さが 18,水平面の高さが 9 のとき,等球の直径は 11.6817 である。
「術」,および山村の解説は,わたしには理解できない。
function plot1(r, x)
p1 = plot()
circle(0, 0, x)
circle(0, 0, r, :gray80)
rotate(x, 0, r, :blue, angle=60)
delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3 # size[2] * fontsize * 2
hline!([0], color=:gray80, lw=0.5)
vline!([0], color=:gray80, lw=0.5)
point(x, 0, " x", :red, :left, :bottom, delta=delta/2)
point(x + r, 0, " x+r", :red, :left, :bottom, delta=delta/2)
xlims!(-x - r - 5delta, x + r + 15delta)
title!("真上から見た図", titlefontsize=10)
return p1
end;
function plot2(r, x, z)
p2 = plot([a, 0, -a, a], [0, h, 0, 0], color=:green, lw=0.5)
circle2(x, z, r, :blue)
delta = (fontheight = (ylims()[2]- ylims()[1]) / 500 * 10 * 2) /3 # size[2] * fontsize * 2
hline!([0], color=:gray80, lw=0.5)
vline!([0], color=:gray80, lw=0.5)
xlims!(-x - r -10delta, x + r + 5delta)
point(x, z, "r,(x, z)", :blue, :center, delta=-delta/2)
point(a, 0, " a", :green, :left, :bottom, delta=delta/2)
point(0, h, "h", :green, :center, :bottom, delta=3delta)
title!("真横から見た図\n\n", titlefontsize=10)
return p2
end;
function draw(a, h, z, more=false)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
r = a*(-2*h - sqrt(a^2 + h^2))*(h - z)/(a^2 - 3*h^2)
x = 2*a*(-2*h - sqrt(a^2 + h^2))*(h - z)/(a^2 - 3*h^2)
@printf("底面の直径が %g,高さが %g,水平面の高さが %g のとき,等球の直径は %g である。\n", 2a, h, z, 2r)
p1 = plot1(r, x)
p2 = plot2(r, x, z)
plot(p1, p2)
end;