양성덕
20210324
고려대학교에서 가르치기 시작한 초창기에 가르쳤던 그림이다. 거의 이십년만에 sagemath로 다시 그려본다.
def RotationMatrix(theta):
return matrix([[cos(theta), -sin(theta),0],[sin(theta), cos(theta),0],[0,0,1]])
var('theta')
RotationMatrix(theta)
[ cos(theta) -sin(theta) 0] [ sin(theta) cos(theta) 0] [ 0 0 1]
다음은 두 직선 x=z, y=1 과 x=-z, y=1을 z축을 중심으로 돌린 직선의 식이다.
def family1(theta,t):
return RotationMatrix(theta)*vector([t,1,t])
def family2(theta,t):
return RotationMatrix(theta)*vector([-t,1,t])
var('t')
family1(theta, t)
(t*cos(theta) - sin(theta), t*sin(theta) + cos(theta), t)
family2(theta,t)
(-t*cos(theta) - sin(theta), -t*sin(theta) + cos(theta), t)
이제 위 직선들을 그려 본다.
def myplot(theta):
p = parametric_plot3d( family1(theta,t),(t, -1,1), frame = False)
return p
var('t')
l = [ myplot(theta) for theta in xsrange(0, 2*pi, 0.02*pi)]
def myplot2(theta):
p = parametric_plot3d( family2(theta,t) ,(t, -1,1),
frame = False,
color='red')
return p
l2 = [ myplot2(theta) for theta in xsrange(0, 2*pi, 0.02*pi)]
p = sum(l[i] for i in range(0,100))
p2= sum(l2[i] for i in range(0,100))
q = p + p2
q.show()
이제 위 직선의 일부로 만들어진 공간 6각형을 그려본다.
p1 = family1(2*pi/6*0, tan(pi/6))
p2 = family2(2*pi/6*1,-tan(pi/6))
p3 = family1(2*pi/6*2,tan(pi/6))
p4 = family2(2*pi/6*3,-tan(pi/6))
p5 = family1(2*pi/6*4,tan(pi/6))
p6 = family2(2*pi/6*5,-tan(pi/6))
line1 = line([p1,p2], color='red', thickness=3)
line2 = line([p2,p3], color='blue', thickness=3)
line3 = line([p3,p4], color='red', thickness=3)
line4 = line([p4,p5], color='blue', thickness=3)
line5 = line([p5,p6], color='red', thickness=3)
line6 = line([p6,p1], color='blue', thickness=3)
var('y z')
hyperboloid = implicit_plot3d(x^2+y^2-z^2==1, (x, -2,2),(y,-2,2),(z, -1,1),
opacity = 0.1)
show(line1+line2+line3+line4+line5+line6+hyperboloid, frame=False)
위 그림을 빙빙 돌려가면서 나오는 그림을 평면그림으로 이해하면 브리앙숑의 정리와의 관계를 "느낄" 수 있다.