이 과정을 sagemath로 구현해 보는데 약간의 어려운 점들이 있었다. 지금도 완벽하다고는 생각하지 않는다.
var('u,v')
def hel(u,v):
return vector([sinh(v)*sin(u), -sinh(v)*cos(u), u])
def cat(u,v):
return vector([cosh(v)*cos(u), cosh(v)*sin(u), v])
def heltocat(u,v,t):
return cos(t)*hel(u,v) + sin(t)*cat(u,v)
def myplot1(t):
return parametric_plot3d( heltocat(u,v,t),(u,0,2*pi),(v,-1,1),
aspect_ratio = (1,1,1),
frame=False
)
animate([myplot1(t) for t in xsrange(0,pi, 0.1*pi)])
문제점 : 공간의 축과 그림의 비율이 흔들리고 있기 때문에 제대로 된 그림이라고 볼 수 없다.
from sage.plot.plot3d.shapes import Box
def myplot2(t):
p =parametric_plot3d( heltocat(u,v,t),(u,0,2*pi),(v,-1,1),
aspect_ratio = (1,1,1)
#frame=True,
)
q = Box([3,3,7], opacity=0.05)
return p+q
참고 : 위에서 상자의 역활은 plot_range를 고정시키는 데에 있다. 이게 없으면 plot_range가 frame마다 변해서 규칙적인 animation을 얻을 수 없다. 나의 독창적 해법이다. :-)
animate([myplot2(t) for t in xsrange(0,pi, 0.1*pi)] )
후기 : 그림이 작고 흐릿한 게 맘에 들지 않는다. 공간이 고정된 것은 좋은 원하던 바다.
@interact
def myplot4(t = slider(srange(0,pi,0.01*pi), default=0)):
p = parametric_plot3d( heltocat(u,v,t),(u,0,2*pi),(v,-1,1),
plot3d_range = ((-1,1),(-1,1),(-1,1)), # does not work.
aspect_ratio = (1,1,1),
frame=True,
# view_point= (2,2,-2) # does not work.
)
q = Box([3,3,7], opacity=0.1)
return p+q
%matplotlib online %matplotlib notebook
등으로 3차원 그림을 그렸던 것 같은데 지금은 왜 안 되지?