MePoTeXを活用して,図形とグラフを究めよう!
(注1) MathJaxを使用しているので、 スマホでは表示に時間がかかることがあります。
(注2) 図やコードが文章に被って表示されるときは「再読み込み」して下さい。
(注3)モバイル利用(Android)でのメニュー選択は、 SiteMapを利用するか、 「長押し」から「新しいタブを開く」を選択してください。
■MePoTeXによる図形やグラフの作成法 [Map] |
|
|
[御案内] TeXを利用して数学プリントを作成するとき,
いろいろな図形やグラフを作成する必要があります.
それを作成するアプリはTeXのシステムにすでに含まれています.
「MetaPost」です.さらに,それをTeXソースの中で利用できるようにした
パッケージが「MePoTeX」(概要)です.詳細なマニュアルもあるのですが,
TeXを使い慣れていない場合は全体像を把握しにくいかもしれません.
そこで,ここでは,TeXを使い始めた方を念頭に, MePoTeXを用いた図形やグラフの作成方法について解説します. ただし,TeXのインストールはすでになされており, TeXによる通常文書は作成できるレベルにあることを前提とします. emathと類似したコマンドで 曲面の描画まで行うことができ、 図形をGhostscriptを経由しないEPSファイル(MPS)で保存することができます。
|
|
■空間図形の基本 |
(注) Web上での表示の都合上、 空白は全角を使用しています。 以下のコードをコピーして実行するときは、 半角の空白かtabで置き換えて実行してください。 |
空間座標 |
空間図形を描くことは、立体を平面に「投影する」作業になります。
ここでは、その投影の仕組みには触れませんが、
MePoTeXでは点の平面への投影は「proj(座標)」により行われます。
したがって、線で結ばれた空間図形を描くには、
平面に投影された個々の点を「xdraw()」で結んでいくだけです。
投影の仕組みなどについては、下記の「第4部第7講 射影・投影」(p150)を 参照してください。
以下では、最初に、頂点の座標を個別に定義する場合を示します。 その後で、単位ベクトルを利用して 定義する場合を示しています。
|
上記では、最初に[A]で座標軸を定義しています。
空間の座標軸を引くコマンドは「\mptXTaxis」です。
書式は、
\mptXTaxis|基点==終点>[配置] 次に、[B]で直方体の各頂点を個別に定義しています。 \mptPointを利用すると、点の座標の定義、その点に振るラベル(文字)、 そしてその配置位置までを一気に行うことができます。 xdraw()で結ぶには、「proj」をつけて投影した点で定義する必要があります。 頂点を定義したら、[C]で「xdraw( )」で結んでいくだけです。 ( )内では、線の太さ・線種・色などを指定することができます。 |
|
■単位ベクトルの利用 上記では頂点の座標を個別に定義しましたが、 単位ベクトルを利用する形で定義することもできます。 MetaPostでは、色指定の定数として black=(0,0,0)、red=(1,0,0)、green=(0,1,0)、blue=(0,0,1) が定義済みです。色指定の箇所で利用すると色ですが、 この値を空間の座標やベクトルの成分として利用することもできます。 平面のベクトルや座標を表す変数は「pair」で宣言する必要がありますが、 空間のベクトルや座標を表す変数は「color」で宣言します。 前述の直方体は、次のような形で定義することができます。
|
[A]で座標軸を定義した後で、
[B]では最初に空間座標を表す変数宣言を
しています。「color c[];」という形で宣言すると、その後で c0,c1などとして
利用することができます。これは、c[0], c[1] と同じ事です。
宣言の段階で「color c0, c1」などとするとエラーになるので注意が必要です。
[C]では、e0を原点に、e1, e2, e3をそれぞれ座標軸方向の単位ベクトルとして 定義しています。e1, e2などに直さず、いきなり red, green, blueなどを 利用してもかまいませんが、わかりやすさの観点で置き換えています。 [D]では、個々の頂点をベクトルの終点として定義しています。 c0〜c7は、それぞれ頂点O〜Gに対応しています。 たとえば、c1は \(\small \overrightarrow{\rm OA}\) のことです。 ベクトルの和の形で定義することができます。 ここで定義された座標は、頂点の空間座標です。 [E]では、個々の頂点を xdraw()で利用できるように proj を利用して 平面に射影した点の座標を求めています。そこでは、「w」の単位つきです。 単位をつけないと「pt」になって原点付近にかたまってしまいます。 座標の変数を番号付けておくと、 for-endfor を利用して一気に変換することができます。 初字が「z」で始まるz[]は、最初にpair宣言をしなくても利用することができます。 [F]では、個々の頂点を xdraw() で結んで直方体を描いています。 個別に結んでもよいですが、 上面と下面の長方形と4本の縦線を描く箇所を、 for-endfor を利用して省力化しています。 「for n=a,b,c:」とすると、n の値は a, b, c の値で実行されます。 「for n=a upto b:」とすると、aからbまで1ずつ増やしながら実行します。 「for n=a step b until c」とすると、aからb刻みでcになるまで実行します。 最後の[G]では、各頂点にラベルを 配置しています。 ここで利用する座標は、射影された座標であることに注意してください。 |
|
円柱座標 |
空間座標として、直交座標ばかりではなく円柱座標を利用することもできます。
円柱座標は、\(\small (x,y)\) の部分を極座標で考えたもので、
\(\small (r, \theta, z)\) の形の座標です。
直交座標では \(\small (r\cos\theta, r\sin\theta, z)\) になります。
3つの成分で表される (a,b,c) が円柱座標であることを示すため、
「rdh(a,b,c)」の形で書きます。
「r」は半径、「d」は角度、「h」は高さのことで、
角度は度数法を利用します。
弧度法で考えたいときは「rrh(a,b,c)」とします。
前述の直方体を、個々の頂点を円柱座標で指定して描くと、 対角線は「OF=5」で、角度は \(\small \tan^{-1}(4/3)\fallingdotseq 53^{\circ}\) であることから 下記のようになります。頂点の座標の指定を円柱座標にしただけです。
|
|
四面体 |
平面図形では三角形の3辺の比を指定して三角形を描く
マクロがありましたが、
空間図形の場合は四面体の6辺の長さ(単位つき)を指定して
頂点を割り当てるマクロが用意されています。「SetTetra」です。
底面の三角形をABCとし、もう一つの頂点をPとするとき、
頂点の名前と対応する辺の長さを実寸で指定して、
\sendMP内で次のような書式で利用します。
SetTetra(頂点の名前)
|
上記では、頂点を納めた変数をまとめて c としています。
対応する頂点 P, A, B, C の座標は、
それぞれ c0, c1, c2, c3 に納められます。
長さを与えると各頂点の座標のみたす
連立方程式が得られるので、
それを解くことで具体的な座標が求められています。
指定した長さの四面体が存在しないときはエラーが表示されます。
その頂点を得た後で、
それぞれの点を射影した点に頂点の名前を配置しています。
したがって、「z.A」などは空間座標ではなくて、
射影後の平面上の座標です。
また、頂点の配置の仕方にはいくつかの制約があります。 まず、面の一つは \(\small xy\) 平面上にあります。 その平面上の頂点の一つは原点と \(\small x\) 軸の正の部分にあり、 もう一つの頂点は \(\small y>0\) であるように、そして 平面上にはない頂点は \(\small z>0\) となるように設定されます。 また、頂点の名前は、c0は底面上でない頂点、c1は原点、c2は \(\small x\) 軸 上の頂点、そして c3は残りの頂点です。 得られた四面体は、平行移動や直線に関する回転をさせて自由に 変形することができます。
■垂線の足 下図では、前述と同じ状況で、 点Cから直線PB上に下ろした垂線の足Hと 直角記号を書き入れています。 PA, AC は破線にしました。 また、SetTetraの辺の長さを指定する引数の順番を書き入れました。
|
「Asi」の引数と出力は、いずれも空間座標です。 z.Pなどは平面に射影された点の座標です。 引数を与えるときや、得られた点の扱いには注意が必要です。 辺に引数の順番を書き込むときは、PB以外は 2点間の中点を指定しています。 |
|
法線方向・上方向 |
ここまでは、空間の3つの座標がすべて正の領域で図形を
表示してきました。MePoTeXのデフォルトでは、
視点は、緯度10度、経度30度の点と原点を結ぶ方向から視るように
設定されています。その角度は自由に変えることができます。
それを行うのが「SetProjDir」というマクロです。
「SetProjDir(緯度, 経度)(上方向)」を\sendMP内で指定します。
\(\small z\) 軸の正の方向を上方向とするとき、
\(\small xy\) 平面は緯度0度、\(\small zx\) 平面の
\(\small x>0\) の部分が経度0度です。
「上方向」は、描画するときの上方向を定める空間ベクトルです。
デフォルトでは「SetProjDir(10,30)(blue)」が指定されています。 「blue」は、(0,0,1)の値がデフォルトで設定されています。 MetaPostでは、色の指定は 0〜1 の範囲の数の3つの組で指定します。 (0,0,1)は、10進のRGB形式では(0,0,255)という青色です。 このような3つの数の組は「color」宣言することで利用でき、 0〜1 の範囲に限らないで利用すると 空間座標や空間ベクトルとして利用することができます。 ここでは、上方向のベクトルに「blue=(0,0,1)」を指定しています。 要するに、「上方向」として \(\small z\) 軸方向の正の方向を 指定したことになります。 なお、\(\small x\) 軸方向は「red=(1,0,0)」、 \(\small y\) 軸方向は「green=(0,1,0)」です。 つまり、このような形で、 任意の方向を「上方向」に指定できることになります。
|
上記では、参考までに格子も描画しました。
この方向でかまわない場合は、「SetProjDir」は省略してかまいません。
「SetProjDir」の意味を把握するには、
緯度・経度や上方向のベクトルをいろいろ変えてみて、
どのように表示されるか確かめてみるとよいでしょう。
以下に、座標軸がどのように見えるか、幾つかの例を示します。 なお、座標軸のラベルを「\LARGE」で大きくしています。
|
|
視点を緯度と経度で指定するのは、慣れないとちょっと分かりにくいかもしれません。
「SetProjDir」は、視点の方向を3次元ベクトルを用いて指定することもできます。
たとえば、「SetProjDir(a,b,c)(blue)」とすると、
\(\small z\) 軸の正の方向を上向きとするとき、
3次元ベクトル \(\small (a,b,c)\) の方向から視ることを指定しています。
座標平面に射影した図を見たいときは、この3次元ベクトルで指定した方が
分かりやすいかもしれません。
|
上記では、\(\small (1,1,1)\) の方向から視ています。
以下に、視る方向を変えて、図だけを示します。
|
■曲線・曲面の描画 |
(注) Web上での表示の都合上、 空白は全角を使用しています。 以下のコードをコピーして実行するときは、 半角の空白かtabで置き換えて実行してください。 |
空間曲線 |
空間曲線は、\(\small t\) を媒介変数として、
\(\small (x,y,z)=(f(t),g(t),h(t))\) の形で表されます。
平面曲線の場合と同様に、
空間曲線は「kansuQ」により描画することができます。
下図は、半径2、高さ4の円柱に巻き付く弦巻線を描いています。
巻き付く様子が分かるように、\(\small z\) 軸を40度傾けています。
|
弦巻線は、媒介変数表示では \(\small (r\cos t, r\sin t, ar)\) ですが、 円柱座標を利用すると「rdh(\(\small r, t, ar\))」ですみます。 裏側の見えない箇所は破線にしましたが、これは手動で行いました。 曲面描画では隠線処理が行われますが、 このような場合は手動で範囲を分けるしかないようです。 また、単位をつける必要のある箇所と、つけなくてもよい箇所、 さらに「proj」で射影する必要のある箇所と、しなくてもよい箇所が 混在するので、ちょっと混乱するかもしれません。 「xdraw()」で線を引くときは、単位つきの座標を射影する必要があります。 「kansuQ」で描画するときは、単位も射影も不要です。 |
|
曲面の描画 |
媒介変数表示で表された曲面を描画するマクロは、
文字通りの「drawSurface」です。
2つの媒介変数 \(\small s, t\) を用いて
\(\small x=f(s,t), y=g(s,t), z=h(s,t)\) と表されるとき、
drawSurface(f(s,t),g(s,t),h(s,t))
|
これは、MePoTeXのマニュアル[1]の
図86(p.56)にあるものです。
「setunitlength」では、3つの方向の単位を別々に決めることができます。
特に指定されていなければ 「(w,w,w)」で設定されます。
曲面の表と裏を別々に描いています。
裏表の判定は「フレミングの法則」にならい、
親指の向きを \(\small s\) の増加方向、
人差し指の向きを \(\small t\) の増加方向とするとき、
中指の向きがSetProjDirで指定した方向から見て手前に迫ってくる側が表、
奥に遠ざかる面が裏として判定されます(p.132)。
★マニュアルの図のコードをコピーして実行して「\dis」に関する エラーが出るときはこちらを参照してください。 表側や裏側の描画に関しては、次のようなマクロが用意されています。
裏表がはっきり分かるように濃淡をつけるには、たとえば 「background:=0.7*white;」 を描画前に設定すると表側が濃くなりますが、 背景の地の色に対する指定なので座標軸のラベルの背景も同じ色になります。 「white」だけでなく、いろいろな色で試してみるとよいでしょう。 下図は、「SetPolyBoth;」を指定した上で、 backgroundの指定を行って描画したものです。
|
|
■幾つかの曲面 以下に、幾つかの描画例を掲げておきます。 gnuplotなどの 描画専用ソフトとの優劣を比較することに意味はありません。 それらのソフトを利用しなくても、TeXの中だけでここまで描画できることの ありがたみを感じるべきでしょう。 複数曲面の重ね合わせには対応していません。 以下では、座標軸部分のコードは省略しました。 長さは、曲面の状況をみながら変えています。
|
|
|
|
|
|
|
(注) MetaPostの計算の優先順位によると、 「-s**2」とすると \(\small (-s)^2\) と 理解されるので注意が必要です。 |
特異点を持つ場合は、分割数や、軸の縮尺や範囲を工夫する必要があります。
|
|
|
■球面調和関数 掲示板[No.5]で質問を受けたことで、球面調和関数の概要について知ることができました。 この関数は、ラプラシアン\(\small \Delta=\frac{\partial^2}{\partial x^2}+\frac{\partial^2}{\partial y^2}+\frac{\partial^2}{\partial z^2}\)を球座標 \(\small (r,\theta,\phi)\) で考えたときの 角度成分 \(\small (\theta,\phi)\) に関する固有関数になっており、 物理・工学の分野のみならず、日常の気象予報やゲームグラフィックス等の3次元CG、 さらには天文学、医学、音響分野等、多様な分野で利用される重要な関数です (参照)。 具体的には次の式で表されます。 \[\begin{align*} \small Y_l^m(\theta,\phi) &\small =(-1)^{\frac{m+|m|}{2}}\\ &\small \times \sqrt{\frac{2l+1}{4\pi}\frac{(l-|m|)!}{(l+|m|)!}}\\ &\small \times P_l^{|m|}(\cos\theta)e^{im\phi} \end{align*} \] ここで、\(\small P_l^m(x)\) はルジャンドル培関数と呼ばれる特殊関数で、 次の式で定義されます。 \[\small P_l^m(x)=\dfrac1{2^ll!}(1-x^2)^{\frac{m}{2}}\frac{d^{l+m}}{dx^{l+m}}(x^2-1)^l\] 関数の定義自体が高度で通常の数学教育にはなじまないのですが、 いろいろな専門分野では必須の関数になっています。 Wikipediaに、\(\small 0\le l\le 10\) の場合の具体的な式があります。 下記も参照してください。 球面調和関数のグラフとして例示されることが多いのは \(\small Y_2^0\) のグラフで、球座標では \[\small Y_2^0=\dfrac14\sqrt{\dfrac5{\pi}}(3\cos^2\theta-1)\] と表され、次のようなグラフです。 このような、球面調和関数のグラフを描画できるアプリがあります(参照)。 |
このグラフをMePoTeXで描いてみましょう。 \(\small y=3\cos^2{x}-1\) のグラフは下図のようになります。 \(\small x\) 軸との最初の交点は \(\small \cos{x}=\frac1{\sqrt{3}}\) より, \(\small a=\cos^{-1}\frac1{\sqrt{3}}=0.9553({\rm rad})=54.7^{\circ}\)です。 このグラフを、 横軸を \(\small \theta\)、縦軸を \(\small r\) として極座標に読み替えて 表示したのが下段のグラフです。 原点を通るのは、\(\small \theta=a, \pi-a\) のときです。 曲線上の動きとしては、 \(\small \theta\) が増えるにつれ、点は右端から左方向に動いていきます。 このグラフを横軸の回りに回転したものが \(\small Y_2^0\) のグラフです。
|
|
球座標で定義された式を直交座標の媒介変数での表示に直して描画すると、 下記のようになります。
|
Expi(緯度,経度) いちいち媒介変数表示で指定するのは面倒です. MePoTeXには,空間の緯度(s)・経度(t)を指定して, その方向の単位ベクトルを返す「Expi(s,t)」というコマンドがあります. ただし,緯度0は赤道平面なので, $\small z$軸からの角を$\small s~(0\le s\le \pi)$とした場合は $\small \pi/2$だけずらしてExpi(PI/2-s,t)とする必要があります. これを利用すると,上記の3つの座標を指定する部分は 単に「r(s)*Expi(PI/2-s,t)」とするだけで済みます. たとえば,2番目の「drawSurface」は 「drawSurface(r(s)*Expi(PI/2-s,t))(0,a,20)(0,2PI,40);」 となり簡潔に記述できます.度数法の場合は「Dir(s,t)」を利用します. この記法を用いて$\small Y_3^0$のグラフを描画してみましょう. \[\small Y_3^0=\dfrac14\sqrt{\dfrac{7}{\pi}}(5\cos^2\theta-3)\cos\theta\] 次のように,下から描いていくことになります.
|
【注】 このような曲面を描画するとき, 幾つかのパーツに分けて奥から順に描画するとよいこと, そして裏表の判断を逆にするには定義域の数値の大小を逆にすればよいこと, ならびに「Expi」を利用すると簡潔に記述できることは, いずれも「みなも」さんにご教示いただきました. |
■基本的な空間図形 |
(注) Web上での表示の都合上、 空白は全角を使用しています。 以下のコードをコピーして実行するときは、 半角の空白かtabで置き換えて実行してください。 |
球 |
中心と半径を与えて、グラデーションで塗りつぶされた球を描くことができます。
「mptBall(中心, 半径)(色変化)」の形で指定します。
実際には、円をグラデーションで塗りつぶして球のようにみせているだけのようです。
球の中心は空間座標ですが、
射影して描画しているので中心の座標は2成分である必要があります。
空間座標で指定するときは、それを「proj」で射影して
使用してください。
「色変化」は、パラメータを \(\small t~(-1\leqq t\leqq 1)\) として、 濃い・薄いの濃度変化を表す式を定義します。 マニュアル[1](p.122)では 次の設定例が紹介されています。 「white」以外の色で試してみてください。
|
以下は、「drawSurface」を利用した場合です。
|
|
柱体・錐体 |
MePoTeXには、円錐や角錐、あるいは円錐台や角錐台を描画できる マクロが用意されています。 |
■円柱と角柱 最初に円柱や角柱を描いてみましょう。 描画のために必要な引数は、中心、半径、高さ、そして角数です。 使用するマクロは「mptcolumn」です。 mptcolumn(中心)(半径, 高さ,角数)オプション 中心の座標は、\(\small xy\) 平面の単位つきの座標で、 事前に定義しておきます。引数に座標を直接書き入れるとエラーになります。 半径と高さは、いずれも単位つきで指定します。 円柱は、角数の多い角柱として描かれているので、 円柱の場合も設定する必要があります。 円柱の場合は、負数で \(\small -50\sim -100\) 程度の値で指定します。 グラデーションをつける関係で、多角柱で描画する仕様にしたようです。 オプション値は、引数を「,」で区切って5個まで指定することができ、 中心軸を傾けたり平面で切ったときの切り口を描画することができます。 詳細は、「円錐・角錐の傾斜」を見てください。
|
上記では、六角柱が描かれています。
表面が塗られていますが、これはデフォルトの設定である
「SetPolySolid」によるものです。
「SetPolyFrame;」を指定すると、
裏側が破線の枠線で描画されます。
円柱であれば、角数を「-50〜-100」の間で指定します。 下図は「SetPolyFrame;」を指定して、角数を「-50」としたものです。 |
|
■円錐と角錐 円錐や角錐を描くマクロは「mptcone」です。 mptcone(中心)(半径, 高さ,角数)オプション 下図では、座標軸は省略しました。 円錐は、角数を \(\small -50\sim -100\) の数で指定することで 描画されます。
|
|
■円錐・角錐の傾斜 「mptcone」の最後の引数である「オプション」には、 数値を最大5個まで「,」で区切って指定することができます。 その引数を順に「1,2,3,4,5」とすると、 通常の \(\small z\) 軸の正の方向が上側である座標系では、 それぞれ次のような内容です。
|
下記は、原点を中心とする高さ5hの四角錐を、
\(\small z\) 軸から\(\small x\) 軸方向に30度傾けた場合と、
\(\small x\) 軸から60度の方向に30度傾けた場合です。
|
下の図は、コメントアウトした箇所により描かれます。
ただし、頂点の位置(z0v)が2つの錐体では異なるので、
2つの図を同時に描画することはできません。
|
■円錐と平面との断面 下記は、円錐を底面とのなす角が30度の平面で切ったときの 断面です。
|
上の図は、最大傾斜点が \(\small xz\) 平面の \(\small x\) が正の側にある場合です。 手前に断面があり、向こう側に平面が下がっていく感じです。 下の図は、最大傾斜点が \(\small x<0\) の側にある場合です。 |
|
■円錐台と角錐台 円錐台や角錐台を描くには、 底面の半径に加えて上面の半径も指定する必要があります。 それらを引数に持つマクロは「mptColumnCone」です。 mptColumnCone(中心)(半径,高さ,角数)(緯度,経度)オプション 円柱や円錐と同じような引数のように見えますが、 「半径」の箇所が正数であれば円柱や角柱になります。 「(4w,2w)」のようなペア型変数で指定すると、 底面の半径が4w、上面の半径が2wの台になります。 「(0,2w)」や「(4w,0)」と一方に「0」が含まれると、 円錐か角錐で、前者は頂点が下にあり、後者は上にあります。
|
上記では、六角錐の台が描画されています。
頂点の名前も付しました。
中心を「z0」とした場合、角錐の底面と上面の頂点の座標は、
自動的に次の変数に割り当てられています。
|
「mptColumnCone」の3つ目の括弧を \(\small (a, b)\) とすると、
図形が \(\small y\) 軸の周りに \(\small -a\) 度、
\(\small z\) 軸の周りに \(\small b\) 度回転した図形が描画されます。
この部分は、とりあえずは「(0,0)」で指定して、図を見ながら
いろいろ試してみるとよいでしょう。
表側と裏側への配慮は、この回転では反映されないようです。
|
|
■正多面体 |
正多面体を描くマクロもあります。
それぞれのマクロは、次のような名前です。
|
これらの引数は、中心と大きさです。
大きさでは、外接円の半径か、1辺の長さを指定することができます。
1辺の長さを指定するときは負の値で指定します。
以下は、正八面体の場合です。
正数なので、外接円の半径で指定しています。
「-4w」を指定すると1辺の長さになります。
|
円錐や角錐の場合と同様に、引数を追加すると角度を変えることができます。
ただし、この引数を追加するときは、
マクロ名の初字は大文字とします。
下図は、\(\small y\) 軸の周りに\(\small -30\)度回転してから、 \(\small z\) 軸の周りに40度だけ回転したものです。 「SetPolyFrame」として、枠線だけ描画するようにしています。 頂点にラベルをつけましたが、 各頂点は中心を指定した変数に対して自動的に定まります。 一見するとわかりにくいですが、頂点「B」は手前側、 頂点「D」は奥側の点です。向こう側に倒して下から見上げる感じです。 ただし、角錐のときとは異なり、 添え字は「0」ではなく「1」から始まるので注意が必要です。
|
|
■空間図形の変形 |
MetaPostのデフォルトでは備わってはいませんが、 MePoTeXには空間のベクトルに下記のような変形を行うことができます。 アフィン変換を行うこともできます。 |
(注) Web上での表示の都合上、 空白は全角を使用しています。 以下のコードをコピーして実行するときは、 半角の空白かtabで置き換えて実行してください。 |
原図の直方体 |
ここでは、元となる図として直方体を利用して、
空間ベクトルに対するいろいろな変形を行うコマンドを紹介します。
下記の直方体を利用します。
|
上記では、最初に[A]で座標軸を設定します。
[B]では c[] を color変数(3次元)として宣言して、
c0, c1 等に直方体の頂点の座標を定義しています。
color宣言をしないとエラーになります。
「c[]」として [] をつけることで、c0, c1 などの数字の添え字を
利用することができます。
ここでは、原点をc0 とし、底面の頂点を反時計回りに c1,c2,c3 、
上面の頂点は \(\small z\) 軸上の頂点を c4として反時計回りに
c5,c6,c7としています。その定め方は、
最初に座標軸方向のベクトル c1, c3, c4 を定め、
他はそれらの和で定義しています。
blackは色の名前ですが、カラーコードでは (0,0,0) なので要するに原点です。
red=(1,0,0), green=(0,1,0), blue=(0,0,1)です。
[C]では、個々の頂点を射影(proj)して単位(w)をつけた点を z0, z1, z2に格納し、 xdraw()により長方形を破線で描画しています。 初字が「z」の場合は、変数宣言をしないで利用することができます。 最初に底面と上面の長方形を、次に縦の線を、 そして最後に対角線をいずれも破線で描画しています。 |
|
描画マクロの定義 |
これから、前述の直方体に種々の変形を加えて
変形後の図形を描画することになります。
元の直方体の頂点がどのような点に移されるかを求めて、
変換後の点を結んで変形後の図形を描画するだけですが、
その度に前述の[C]の描画部分を記述するのは面倒です。
そこで、ここでは、
頂点を結んで図形を描く部分をマクロ化しておきましょう。
以下では、
「MetaPostのマクロ」と
「TeXのマクロ」を紹介します。
いずれも、MePoTeXをすでに10年以上も使い続けておられ、
TeXやMetaPostのマクロに熟達された方からご教示いただいたものです。
MetaPostのマクロ 値を返さないで、単に一連の動作を行うMetaPostのマクロを定義するには、 \sendMP内で次のように定義します。
以上をもとに[C]の部分を、マクロ名を「drawBrick」として 作成すると次のようになります。
|
|
これはマクロを定義しているだけなので、 実行しても何も表示されません。また、 実際に描画させるには、 事前に直方体の頂点 c[n] が定義されている必要があります。 マクロを定義しても、このマクロの内容をいちいち書き込んでいたのでは マクロの意味がありません。 \sendMP{ } の中括弧内を、たとえば「drawbrick.mp」として保存して、 利用するときは\sendMP内で 「input drawbrick.mp;」として読み込みます。 このマクロを利用して前述の直方体を描画すると、 次のようになります。 |
|
上記では、最初に[A]で視点をちょっと変更してみました。 座標軸は、視点を変更してから指定する必要があります。 視点変更の前に座標軸を描くと、その座標軸は デフォルトの視点である「SetProjDir(10,30)(blue);」により 描画されます。その後では、[B]で頂点を指定して、 [C']でマクロを読み込んで、それから [D]でマクロを利用した描画が行われています。 |
|
TeXによるマクロ 同じ内容を、TeXのマクロで作成することもできます。 TeXに慣れている方は、こちらの方が分かりやすいかもしれません。 このマクロも、この項目の冒頭で紹介した方からご教示いただいたものです。
|
内容的には、MetaPostのマクロと同様です。 最初に、引数として #1, #2, #3 の3つ使用することを述べた後で、 その引数を利用して[C]の内容が記述されています。 マクロの{ }と、\sendMP の { } の2つの括弧を閉じることに気をつけてください。 この内容を、たとえば「drawbrick.tex」として保存しておけば、 「input "drawbrick.tex"」により読み込んで、 「\sendMP」の外側で「\drawBrick{z}{c}{hasen()}」とすれば 同じ図が得られます。 「input "drawbrick.tex"」を配置する箇所は、 プリアンブル部分、「MPpic」環境の前、あるいは その内部の「\sendMP」の外側であればどこでもかまいません。 |
|
平行移動 |
空間ベクトルに対して平行移動を行うコマンドは「Shifted」です。
空間ベクトル \(\small \mathbf{p}\) を平行移動する場合は、
移動の空間ベクトルを \(\small \mathbf{m}\) とするとき、
「q=p Shifted m」とします。
\(\small \mathbf{q}\) が移動後のベクトルで、
当然ながら、 \(\small \mathbf{p},\mathbf{q},\mathbf{m}\) は
color宣言されている必要があります。
実際に表示するには「proj」で射影して「w」等の単位をつけて、
xdraw()などで描画することになります。
|
デフォルトの視点を利用し、 [A][B][C]は前と同じです。 \sendMPは[B][C'][D]の箇所と、 変数宣言と[E][F]の箇所です。 [E]では、color変数として宣言された m, cc[], zz[]を利用して 平行移動を m=(2,2,0) とし、 cc[]には直方体の頂点 c[]を m だけ平行移動した空間座標を格納しています。 そして、[F]で作成した描画マクロ「drawBrick」を利用して変換後の図形を 描画しています。 指定通りに平行移動されているのが分かります。 |
|
座標軸中心の回転 |
ベクトル \(\small \mathbf{p}\) を \(\small x\) 軸中心に
\(\small t\) 度回転するには「p XRotated t」とします。
他の軸も同様です。
下記は、\(\small x\) 軸中心に\(\small -45\)度回転したものです。
[A]〜[D]や[F]の描画部分は、「drawBrick」を利用する前項と同一です。
|
|
任意軸中心の回転 |
空間内の点と原点を結ぶ直線に関する回転は「Rotated」です。
空間内の点は緯度と経度で指定し、回転角と合わせた
3つの成分を持つcolor値変数に設定します。
その変数をたとえば \(\small \mathbf{r}\) とすると、
「p Rotated r」によりベクトル \(\small \mathbf{p}\) が回転されます。
下図は、緯度と経度が (0,60) の点と原点を結ぶ直線の周りに30度回転した場合です。
[A]〜[D]や[F]の描画部分は、平行移動の項と同一です。
|
|
任意直線中心の回転 |
空間内の2点 \(\small \mathbf{a},\mathbf{b}\) を通る直線の周りに
t度回転するには、「Rotatedaround (a,b,t)」とします。
下記は、回転がわかりやすいように、(2,0,0)と(2,3,0)を通る直線の
周りに90度回転したものです。
[A]〜[D]や[F]の描画部分は、平行移動の項と同一です。
|
|
任意平面での対称移動 |
空間内の任意の3点を通る平面に関する対称移動を行うには
「Reflectedabout」を利用します。
3点を表すcolor値変数を \(\small \mathbf{a},\mathbf{b},\mathbf{c}\)
とするとき、
「p Reflectedabout (a,b,c)」により \(\small \mathbf{p}\) が
対称移動されます。
下記は、移動がわかりやすいように、直方体の上面に関して
対称移動したものです。
[A]〜[D]や[F]の描画部分は、平行移動の項と同一です。
|
|
アフィン変換 |
アフィン変換は、\(\small \mathbf{x}, \mathbf{x'}, \mathbf{p}\) を
列ベクトルとして \(\small A\) を同じ次数の正方行列とすると
\[\small \mathbf{x'}=A\mathbf{x}+\mathbf{p}\]
で表される変換です。この変換は、平面や空間の場合は、
点や直線に関する対称移動や、回転あるいは平行移動を含む変換です。
平面の場合のアフィン変換はMetaPostの機能に含まれていますが、
空間の場合の変換を行う機能はありません。MePoTeXでは、
空間の場合のアフィン変換を行うマクロが用意されています。
以下では、座標平面に平行な平面内でのアフィン変換と、
空間におけるアフィン変換について解説します。
■座標平面と平行な平面におけるアフィン変換 今、平面でのアフィン変換を \[\small \begin{pmatrix}x'\\ y'\end{pmatrix} =\begin{pmatrix}a&b\\ c&d\end{pmatrix} \begin{pmatrix}x\\ y\end{pmatrix} +\begin{pmatrix}e\\ f\end{pmatrix}\] とすると、たとえば \(\small yz\) 平面と平行な平面 \(\small x=r\) に おけるアフィン変換は \[\small \begin{align*} &\begin{pmatrix}r\\q_1\\ q_2\end{pmatrix} =\\ &\begin{pmatrix}1&0&0\\0&a&b\\0&c&d\end{pmatrix} \begin{pmatrix}r\\p_1\\ p_2\end{pmatrix} +\begin{pmatrix}0\\e\\ f\end{pmatrix} \end{align*}\] で定まる変換です。 ここで、「YZTransformed」を利用した変換を 「原図の長方形」に適用してみましょう。 最初に、そのようは変換を行う transform値を設定します。 例として、平面で \(\small x\) 方向(横方向)に1/2倍、 \(\small y\)方向(縦方向)に2倍して、 それを \(\small (2,1)\) まで平行移動する場合を考えます。 下図は、それを \(\small yz\) 平面やそれと 平行な平面 \(\small x=1\) に対して適用した場合です。
|
上記では、下記のことに留意してください。
|
参考までに、同じ transform値を用いて、「XYTransformed t」とした場合と、
「ZXTransformed t」とした場合の図も上げておきます。
|
|
■空間におけるアフィン変換 空間におけるアフィン変換はMetaPostには備わっていませんが、 MePoTeXではその変換を行うマクロが定義済みです。 平面の場合と同様に空間のアフィン変換は、 \(\small \mathbf{x}, \mathbf{x'}, \mathbf{p}\) を3次の 列ベクトルとして \(\small A\) を3次の正方行列とすると \[\small \mathbf{x'}=A\mathbf{x}+\mathbf{p}\] で表されます。 未知数は全部で12個あるので、 その値を決定するためにはcolor値変数(3次ベクトル)の対応関係が4個必要です。 空間におけるアフィン変換を行うには、次のような手順によります。
|
下記は、\(\small x\) 軸方向に 1/2倍、\(\small y\) 軸方向はそのまま、
\(\small z\) 軸方向には 2倍して、(2,1,0) 方向に平行移動した場合です。
具体的な対応関係は、分かりやすいように
(2,0,0)が(3,1,0)に、(0,1,0)が(2,1,0)に、(0,0,1)が(2,1,2)に、
そして(0,0,0)が(2,1,0)に移るとして計算させました。
変換後が分かりやすいように、[F]では xdraw( ) のオプションに
「red」を指定しています。
|