2023年4月号学コン大問1

2通りの図示ができることがトラップ。

△ABCと△A'B'C'の位置関係

図示に使ったPythonスクリプトも掲載しておきます。洗練された書き方にはなっていないだろうけれども、参考になればと思います。ちなみに動作環境は Python 3.9.2 です。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.patches as pat

def calc_gaisetsu_circle_hankei(a,b,c):
    menseki = calc_menseki(a,b,c)
    return a*b*c/(4*menseki)

def calc_menseki(a,b,c):
    s = (a+b+c)/2
    return np.sqrt(s*(s-a)*(s-b)*(s-c))

a = 5; b = 7; c = 6
CCR = calc_gaisetsu_circle_hankei(a,b,c)
print("----- check 1 -------")
print("外接円半径(数値計算) = {}".format(CCR))
print("外接円半径(解析解)   = {}".format(35/(4*np.sqrt(6))))

cosA = (b**2+c**2-a**2)/(2*b*c)
cosB = (c**2+a**2-b**2)/(2*c*a)
cosC = (a**2+b**2-c**2)/(2*a*b)
OF = np.sqrt(CCR**2-25/4)
vb = np.array((-5/2,-OF))
vc = np.array((5/2,-OF))
va = -(b*cosB*vb+c*cosC*vc)/(a*cosA)

k = 35/16 # 相似比
cp = k*c
ap = k*a
bp = k*b
sp = (ap+bp+cp)/2

print("----- check 2 -------")
print("A'B'(数値計算) = {}".format(cp))
print("A'B'(解析解)   = {}".format(105/8))

print(sp-ap)
print(sp-bp)
print(sp-cp)

vbp = np.array((-(sp-bp),-CCR))
vcp = np.array((sp-cp,-CCR))
vap = -(bp*vbp+cp*vcp)/ap

# --- Main Routine (drawing) --- #
fig = plt.figure(figsize=(12,6))
ax = fig.add_subplot(121)
ax.set_xlim(-7.5,7.5)
ax.set_ylim(-5,10)

circCCR = pat.Circle(xy=(0,0),radius=CCR,color="lime",ec="darkred")
p1 = pat.Polygon(xy=[va,vb,vc],fc="lightgrey",ec="darkred")
p2 = pat.Polygon(xy=[vap,vbp,vcp],fc="lightblue",ec="darkblue")
ax.add_patch(p2)
ax.add_patch(circCCR)
ax.add_patch(p1)

# --- 原点O --- #
ax.plot(0,0,marker="o",color="black")
# --- ABC --- #
ax.plot(va[0],va[1],marker="o",color="red")
ax.plot(vb[0],vb[1],marker="o",color="red")
ax.plot(vc[0],vc[1],marker="o",color="red")
# --- A'B'C' --- #
ax.plot(vap[0],vap[1],marker="o",color="blue")
ax.plot(vbp[0],vbp[1],marker="o",color="blue")
ax.plot(vcp[0],vcp[1],marker="o",color="blue")
ax.set_aspect('equal')

# ---- 点対称な図形も条件を満たす ---- #

ax2 = fig.add_subplot(122)
ax2.set_xlim(-7.5,7.5)
ax2.set_ylim(-10,5)

vap = -vap; vbp = -vbp; vcp = -vcp # 点対称
circCCR = pat.Circle(xy=(0,0),radius=CCR,color="lime",ec="darkred")
p1 = pat.Polygon(xy=[va,vb,vc],fc="lightgrey",ec="darkred")
p2 = pat.Polygon(xy=[vap,vbp,vcp],fc="lightblue",ec="darkblue")
ax2.add_patch(p2)
ax2.add_patch(circCCR)
ax2.add_patch(p1)

# --- 原点O --- #
ax2.plot(0,0,marker="o",color="black")
# --- ABC --- #
ax2.plot(va[0],va[1],marker="o",color="red")
ax2.plot(vb[0],vb[1],marker="o",color="red")
ax2.plot(vc[0],vc[1],marker="o",color="red")
# --- A'B'C' --- #
ax2.plot(vap[0],vap[1],marker="o",color="blue")
ax2.plot(vbp[0],vbp[1],marker="o",color="blue")
ax2.plot(vcp[0],vcp[1],marker="o",color="blue")
ax2.set_aspect('equal')

plt.savefig("figure.png",dpi=150)
plt.close