import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani
from matplotlib.colors import ListedColormap
#紙の準備よし
fig = plt.figure()
fig.suptitle("2021京大数学 文系第2問",
color="0.5",ha="right",x=0.95,y=0.95,zorder=-1)
ax = fig.add_subplot(111)
ax.set_xlim(0,10)
ax.set_ylim(0,4)
ax.set_aspect("equal")
ax.axis("off")
#フォントの準備よし
plt.rcParams["mathtext.fontset"] = 'cm'
fdic={
"clip_on" : True,
"fontsize" : 18,
"fontfamily" : "Meiryo",
"verticalalignment" : "baseline",
}
#台本
comment1='''\
はじめに
'''
comment2='''\
絶対値の場合分けをします!
乁( ˙ω˙ 乁) メンドクセ-
'''
lines1=[
r"$\qquad\quad x^2-\frac{1}{2}x-\frac{1}{2} \geq 0$"+"\t(中身が正のとき)",
r"$\Leftrightarrow\quad 2x^2-x-1 \geq 0$",
r"$\Leftrightarrow\quad (2x+1)(x-1) \geq 0$",
r"$\Leftrightarrow\quad x \leq -\frac{1}{2}\ ,\ 1 \leq x$",
r"$\therefore\quad -1 \leq x \leq -\frac{1}{2}$"+" ("+"$-1 \leq x \leq 1$"+"との共通範囲)",
]
lines2=[
r"$\qquad\quad x^2-\frac{1}{2}x-\frac{1}{2} \leq 0$"+"\t(中身が負のとき)",
r"$\Leftrightarrow\quad 2x^2-x-1 \leq 0$",
r"$\Leftrightarrow\quad (2x+1)(x-1) \leq 0$",
r"$\Leftrightarrow\quad -\frac{1}{2} \leq x \leq 1$",
r"$\therefore\quad -\frac{1}{2} \leq x \leq 1$"+" ("+"$-1 \leq x \leq 1$"+"との共通範囲)",
]
comment3='''\
というわけで
'''
comment4='''\
積分スルゾー!!
エイエイ。(・ω ・ )○オ――
'''
lines3=[
r"$\qquad \int_{-1}^1 \left| x^2-\frac{1}{2}x-\frac{1}{2} \right| dx$",
r"$=\int_{-1}^{-\frac{1}{2}} \left| x^2-\frac{1}{2}x-\frac{1}{2} \right| dx + \int_{-\frac{1}{2}}^1 \left| x^2-\frac{1}{2}x-\frac{1}{2} \right| dx$",
r"$=\int_{-1}^{-\frac{1}{2}} \left( x^2-\frac{1}{2}x-\frac{1}{2} \right) dx - \int_{-\frac{1}{2}}^1 \left( x^2-\frac{1}{2}x-\frac{1}{2} \right) dx$",
r"$=\left[ \frac{1}{3}x^3-\frac{1}{4}x^2-\frac{1}{2}x \right]_{-1}^{-\frac{1}{2}} - \left[ \frac{1}{3}x^3-\frac{1}{4}x^2-\frac{1}{2}x \right]_{-\frac{1}{2}}^1$",
r"$=\left( \frac{1}{3}\cdot\frac{7}{8}+\frac{1}{4}\cdot\frac{3}{4}-\frac{1}{2}\cdot\frac{1}{2} \right) - \left( \frac{1}{3}\cdot\frac{9}{8}-\frac{1}{4}\cdot\frac{3}{4}-\frac{1}{2}\cdot\frac{3}{2} \right)$",
r"$=\left( \frac{7}{24}+\frac{3}{16}-\frac{1}{4} \right) - \left( \frac{9}{24}-\frac{3}{16}-\frac{3}{4} \right)$",
r"$=\left( \frac{14}{48}+\frac{9}{48}-\frac{12}{48} \right) - \left( \frac{18}{48}-\frac{9}{48}-\frac{36}{48} \right)$",
r"$=\frac{11}{48}-(-\frac{27}{48})$"+"\tあとチョット!",
r"$=\frac{38}{48}$"+"\tホントにあとチョット!!",
r"$=\frac{19}{24}$"+"\tオシマイ!!! \(^o^)/",
]
#2行目を表示する関数
X,Y = np.mgrid[-2:12.1:0.1,0:3:2]
colors = [(1,1,1,alpha) for alpha in np.arange(0,11)/10]
cmap = ListedColormap(colors)
def show_second_line(imgs,lines,k):
for i in range(61):
img = [ax.text(0,2.8,lines[k],fontdict=fdic)]
img += [ax.text(0,0.8,lines[k+1],fontdict=fdic)]
C = np.zeros(140)
C[2*i+1:2*i+20] = np.arange(0.05,1.00,0.05)
C[2*i+20:] = 1
C = np.reshape(C,(140,1))
img += [ax.pcolormesh(X,Y,C,cmap=cmap,zorder=10)]
imgs.append(img)
#次の行へと進む関数
def go_next_line(imgs,lines,k):
for i in range(21):
alpha = max((10-i)/10,0)
img = [ax.text(0,2.8+i/10,lines[k],fontdict=fdic,alpha=alpha)]
img += [ax.text(0,0.8+i/10,lines[k+1],fontdict=fdic)]
imgs.append(img)
#数式の部分の関数
def load_lines(imgs,lines):
for k in range(len(lines)-2):
show_second_line(imgs,lines,k)
go_next_line(imgs,lines,k)
show_second_line(imgs,lines,len(lines)-2)
#コメントの部分の関数
def interlude(imgs,text,frames):
fdic = {
"ha" : "center",
"va" : "center",
"size" : 20,
"color" : "white",
"fontfamily": "Meiryo",
}
boxdic = {
"facecolor" : "black",
"pad" : 200,
}
for i in range(frames):
interlude=ax.text(5,2,text,
fontdict=fdic,bbox=boxdic)
imgs.append([interlude])
#上演
imgs=[]
interlude(imgs,comment1,20)
interlude(imgs,comment2,30)
load_lines(imgs,lines1)
load_lines(imgs,lines2)
interlude(imgs,comment3,20)
interlude(imgs,comment4,30)
load_lines(imgs,lines3)
mov=ani.ArtistAnimation(fig, imgs, 100)
plt.show()