問題文
下の図で、 $\mathrm{X,Y}$ はどちらも、すべての辺の長さが $1\mathrm{cm}$ で底面が正方形の四角すいです。 $\mathrm{X}$ の正方形の面を床に接着し、 $\mathrm{A}$ と $\mathrm{F,}$ $\mathrm{B}$ と $\mathrm{E,}$ $\mathrm{C}$ と $\mathrm{D}$ がそれぞれ重なるように $\mathrm{X}$ と $\mathrm{Y}$ を接着すると、 $\mathrm{G}$ の床からの高さは、 $\mathrm{A}$ の床からの高さの 倍です。(2022 灘中 1日目12番)
$$\frac{4}{3}$$
※ この答えは学校側が公表したものではありません。個人が作成した非公式の答えです。
コード
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as ani
#紙の準備
fig = plt.figure()
ax=fig.add_subplot(projection='3d')
ax.set_title("2022灘中算数 1日目12番")
ax.set_xlim(-0.8,0.6)
ax.set_ylim(-0.2,1.2)
ax.set_zlim(-0.2,1.2)
ax.set_box_aspect((1,1,1))
ax.axis("off")
#点の準備
A = [-1/2,1/2,np.sqrt(2)/2]
P = [-1,1,0]
Q = [-1,0,0]
B = [0,0,0]
C = [0,1,0]
R = [5/6,1/2,np.sqrt(2)/6]
G = [1/3,1,2*np.sqrt(2)/3]
#立体を描画
ax.plot_trisurf([P[0],Q[0],B[0],C[0]],
[P[1],Q[1],B[1],C[1]],
[P[2],Q[2],B[2],C[2]],
color="cyan",alpha=0.4)
ax.plot_trisurf([A[0],B[0],R[0],G[0]],
[A[1],B[1],R[1],G[1]],
[A[2],B[2],R[2],G[2]],
color="orange",alpha=0.4)
ax.plot([P[0],A[0],Q[0]],
[P[1],A[1],Q[1]],
[P[2],A[2],Q[2]],
color="blue")
ax.plot([C[0],P[0],Q[0],B[0]],
[C[1],P[1],Q[1],B[1]],
[C[2],P[2],Q[2],B[2]],
color="blue")
ax.plot([A[0],B[0],C[0],A[0]],
[A[1],B[1],C[1],A[1]],
[A[2],B[2],C[2],A[2]],
color="magenta")
ax.plot([R[0],C[0],G[0]],
[R[1],C[1],G[1]],
[R[2],C[2],G[2]],
color="darkorange")
ax.plot([B[0],R[0],G[0],A[0]],
[B[1],R[1],G[1],A[1]],
[B[2],R[2],G[2],A[2]],
color="darkorange")
#立体を回転させて動画を作成する
def update(i):
if i<180:
ax.view_init(30,-90+2*i)
elif i<300:
ax.view_init(30+2*(i-180),-90)
elif i<345:
ax.view_init(-90+2*(i-300),-90)
elif i<375:
ax.plot([A[0],A[0]],
[A[1],A[1]],
[A[2],A[2]*(375-i)/30],
color="green",linestyle="dashed")
ax.plot([G[0],G[0]],
[G[1],G[1]],
[0,G[2]*(i-345)/30],
color="red",linestyle="dashed")
ax.plot(G[0],G[1],G[2],
color="red",marker="o")
elif i<395:
ax.text(-0.73,0.5,0.16,"③",
color="green",fontsize=20,alpha=(i-375)/20)
elif i<415:
ax.text( 0.37,1.0,0.32,"④",
color="red",fontsize=20,alpha=(i-395)/20)
mov = ani.FuncAnimation(fig,update,450)
plt.show()