読み書きプログラミング

日常のプログラミングで気づいたことを綴っています

(6) 3次元パラメトリックプロット

三つ葉結び目を描いてみましょう。
まずは2次元平面への投影図です。

/* 3.6.4m */
a : 1.0$
b : 0.4$
r(t) := a + b*cos(3*t/2)$
plot2d([parametric, r(t)*cos(t), r(t)*sin(t), [t, 0, 4*%pi + 0.1], [nticks, 200]], [x, -2.0, 2.0], [y, -1.5, 1.5])$

案の定わかりにくいですね。


3次元プロットしてみましょう。

/* 3.6.5m */
load(draw)$

a : 1.0$
b : 0.4$
c : 0.5$
r(t) := a + b*cos(3*t/2)$
z(t) := c*sin(3*t/2)$
draw3d([nticks = 100], parametric(r(t) * cos(t), r(t) * sin(t), z(t), t, 0, 4*%pi + 0.1))$


まだ見にくいです。
線をチューブにしてみましょう。

/* 3.6.9m */
a : 1.0$
b : 0.4$
c : 0.5$
d : 0.3$

r(t) := a + b*cos(1.5*t)$
z(t) := c*sin(1.5*t)$
x(t) := r(t)*cos(t)$
y(t) := r(t)*sin(t)$

qqx(t) := -((1.0 + 0.3*cos(1.5*t))*sin(t)) - 0.45*cos(t)*sin(1.5*t)$
qqy(t) := cos(t)*(1.0 + 0.3*cos(1.5*t)) - 0.45*sin(t)*sin(1.5*t)$
qqz(t) := 0.75*cos(1.5*t)$

norm(t) := sqrt(qqx(t)^2 + qqy(t)^2 + qqz(t)^2)$
qx(t) := qqx(t)/norm(t)$
qy(t) := qqy(t)/norm(t)$
qz(t) := qqz(t)/norm(t)$

normv(t) := sqrt(qx(t)^2 + qy(t)^2)$
vx(t) := qy(t)/normv(t)$
vy(t) := -qx(t)/normv(t)$
wx(t) := -qz(t)*vy(t)$
wy(t) := qz(t)*vx(t)$
wz(t) := qx(t)*vy(t) - vx(t)*qy(t)$

xx(t, u) := x(t) + d*(vx(t)*cos(u) + wx(t)*sin(u))$
yy(t, u) := y(t) + d*(vy(t)*cos(u) + wy(t)* sin(u))$
zz(t, u) := z(t) + d*(wz(t)*sin(u))$

plot3d([xx(t, u), yy(t, u), zz(t, u)], [t, 0, 4*%pi + 0.31], [u, 0, 2*%pi], [grid, 100, 20])$


交差の状況がわかりやすくなりました。


別の3次元パラメトリックプロットの例として、メビウスの帯を描いてみましょう。

/* 3.6.11m */
a : 1.0$
b : 0.5$

r(t, v) := a + b*v*cos(t/2)$
x(t, v) := r(t, v)*cos(t)$
y(t, v) := r(t, v)*sin(t)$
z(t, v) := b*v*sin(t/2)$

plot3d([x(t, v), y(t, v), z(t, v)], [t, 0, 2*%pi], [v, -1, 1], [grid, 30, 4])$