漢字プリント 数学プリント
問題文
座標平面上の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()
解説になっているのか?甚だギモンな動画
「高校数学のエアポケット」に戻る