問題文
座標平面上の3点 $\mathrm{P}(x,y),\mathrm{Q}(-x,-y),\mathrm{R}(1,0)$ が鋭角三角形をなすための $(x,y)$ についての条件を求めよ。また、その条件を満たす点 $\mathrm{P}(x,y)$ の範囲を図示せよ。(2016 東京大学 文系第1問)
$\begin{eqnarray}\left\{\begin{array}{l}\,(x-\frac{1}{2})^2+y^2>\frac{1}{4}\\\,(x+\frac{1}{2})^2+y^2>\frac{1}{4}\\\;\;x^2+y^2<1\end{array}\right.\end{eqnarray}$
※ この答えは学校側が公表したものではありません。個人が作成した非公式の答えです。
コード
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani
import matplotlib.patches as patches
#紙の準備
left = -1.1
right = 1.1
bottom = -1.1
top = 1.1
fig = plt.figure()
fig.suptitle("2016東大数学 文系第1問",
color="0.5",x=0.97,y=0.05,ha="right",va="center",
bbox=dict(fc="w",lw=0))
fig.subplots_adjust(bottom=0.2,top=0.9)
ax = fig.add_subplot(111)
ax.set_xlim(left,right)
ax.set_ylim(bottom,top)
ax.set_aspect("equal")
ax.axis("off")
#点と線と三角形の準備
O, = ax.plot( 0,0,color="0.5",marker="o",zorder=10)
P, = ax.plot( 1,0,color="0.5",marker=".",zorder=10)
Q, = ax.plot(-1,0,color="0.5",marker=".",zorder=10)
R, = ax.plot( 1,0,color="0.5",marker=".",zorder=10)
PQ, = ax.plot([],[],color="0.5",lw=0.5,clip_on=False)
Pt1,= ax.plot([],[],color="deepskyblue",lw=2,solid_capstyle='round')
Qt1,= ax.plot([],[],color="deepskyblue",lw=2,solid_capstyle='round')
Pt2,= ax.plot([],[],color="steelblue",alpha=0.4,lw=2.5,zorder=-10)
Qt2,= ax.plot([],[],color="steelblue",alpha=0.4,lw=2.5,zorder=-10)
OPR = patches.Polygon([(0,0),( 1,0),(1,0)],fc="yellow",alpha=0.2)
OQR = patches.Polygon([(0,0),(-1,0),(1,0)],fc="lightgreen",alpha=0.2)
PQR = patches.Polygon([(1,0),(-1,0),(1,0)],fill=False,ec="0.5",lw=1.5,zorder=10)
d90 = patches.Rectangle((1,0),-0.07,0.07,fill=False,ec="0.5")
for triangle in [OPR,OQR,PQR,d90]:
ax.add_patch(triangle)
#軌跡を描画する関数
def trajectory(obj,xy):
xs = np.append(obj.get_data()[0],xy[0])
ys = np.append(obj.get_data()[1],xy[1])
obj.set_data(xs,ys)
#三角形を動かす関数
def update_PQR(theta,p):
q = -p
P.set_data(p[0],p[1])
Q.set_data(q[0],q[1])
PQ.set_data([-5*np.cos(theta),5*np.cos(theta)],
[-5*np.sin(theta),5*np.sin(theta)])
OPR.set_xy([(0,0),p,(1,0)])
OQR.set_xy([(0,0),q,(1,0)])
PQR.set_xy([p,q,(1,0)])
#直角三角形の場合
def part1(i):
theta = min(2*np.pi*(i/500),2*np.pi)
if theta < np.pi:
p = np.array([np.cos(theta),np.sin(theta)])
if theta>np.pi/30 and theta<(1-1/30)*np.pi:
d90.set_visible(True)
d90.angle = np.rad2deg(theta/2)
else:
d90.set_visible(False)
else:
alpha = 2*(theta-np.pi)
p = -0.5*np.array([1+np.cos(alpha),np.sin(alpha)])
d90.set_xy(-p)
if theta>(1+1/30)*np.pi and theta<(3/2-1/30)*np.pi:
d90.set_visible(True)
d90.angle = np.rad2deg(theta)-90
elif theta>(3/2+1/30)*np.pi and theta<(2-1/30)*np.pi:
d90.set_visible(True)
d90.angle = np.rad2deg(theta)
else:
d90.set_visible(False)
update_PQR(theta,p)
trajectory(Pt1,+p)
trajectory(Qt1,-p)
#鋭角三角形の場合
def part2(i):
if i<1200:
beta = np.pi/2*(i/1200)
r = np.sin(beta)
oscillation = np.cos(120*np.pi*(i/1200)**0.6)
theta = beta*oscillation
p = r*np.array([np.sin(theta),np.cos(theta)])
else:
theta = np.pi/2
p = np.array([1,0])
update_PQR(np.pi/2-theta,p)
trajectory(Pt2,+p)
trajectory(Qt2,-p)
#減らずグチたち
phrasedic={
"ha" : "center",
"va" : "center",
"size" : 20,
"color" : "white",
"zorder" : 100,
"visible" : False,
"linespacing": 2.4,
"fontfamily": "Meiryo",
}
phrases = []
phrases.append("""
~ その1 ~
3点 $(x,y),(-x,-y),(1,0)$ で
直角三角形を作ります
""")
phrases.append("""
~ その2 ~
3点 $(x,y),(-x,-y),(1,0)$ で
鋭角三角形を作ります
""")
phrases.append("""
おしまい
""")
seq_prs = []
for phrase in phrases:
prs = fig.text(0.5,0.5,phrase,fontdict=phrasedic,
bbox=dict(color="black",pad=300))
seq_prs.append(prs)
#台本
def update(i):
if i==0:
seq_prs[0].set_visible(True)
elif i==100:
seq_prs[0].set_visible(False)
elif i==700:
seq_prs[1].set_visible(True)
elif i==800:
seq_prs[1].set_visible(False)
elif i==2100:
seq_prs[2].set_visible(True)
if i<700:
k = max(i-120,0)
part1(k)
elif i<2100:
k = max(i-820,0)
part2(k)
mov = ani.FuncAnimation(fig,update,2200,interval=50)
plt.show()