問題文

図のような、1辺の長さが $1\mathrm{cm}$ の正六角形 $\mathrm{ABCDEF}$ の周上に、次のような点 $\mathrm{P}$ と点 $\mathrm{Q}$ があります。

・点 $\mathrm{P}$ は辺 $\mathrm{AF}$ 上にあり、 $\mathrm{AP}:\mathrm{PF}=1:2$ です。

・点 $\mathrm{Q}$ は頂点 $\mathrm{A}$ を出発し、正六角形の周上を反時計回りに分速 $1\mathrm{cm}$ で動きます。点 $\mathrm{Q}$ は、頂点 $\mathrm{B,C,D,E}$ をこの順で通り、頂点 $\mathrm{A}$ を出発した5分後に頂点 $\mathrm{F}$ で止まります。

点 $\mathrm{Q}$ が頂点 $\mathrm{A}$ や頂点 $\mathrm{F}$ にいるときを除いて、正六角形は直線 $\mathrm{PQ}$ によって2つの部分に分けられます。この2つの部分のうち、一方の面積が他方の面積の2倍になるのは、点 $\mathrm{Q}$ が頂点 $\mathrm{A}$ を出発してから何分何秒後ですか。2つ答えなさい。

図
(2023 開成中 2番)
$2$ 分 $10$ 秒後と $3$ 分 $12$ 秒後
※ この答えは学校側が公表したものではありません。個人が作成した非公式の答えです。
コード
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani
import matplotlib.patches as patches

#定数の準備
s60 = np.sqrt(3)/2
ew = 2.0
ec = "0.5"
c1 = "darkorange"
c2 = "mediumblue"

#フォント辞書たち
commentdic = {
"size" : 14,
"ha" : "center",
"va" : "center",
"linespacing" : 2,
"fontfamily" : "Meiryo",
}
ratiodic = {
"size" : 15,
"color" : ec,
"alpha" : 0.0,
"ha" : "center",
"va" : "center",
"fontfamily" : "Meiryo",
}
lengthdic = {
"size" : 13,
"alpha" : 0.0,
"ha" : "center",
"va" : "center",
}

#紙の準備
left   = -1.6
right  =  1.6
bottom = -1.2
top    =  1.2
fig = plt.figure()
fig.suptitle("2023開成中算数 2番",
             color="0.5",ha="right",x=0.96,y=0.96)
ax1 = fig.add_subplot(121)
ax2 = fig.add_subplot(122)
for ax in [ax1,ax2]:
    ax.set_xlim(left,right)
    ax.set_ylim(bottom,top)
    ax.set_aspect("equal")
    ax.axis("off")

#正六角形の描画
verts = [np.array([np.cos(k*np.pi/3),np.sin(k*np.pi/3)]) for k in range(2,9)]
hexagon = patches.Polygon(verts[:6],fill=False,ec="0.8")
partL = patches.Polygon([(0,0)],fc=c1,alpha=0.2)
partR = patches.Polygon([(0,0)],fc=c2,alpha=0.2)
for obj in [hexagon,partL,partR]:
    ax1.add_patch(obj)

#点の準備
p  = np.array([-1/6,np.sqrt(3)/2])
q1 = 5/6*verts[2]+1/6*verts[3]
q2 = 4/5*verts[3]+1/5*verts[4]
lu = np.array([-3/2, s60])
ld = np.array([-3/2,-s60])
ru = np.array([ 3/2, s60])
rd = np.array([ 3/2,-s60])
Q, = ax1.plot([],color="royalblue",marker="o",zorder=20)
points = []
for ax in [ax1,ax2]:
    points += ax.plot(p[0],p[1],q1[0],q1[1],q2[0],q2[1],
                      color=ec,marker="o",zorder=10,alpha=0.0)
points[0].set_alpha(1.0)

#補足説明の言葉たち
text1u = ax1.text((left+right)/2,top+0.3,"",fontdict=commentdic)
text1d = ax1.text((left+right)/2,bottom-0.3,"",fontdict=commentdic)
text2d = ax2.text(0.20,bottom-0.6,"$:\\qquad\\quad\\;=\\quad:$",fontdict=lengthdic)
comment = ax2.text((left+right)/2,(bottom+top)/2,
                   "正六角形が $1:2$\nに分割される瞬間\nをもとめましょう",
                   fontdict=commentdic)

#杏仁豆腐
rulers = [points[3]]
for i in range(-2,3):
    rulers += ax2.plot([left,right],[s60*i,s60*i],
                       [left,right],[ np.sqrt(3)*(left-i), np.sqrt(3)*(right-i)],
                       [left,right],[-np.sqrt(3)*(left-i),-np.sqrt(3)*(right-i)],
                       color="0.8",lw=0.8,zorder=-10,alpha=0.0)

#面積比を準備する関数
def set_area(verts,ratio):
    outline = patches.Polygon(verts,fc="0.95",lw=ew,ec=ec,alpha=0.0)
    ax2.add_patch(outline)
    g = np.average(verts,axis=0)
    str_ratio = chr(10101+ratio)
    txt_ratio = ax2.text(g[0],g[1],str_ratio,fontdict=ratiodic)
    area = [outline,txt_ratio]
    return area

#面積比たち
areas1 = []
for i in range(6):
    area = set_area([(0,0),verts[i],verts[i+1]],1)
    areas1 += area

areas2  = set_area(verts[0:6],6)
areas2 += set_area(np.vstack([lu,verts[0:2]]),1)
areas2 += set_area(np.vstack([rd,verts[3:5]]),1)

areas3  = set_area(np.vstack([p,verts[0:3],q1]),2)
areas3 += set_area(np.vstack([q1,verts[3:6],p]),4)
areas3 += set_area(np.vstack([lu,verts[0:2]]),1)
areas3 += set_area(np.vstack([rd,verts[3:5]]),1)

areas4  = set_area(np.vstack([p,lu,verts[2],q1]),3)
areas4 += set_area(np.vstack([q1,rd,verts[5],p]),5)
areas4 += [points[1],points[4]]

areas5  = set_area(np.vstack([p,verts[0:4],q2]),4)
areas5 += set_area(np.vstack([q2,verts[4:6],p]),2)
areas5 += set_area(np.vstack([ld,verts[1:3]]),1)
areas5 += set_area(np.vstack([ru,verts[4:6]]),1)

areas6  = set_area(np.vstack([p,q2,ru]),3)
areas6 += set_area(np.vstack([ld,verts[1:3]]),1)
areas6 += [points[2],points[5]]

seq_areas = [areas1,areas2,areas3,areas4,areas5,areas6]

#長さたち
group1a = ax2.plot([-3/2,-1/6],[ s60, s60],c1,
                   [-1/2,-1/3],[-s60,-s60],c1,
                   [-1/6, 1/2],[ s60, s60],c2,
                   [-1/3, 3/2],[-s60,-s60],c2,
                   lw=ew,alpha=0.0)
group1a += [
ax2.text( -5/6, s60+0.3,"$\\frac{4}{3}$",color=c1,fontdict=lengthdic),
ax2.text(  1/6, s60+0.3,"$\\frac{2}{3}$",color=c2,fontdict=lengthdic),
]
group1b = [
ax2.text(-5/12,-s60-0.3,"$\\frac{1}{6}$",color=c1,fontdict=lengthdic),
ax2.text( 7/12,-s60-0.3,"$\\frac{11}{6}$",color=c2,fontdict=lengthdic),
ax2.text(-1.00,bottom-0.6,"$\\frac{4}{3}+\\frac{1}{6}$",color=c1,fontdict=lengthdic),
ax2.text(-0.05,bottom-0.6,"$\\frac{2}{3}+\\frac{11}{6}$",color=c2,fontdict=lengthdic),
ax2.text( 0.80,bottom-0.6,"$3$",color=c1,fontdict=lengthdic),
ax2.text( 1.25,bottom-0.6,"$5$",color=c2,fontdict=lengthdic),
text2d,
]
group2a = ax2.plot([-3/2,-1/2],[-s60,-s60],c1,
                   [-3/2,  -1],[-s60,   0],c1,
                   [ 3/2,-1/6],[ s60, s60],c2,
                   [3/2,3/5],[s60,-4/5*s60],c2,
                   lw=ew,alpha=0.0)
group2a += [
ax2.text(-1,-s60-0.3,"$1$",color=c1,fontdict=lengthdic),
ax2.text(-5/4-0.2,-s60/2+0.2,"$1$",color=c1,fontdict=lengthdic),
]
group2b = [
ax2.text(2/3,s60+0.3,"$\\frac{5}{3}$",color=c2,fontdict=lengthdic),
ax2.text(21/20+0.2,s60/10-0.2,"$\\frac{9}{5}$",color=c2,fontdict=lengthdic),
ax2.text(-1.00,bottom-0.6,"$1\\times1$",color=c1,fontdict=lengthdic),
ax2.text(-0.05,bottom-0.6,"$\\frac{5}{3}\\times\\frac{9}{5}$",color=c2,fontdict=lengthdic),
ax2.text( 0.80,bottom-0.6,"$1$",color=c1,fontdict=lengthdic),
ax2.text( 1.25,bottom-0.6,"$3$",color=c2,fontdict=lengthdic),
text2d,
]

#点Qを動かす関数
def moving_Q(i):
    hen = i//600
    k = (i-600*hen)/599
    q = (1-k)*verts[hen]+k*verts[hen+1]
    Q.set_data(q[0],q[1])
    partL.set_xy(np.vstack([p,verts[0:hen+1],q]))
    partR.set_xy(np.vstack([q,verts[hen+1:6],p]))
    
#お気に入りのイージング関数
def easing(x):
    if x<0.0:
        return 0
    elif x<0.5:
        return 2**(20*x-10)/2
    elif x<1.0:
        return (2-2**(-20*x+10))/2
    else:
        return 1

#いろんなものを見せたり消したりする関数
def set_objs_alpha(k,objs,disappear=False):
    if disappear == False:
        alpha = easing(k/99)
    else:
        alpha = 1-easing(k/99)
    for obj in objs:
        obj.set_alpha(alpha)

#セクションを判定する関数
def section(i):
    n = np.argmin(~(i<endings))
    keys = list(periods.keys())
    key = keys[n]
    if n == 0:
        k = i
    else:
        k = i-endings[n-1]
    return key,k

#台本の構成
periods = {"N0":100,"O1":100,
           "S1":100,"N1":100,"T2":100,"N2":100,
           "T3":100,"N3":100,"T4":100,"N4":100,
           "I1":100,"I2":100,"I3":100,
           "T5":100,"N5": 50,"T6":100,"N6": 50,
           "I4":100,"I5":100,"I6": 20,"I7":100,
           "D7":100,"E1": 98,}
endings = np.cumsum(list(periods.values()))

#上演
def update(i):
       
    key,k = section(i)
    n = int(key[-1])-1
    
    if "E1" == key:
        moving_Q(2019+10*k)
        t = 203+k
    else:
        moving_Q(i)
        t = i//10
        
    second = str(t%60).rjust(2,"0")
    minute = str(t//60)
    text1u.set_text(minute+" 分 "+second+" 秒")
    
    if "T" in key:
        set_objs_alpha(k,seq_areas[n-1],disappear=True)
        set_objs_alpha(k,seq_areas[n])
        
    if "O1" == key:
        set_objs_alpha(k,[comment],disappear=True)
        set_objs_alpha(k,rulers)
    if "S1" == key:
        set_objs_alpha(k,seq_areas[n])
    elif "I1" == key:
        set_objs_alpha(k,group1a)
    elif "I2" == key:
        set_objs_alpha(k,group1b)
    elif "I3" == key:
        text1d.set_text("残り "+str(130-t)+" 秒")
    elif "T5" == key:
        set_objs_alpha(k,group1a,disappear=True)
        set_objs_alpha(k,group1b,disappear=True)
    elif "I4" == key:
        set_objs_alpha(k,group2a)
    elif "I5" == key:
        set_objs_alpha(k,group2b)
    elif "I7" == key:
        text1d.set_text("残り "+str(192-t)+" 秒")
    elif "D7" == key:
        set_objs_alpha(k,seq_areas[n-1],disappear=True)
        set_objs_alpha(k,group2a,disappear=True)
        set_objs_alpha(k,group2b,disappear=True)
        set_objs_alpha(k,rulers,disappear=True)
        set_objs_alpha(k,[comment])
    
    if i==1300:
        text1d.set_text("")
        fig.set_facecolor("gold")
    elif i==1310:
        fig.set_facecolor("w")
    elif i==1920:
        text1d.set_text("")
        fig.set_facecolor("gold")
    elif i==1930:
        fig.set_facecolor("w")
        comment.set_text("もう過ぎ去ったので\nあとは早送りします")
    
mov = ani.FuncAnimation(fig,update,endings[-1],interval=100)
plt.show()
解説になっているのか?甚だギモンな動画
「高校数学のエアポケット」に戻る