裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

算額(その1346)

2024年10月10日 | Julia

算額(その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)

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村