算額(その1346)
岐阜県垂井町 西法寺 令和6年(2024)
http://www.wasan.jp/gifu/saihoji.html
キーワード:三角形,内接円,外接円,中心間の距離,オイラーの定理
#Julia, #SymPy, #算額, #和算
三角形に内接する甲円と,外接する乙円がある。甲円と乙円の半径が 4 寸,9 寸のとき,甲円と乙円の中心感の距離はいかほどか。
オイラーの定理
内接円の半径を r,外接円の半径を R とおくとき,外心 O と内心 I との距離 d は以下の式で表される。
d^2 = R^2 - 2R*r = R*(R - 2r)
甲円と乙円の半径が 4 寸,9 寸のとき,甲円と乙円の中心感の距離は 3 寸である。
r = 4
R = 9
d = sqrt(R^2 - 2R*r)
3.0
include("julia-source.txt");
外心を計算する関数
function circumcenter(x1, y1, x2, y2, x3, y3)
D = 2 * (x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2))
x_o = ((x1^2 + y1^2) * (y2 - y3) + (x2^2 + y2^2) * (y3 - y1) + (x3^2 + y3^2) * (y1 - y2)) / D
y_o = ((x1^2 + y1^2) * (x3 - x2) + (x2^2 + y2^2) * (x1 - x3) + (x3^2 + y3^2) * (x2 - x1)) / D
r = sqrt((x1 - x_o)^2 + (y1 - y_o)^2)
return r, x_o, y_o
end
内心を計算する関数
function incenter(x1, y1, x2, y2, x3, y3)
a = sqrt((x2 - x3)^2 + (y2 - y3)^2)
b = sqrt((x1 - x3)^2 + (y1 - y3)^2)
c = sqrt((x1 - x2)^2 + (y1 - y2)^2)
x_i = (a * x1 + b * x2 + c * x3) / (a + b + c)
y_i = (a * y1 + b * y2 + c * y3) / (a + b + c)
r = sqrt(distance(x1, y1, x2, y2, x_i, y_i))
return r, x_i, y_i
end;
たとえば,(0, 2), (9, 2), (3, 7) を頂点とする三角形のときは,以下のようになる。
(x1, y1, x2, y2, x3, y3) = (0, 2, 9, 2, 3, 7)
(r_o, x_o, y_o) = circumcenter(x1, y1, x2, y2, x3, y3)
(r_i, x_i, y_i) = incenter(x1, y1, x2, y2, x3, y3)
d1 = sqrt((x_o - x_i)^2 + (y_o - y_i)^2)
d2 = sqrt(r_o^2 - 2r_o*r_i)
@printf("地道に計算 = %.15g, オイラーの定理から計算 = %.15g\n", d1, d2)
地道に計算 = 1.62392449534917, オイラーの定理から = 1.62392449534916
function draw(x1, y1, x2, y2, x3, y3, more)
pyplot(size=(500, 500), grid=false, aspectratio=1, label="", fontfamily="IPAMincho")
#@printf("x1 = %g; y1 = %g; , x2 = %g; , y2 = %g; , x3 = %g; , y3 = %g\n", x1, y1, x2, y2, x3, y3)
(r_o, x_o, y_o) = circumcenter(x1, y1, x2, y2, x3, y3)
(r_i, x_i, y_i) = incenter(x1, y1, x2, y2, x3, y3)
d1 = sqrt((x_o - x_i)^2 + (y_o - y_i)^2)
d2 = sqrt(r_o^2 - 2r_o*r_i)
#@printf("地道に計算 = %.15g, オイラーの定理から = %.15g\n", d1, d2)
#@printf("甲円と乙円の中心間の距離は %g である。\n", d1)
plot(background_color=:moccasin, showaxis=false)
circlef(x_o, y_o, r_o, :tomato)
plot!([x1, x2, x3, x1], [y1, y2, y3, y1], seriestype=:shape, fillcolor=:white, lw=0.5)
circlef(x_i, y_i, r_i, :gold)
#@printf("外円の直径 = %g, 内円の直径 = %g\n", 2r_o, 2r_i)
if more
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_o, y_o, "乙円:r_o,(x_o,y_o)", :black, :center, delta=-delta/2)
point(x_i, y_i, "甲円:r_i,(x_i,y_i)", :black, :center, :bottom, delta=delta/2)
end
end;
draw(0, 2, 9, 2, 3, 7, true)