Powered by SmartDoc

graphicsの基礎

数式処理演習 西谷 滋人

最も簡単な透視図の作成

対象物,ここでは立方体,の三次元座標を打ち込みます.

restart;
with(plots):
with(plottools):

p:=[[0,0,0],[1,0,0],[1,1,0],[0,1,0],
[0,0,1],[1,0,1],[1,1,1],[0,1,1]]:

次にこれを表示させます.

points:= { seq(p[i],i=1..8) }:
pointplot3d(points,symbol=circle,symbolsize=40,color=black);

これで点が表示されているはずです.画像をつまんでぐるぐる回してみてください.よく見ればわかるように,この3次元表示では透視図ではなく,平行投影図といわれるものを書いています.そこで本当の透視図を作るのがこの課題の目的です.

その前に,点と点を結ぶ線の引き方を見ておきます.たとえば,p[1]とp[2]との間を線で結ぶには,

line(p[1],p[2]);display(line);

とすればいいだけです.しかし,これをすべての線に対して記述するのは面倒です.コピペでは,後で修正する必要が出てきたときに不便です.そこで点のリストを使って自動的に生成させる方法を紹介しておきます.

ll:=[[1,2],[2,3],[3,4],[4,1]]:#linelistのつもり
p[ll[1][2]];

として出力させてみてください.p[2]の座標が出力されているはずです.これを使って,

ll:=[[1,2],[2,3],[3,4],[4,1],[1,5],[2,6],[3,7],[4,8],
[5,6],[6,7],[7,8],[8,5]]:
lines:=[seq(line(p[ll[i][1]],p[ll[i][2]]),i=1..nops(ll))]:

とすればすべての線を引いてくれます.

display(lines,scaling=constrained,color=black);

さていよいよ透視図の作成です.いろいろやり方があるようですが,もっとも簡単な変換法は

proj2d:=proc(x,z)
local x1,y1;
x1:=x[1]*z/(z-x[3]);
y1:=x[2]*z/(z-x[3]);
[x1,y1];
end proc;

です.何をしているか考えください.この関数を前の表示と組み合わせれば

z_p:=-20;
lines:=[seq(line(proj2d(p[ll[i][1]],z_p),
		proj2d(p[ll[i][2]],z_p)),
	i=1..nops(ll))]:
display(lines);

となり透視図の描画は終わり.

もっとまともなのを造りたい人は工夫してください.

課題

青色テキストの2.6“オイラー角”を参照して立方体を回した状態での透視図を描け.余力がある人は次のおまけを参照して,アニメーションを作れ.

おまけ:アニメーションの作成

tmp:=[];
for i from 0 to 5 do
  coord:=[0,5-i];
  tmp:=[op(tmp), circle(coord,0.5)];
end do:
display(tmp,insequence=true,scaling=constrained);

insequenceでアニメーションである事が指示されています.これを外部へ出して表示させるには,以下のコマンドでまず,gifのframeを作ります.

plotsetup(gif,plotoutput=`/Users/bob/Desktop/motion.gif`);
display(tmp,insequence=true,scaling=constrained);
plotsetup(default);

こいつをquicktimeなどに食わせれば動きがでます.

Mapleの描画関数の覚書

mapleにはいくつかの描画レベルに合わせた関数が用意されている.しかし,解説書などでは,個別の使い方の説明はあるが,それぞれの関数がどのような意図で作られ,どのような機能(library)を担っているかよくわからず,どの時にどの関数を使うか迷ってしまう.ここでは,その相互の関数,パッケージの依存関係をメモしておく.

描画の下位関数

plot[structure]にあるPLOT,PLOT3Dデータ構造が一番下でCURVES,POINTS,POLYGONS,TEXTデータを元に絵を描く.

plotsパッケージ

簡単にグラフを書くための道具.たとえばここで使ったpointplotはまさに,pointを使って関数を表示する事を当初の目的としている.

plottoolsパッケージ

PLOTよりもう少し上位で,グラフィックスの基本形状を生成してくれる関数群.arc, arrow, circle, curve, line, point, sphereなどの関数があり,PLOT構造を吐く.表示にはplots[display]を使う.