裏 RjpWiki

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

算額(その6)

2022年11月01日 | Julia

算額(その6)

香川県高松市 石清尾八幡宮 文化三年
http://www.wasan.jp/kagawa/iwaseo.html

千葉県富津市 吾妻神社 明治十年
http://www.wasan.jp/chiba/azuma.html

  • 外側の円の半径を 1 とする。
  • 内部の三角形は正三角形である。
  • 円 A の半径を 0.17 とする。
  • それぞれの円と正三角形は互いに接している。
  • 円 B の中心 (x1, y1),半径 r1 を求める。

using SymPy
@syms x, y, r::positive, r1::positive, r2::positive, x1::positive, y1::positive, x2::positive, y2::positive;

eq1 = (1 - r2 - y1)^2 + x1^2 - (r1 + r2)^2;  # 円 A,円 B が接する
eq2 = y2 - y1 - (x2 - x1)/√Sym(3);  # 円 B の中心と接点 C の直線の方程式
eq3 = y2 - (1 - 2r2) + x2√Sym(3);   # 接点 C を通る正三角形の辺の方程式
res = solve([eq2, eq3], (x2, y2));  # 接点 x2, y2 の座標
eq4 = (res[y2] - y1)^2 + (res[x2] - x1)^2 - r1^2;  #  BC が半径 r1
eq5 = sqrt(x1^2 + y1^2) + r1 - 1;  # 外側の円と円 B が接する
a = 0.17;
EQ1 = eq1(r2 => a);  # 方程式は繊細で,r2 = 0.17 でないと解けない?
EQ4 = eq4(r2 => a);
res2 = solve([EQ1, EQ4, eq5], (x1, y1, r1))  # x1, y1, r1 を求める

   1-element Vector{Tuple{Sym, Sym, Sym}}:
    (0.396484958572158, 0.575520654261460, 0.301126373472639)


using Plots

function circle(ox, oy, r; color=:red)
   θ = 0:0.01:2pi
   x = r.*cos.(θ)
   y = r.*sin.(θ)
   plot!(ox .+ x, oy .+ y, color=color)
end;

function triangle(ox, oy, r; color=:blue)
   θ = [90, 210, 330, 90]
   x = r .* cosd.(θ)
   y = r .* sind.(θ)
   plot!(ox .+ x, oy .+ y, color=color)
end;

function point(x, y, string="", position=:left)
   scatter!([x], [y])
   annotate!(x, y, text(string, 10, position))
end;

function draw(more=false)
   pyplot(size=(500, 500), aspectratio=1, label="", fontfamily="IPAMincho")
   r, r2 = (1, 0.17)
   x1, y1, r1 = (0.396484958572158, 0.575520654261460, 0.301126373472639)
   plot()
   circle(0, 0, r)
   triangle(0, 0, r - 2r2)
   circle(0, r - r2, r2, color=:black)
   circle((r - r2)*cosd(330), (r - r2)*sind(330), r2, color=:black)
   circle((r - r2)*cosd(210), (r - r2)*sind(210), r2, color=:black)
   circle(x1, y1, r1)
   circle(-x1, y1, r1)
   circle(x1+2*r1*sind(30), y1-2*r1*cosd(30), r1)
   circle(-(x1+2*r1*sind(30)), y1-2*r1*cosd(30), r1)
   circle(-r1, -r1 - (r - 2r2)*sind(30), r1)
   circle(r1, -r1 - (r - 2r2)*sind(30), r1)
   if more
       point(0, 0, " O")
       point(0, 1 - r2, " A")
       point(x1, y1, "B ", :right)
       point(x1, y1, " (x1, y1)")
       x2 = x1/4 + sqrt(3)*(1/4 - r2/2 - y1/4)
       y2 = (3*y1 + 1 - sqrt(3)*x1)/4 - r2/2
       point(x2, y2, "C ", :right)
       point(x2, y2, " (x2, y2)")
       plot!([x1, x2], [y1, y2])
       annotate!((x1 + x2)/2, (y1 + y2)/1.8, text("r1", 10, :right))
   end
end;

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

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

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