問題文
$xy$ 平面において、2点 $\mathrm{B}(-\sqrt{3},-1),\mathrm{C}(\sqrt{3},-1)$ に対し、点 $\mathrm{A}$ は次の条件(*)を満たすとする。(*) $\angle{\mathrm{BAC}}=\frac{\pi}{3}$ かつ点 $\mathrm{A}$ の $y$ 座標は正。
次の各問に答えよ。
- $\triangle{\mathrm{ABC}}$ の外心の座標を求めよ。
- 点 $\mathrm{A}$ が条件(*)を満たしながら動くとき、 $\triangle{\mathrm{ABC}}$ の垂心の軌跡を求めよ。
(2021 京都大学 理系第5問)
コード
import numpy as np
from numpy import cos,sin,pi,sqrt
import matplotlib.pyplot as plt
import matplotlib.animation as ani
import matplotlib.patches as patches
'''
図の準備
'''
fig = plt.figure()
ax = fig.add_subplot(111)
ax.set_xlim(-3,3)
ax.set_ylim(-3,3)
ax.axhline(0,color='0.6')
ax.axvline(0,color='0.6')
ax.set_aspect("equal")
ax.grid()
ax.set_title("2021京大数学 理系第5問",pad=15)
'''
定数の準備
'''
B = [-sqrt(3),-1]
C = [ sqrt(3),-1]
circum = patches.Circle((0, 0),2,ec='0.7',fill=None,linestyle="dashed")
ax.add_patch(circum)
'''
変数の準備
'''
THETA = np.arange(0,pi,0.02)
'''
動画を作成する
'''
imgs = []
HX = []
HY = []
for theta in THETA:
A = [2*cos(theta),2*sin(theta)]
H = [A[0],A[1]-2]
angB = ( theta + pi/6)/2
angC = (7*pi/6 - theta)/2
lenB = 2*sqrt(3)*sin(angC)
lenC = 2*sqrt(3)*sin(angB)
if theta <= pi/6:
perpBLX = B[0]
perpBLY = B[1]
perpBRX = H[0]
perpBRY = H[1]
perpCLX = C[0]-lenC*cos(angC-pi/6)
perpCLY = C[1]+lenC*sin(angC-pi/6)
perpCRX = H[0]
perpCRY = H[1]
elif theta <= 5*pi/6:
perpBLX = B[0]
perpBLY = B[1]
perpBRX = B[0]+lenB*cos(angB-pi/6)
perpBRY = B[1]+lenB*sin(angB-pi/6)
perpCLX = C[0]-lenC*cos(angC-pi/6)
perpCLY = C[1]+lenC*sin(angC-pi/6)
perpCRX = C[0]
perpCRY = C[1]
else:
perpBLX = H[0]
perpBLY = H[1]
perpBRX = B[0]+lenB*cos(angB-pi/6)
perpBRY = B[1]+lenB*sin(angB-pi/6)
perpCLX = H[0]
perpCLY = H[1]
perpCRX = C[0]
perpCRY = C[1]
perpA = ax.plot([A[0],A[0]],
[A[1],min(-1,H[1])],
color="0.7")
perpB = ax.plot([perpBLX,perpBRX],
[perpBLY,perpBRY],
color="0.7")
perpC = ax.plot([perpCLX,perpCRX],
[perpCLY,perpCRY],
color="0.7")
ABC = ax.plot([A[0],B[0],C[0],A[0]],\
[A[1],B[1],C[1],A[1]],\
color="k")
Hnow = ax.plot(H[0],H[1],marker="o",color="forestgreen",markersize=8)
HX.append(H[0])
HY.append(H[1])
Hpast = ax.plot(HX,HY,color="forestgreen",alpha=0.5,linewidth=4)
img = perpA+perpB+perpC+ABC+Hnow+Hpast
if theta<3.13:
imgs.append(img)
else:
for i in range(50):
imgs.append(img)
mov=ani.ArtistAnimation(fig, imgs, 100)
plt.show()