対象物,ここでは立方体,の三次元座標を打ち込みます.
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にはいくつかの描画レベルに合わせた関数が用意されている.しかし,解説書などでは,個別の使い方の説明はあるが,それぞれの関数がどのような意図で作られ,どのような機能(library)を担っているかよくわからず,どの時にどの関数を使うか迷ってしまう.ここでは,その相互の関数,パッケージの依存関係をメモしておく.
plot[structure]にあるPLOT,PLOT3Dデータ構造が一番下でCURVES,POINTS,POLYGONS,TEXTデータを元に絵を描く.
簡単にグラフを書くための道具.たとえばここで使ったpointplotはまさに,pointを使って関数を表示する事を当初の目的としている.
PLOTよりもう少し上位で,グラフィックスの基本形状を生成してくれる関数群.arc, arrow, circle, curve, line, point, sphereなどの関数があり,PLOT構造を吐く.表示にはplots[display]を使う.