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」と記入します。同様に、他の面や陵にも対応する条件を記入します。プロパティダイアログでオブジェクトを複数選択すると、まとめて記入できて楽です。
下のように隠れている面や陵は表示せずに、正四面体が表示されます。角度のスライダーを動かすと回転します。このような隠面処理は、凸多面体であれば同様に可能ですが、そうでない立体の場合は別の手段が必要で、一般には難しそうです。