G01 正四面体

将来、GeoGebraは3次元の図形を扱えるそうですが (2009年7月に、現在作業中と言っていました)、ここでは、今ある機能のみで実現してみます。途中までは汎用のツールを作成し、後半ではそれらを用いた例として正四面体を作図します (このページ下部の添付ファイル参照)。

3次元の座標を回転するツール (Rot) の作成

3次元空間の点は {p,q,r} のようにリストで表すことにし、回転角と3次元の点を与えると、回転した3次元の点を返すツールを作成します。

まず、自由な角度 α, β を作成し、次に、入力バーに以下を入力します。

L = {1,2,3}

p = Element[L,1]

q = Element[L,2]

r = Element[L,3]

Rot1 = { {cos(α), -sin(α), 0}, {sin(α), cos(α), 0}, {0, 0, 1} }

Rot2 = { {1, 0, 0}, {0, cos(β), -sin(β)}, {0, sin(β), cos(β)} }

L1 = Transpose[ Rot2 Rot1 Transpose[{L}] ]

L2 = Element[L1, 1]

ここで、出力オブジェクト L2、入力オブジェクト α、β、L でツール Rot を作成します。以下ではこのことを簡単に、

新規ツール: L2 = Rot[α,β, L]

と表すことにします。

2次元に射影するツール (Proj) の作成

3次元の点と回転角を与えると、回転してから2次元に射影して点を返すツールを作成します。

Frame = {(0,0), (cos(7pi/6),sin(7pi/6)), (cos(11pi/6),sin(11pi/6)), (0,1)}

A = Element[Frame,1]

B = Element[Frame,2]

C = Element[Frame,3]

D = Element[Frame,4]

L3 = Transpose[{ {x(B),x(C),x(D)},{y(B),y(C),y(D)} } Transpose[L1]]

P = (Element[Element[L3,1],1], Element[Element[L3,1],2])

新規ツール: P = Proj[α,β,Frame, L]

3次元の基本単位ベクトルを、原点から見て120度間隔になるように2次元に射影しています。つまり、視点は (1,1,1) 方向に固定しています。

面の向きを求めるツール (Orientation) の作成

3次元の3点を与えると、それらを頂点とする三角形の法線ベクトルと、視線方向のベクトル (1,1,1) の内積を求めるツールを作成します。結果が正ならばその面はこちらに向いています。

M = {2,3,5}

N = {3,1,4}

o = Determinant[{ {1,1,1}, M - L, N - L }]

新規ツール: o = Orientation[L,M,N]

ここまでが汎用のツールの作成です。

正四面体の作図

以上のツールを用いて正四面体を作図してみます。まず4頂点の3次元の座標を定めます。

E_1 = {1,0,0}

E_2 = {cos(2pi/3), sin(2pi/3), 0}

E_3 = {cos(4pi/3), sin(4pi/3), 0}

E_4 = {0,0,sqrt(10)/2}

次に、回転による像を定めます。

F_1 = Rot[α, β, E_1]

F_2 = Rot[α, β, E_2]

F_3 = Rot[α, β, E_3]

F_4 = Rot[α, β, E_4]

次に、2次元への射影を定めます。ここで4点がグラフィックスビューに現れます。

G_1 = Proj[α, β, Frame, E_1]

G_2 = Proj[α, β, Frame, E_2]

G_3 = Proj[α, β, Frame, E_3]

G_4 = Proj[α, β, Frame, E_4]

面を作成します。

H_1 = Polygon[G_2, G_3, G_4]

H_2 = Polygon[G_1, G_3, G_4]

H_3 = Polygon[G_1, G_2, G_4]

H_4 = Polygon[G_1, G_2, G_3]

これだけでも十分かも知れませんが、陰線・隠面処理のため、面の向きを求めます。三角形の頂点を指定するの順序が、多面体を外側から見たときに反時計回りになるようにします。

o_1 = Orientation[F_2, F_3, F_4]

o_2 = Orientation[F_1, F_4, F_3]

o_3 = Orientation[F_1, F_2, F_4]

o_4 = Orientation[F_1, F_3, F_2]

面 H_1 のプロパティダイアログの上級タブの「オブジェクト表示の条件」欄に「o_1>0」と記入します。同様に、他の面や陵にも対応する条件を記入します。プロパティダイアログでオブジェクトを複数選択すると、まとめて記入できて楽です。

下のように隠れている面や陵は表示せずに、正四面体が表示されます。角度のスライダーを動かすと回転します。このような隠面処理は、凸多面体であれば同様に可能ですが、そうでない立体の場合は別の手段が必要で、一般には難しそうです。