3차원 직교좌표계에서 토러스(torus)의 매개방정식은
x(u, v) =  (R + r \cos{v}) \cos{u} \,
y(u, v) =  (R + r \cos{v}) \sin{u} \,
z(u, v) =  r \sin{v} \,
으로 주어진다. 이 매개방정식을 이용하여 torus 를 여러가지 그리기 도구

          Mathemarica, Maxima, Grapher, Gnuplot, Octave, Matplotlib

들로 각각 그려보자.        



* 윈도우 XP 에서 Mathematica 8 을 이용하여 그리기





* 윈도우 XP 에서 wxMaxima 를 이용하여 그리기
** 명령 입력



** 위의 명령으로 별도의 창에 그려진 곡면





* Mac OS X Lion 에서 Grapher 를 이용하여 그리기





* 윈도우 XP 에서 Gnuplot 을 이용하여 그리기
** Gnuplot 소스
#
# parametricTorus.dem

set term win
set parametric
set isosamples 80, 30
set hidden
set key below

set title "Parametric Torus"
set urange [0:2*pi]
set vrange [0:2*pi]
set ztics nomirror -2.0, 0.5, 2.0
set view 45,50
a = 5
b = 2
splot (a+ b*cos(v))*cos(u), (a + b*cos(v))*sin(u), b*sin(v)


** Gnuplot 창에 위의 소스를 입력하기



** 위의 명령으로 Gnuplot 이 그려준 곡면




* 윈도우 XP 에서 Octave 3.2.4 를 이용하하여 곡면 그리기
** Octave 소스
a = 5;
b = 2;
fx = @(u, v) (a + b.*cos(v)).*cos(u);
fy = @(u, v) (a + b.*cos(v)).*sin(u);
fz = @(u, v) b.*sin(v);
ezmesh (fx, fy, fz, [-2*pi, 2*pi, -2*pi, 2*pi], 50);


** Octave 실행 창에 명령 입력하기




** 위의 명령으로 Octave 가 그려준 곡면





* Matplotlib 를 이용하여 곡면 그리기
1) 두 가지 색으로 칠하기
** 파이썬 소스

from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.gca(projection='3d')
U = np.arange(-2*np.pi, 2*np.pi, 0.2)
ulen = len(U)
V = np.arange(-2*np.pi, 2*np.pi, 0.2)
vlen = len(V)
U, V = np.meshgrid(U, V)
a = 5
b = 2
X = (a + b*np.cos(V))*np.cos(U)
Y = (a + b*np.cos(V))*np.sin(U)
Z = np.sin(V)

colortuple = ('y', 'b')
colors = np.empty(X.shape, dtype=str)
for v in range(vlen):
    for u in range(ulen):
        colors[u, v] = colortuple[(u + v) % len(colortuple)]

surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors,
        linewidth=0, antialiased=False)

ax.set_zlim3d(-1, 1)
ax.w_zaxis.set_major_locator(LinearLocator(6))
ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f'))

plt.show()


** 위의 소스를 실행시켜서 그린 곡면



2) 선으로만 그리기
** 파이썬 소스

from mpl_toolkits.mplot3d import axes3d
import matplotlib.pyplot as plt
import numpy as np

fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
U = np.arange(-2*np.pi, 2*np.pi, 0.2)
ulen = len(U)
V = np.arange(-2*np.pi, 2*np.pi, 0.2)
vlen = len(V)
U, V = np.meshgrid(U, V)
a = 5
b = 2
X = (a + b*np.cos(V))*np.cos(U)
Y = (a + b*np.cos(V))*np.sin(U)
Z = np.sin(V)
ax.plot_wireframe(X, Y, Z, rstride=3, cstride=3)

plt.show()



** 위의 소스를 실행시켜서 그린 곡면




3) 높이에 따라 다른 색으로 칠하기
** 파이썬 소스

#!/usr/bin/env python

from mpl_toolkits.mplot3d.axes3d import Axes3D
import matplotlib.pyplot as plt

# imports specific to the plots in this example
import numpy as np
from matplotlib import cm

# Twice as wide as it is tall.
fig = plt.figure(figsize=plt.figaspect(0.7))

#---- First subplot
ax = fig.add_subplot(111, projection='3d')
U = np.arange(0, 2*np.pi, 0.1)
V = np.arange(0, 2*np.pi, 0.1)
U, V = np.meshgrid(U, V)
a = 5
b = 2
X = (a + b*np.cos(V))*np.cos(U)
Y = (a + b*np.cos(V))*np.sin(U)
Z = b*np.sin(V)
surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet,
        linewidth=0, antialiased=False)
ax.set_zlim3d(-2.01, 2.01)

fig.colorbar(surf, shrink=0.5, aspect=10)

plt.show()



** 위의 소스를 실행시켜서 그린 곡면




Posted by Scripter
,