D 球面

この節では,球面に関するいろいろな図を描きます。

多面体に内接・外接する球面

正四面体に内接する球面

正多面体を描く rpolyhedron() では,外接球の半径で大きさを指定します。そこから計算すると,内接球の半径が1のとき,外接球の半径は3になりますので(計算してください),次のスクリプトで描くことができます。

drawsphere([0,0,0],1);

rpolyhedron(4,3,["size=2","Hide=1"]);

正四面体に外接する球面

rpolyhedron() では,外接球の半径で大きさを指定するわけですから,同じ半径で書けばよいですね。ただし,球面を薄くしないと中が見えません。optionで透明度を設定します。また,中に入っている正四面体を先に描き,面を塗っておきます。

rfillpolyhedron(4,2,[[olivegreen,limegreen],"size=2","Hide=1"]);

drawsphere([0,0,0],2,["Alpha=[0.2,0.1]"]);

立方体に内接・外接する球面

正四面体と同じ要領で描きます。2つの図を並べて書くために,Trans オプションで平行移動しましょう。

drawsphere([0,-2,0],1);

rpolyhedron(6,2,[olivegreen,"size=2","Hide=1","Trans=[0,-2,0]"]);

rfillpolyhedron(6,2,[olivegreen,"size=2","Hide=1","Trans=[0,2,0]"]);

drawsphere([0,2,0],2,["Alpha=[0.2,0.1]"]);

立体射影

中心 (0,0,1) 半径1の球面の北極 (0,0,2)に光源があり,球面上の点Pの影をxy平面上に落とします。

Pの座標が (x,y,z) のとき,影Qの座標は (2x/(2-z),2y/(2-z),0) となります。(計算してください)

点Pの座標は,媒介変数 u ,v を用いて

x=cosucosv

y=cosusinv

z=sinu+1

で表すことができます。

ひとまず,uを固定して,vを円形スライダで取得できるようにすれば,インタラクティブに点Pを球面上で動かすことができます。

作図ツールで適当なところに円を描き,円周上に点をとります。この点Bが表す角度は B.angle で取得できます。

さらに,3つの点を作図し,インスペクタでN,P,Qと名前を変え,P,Qは線分で結んでおきます。実際のN,P,Qの位置は,map3d() を使って空間内に置きます。スクリプトは次のようになります。

setaxis3d([-8,8],[-4,4],[-2,3]);

grid();

N.xy=map3d([0,0,2]);

drawsphere([0,0,1],1);

u=1/2;

v=B.angle;

circle3d([0,0,u+1],[0,0,1],sqrt(1-u^2),[Red,"size=2"]);

x=cos(u)*cos(v);

y=cos(u)*sin(v);

z=sin(u)+1;

P.xy=map3d([x,y,z]);

Q.xy=map3d([2*x/(2-z),2*y/(2-z),0]);

点Bをドラッグすれば点P,Qが動きます。

ただし,球面の描画に時間がかかるため,どうしても動作が遅くなります。drawsphere([0,0,1],1); を

quasisphere([0,0,1],1);

に変えると,経緯線,シェーディングのない疑似球になり,動作は改善されますが,見た目がどうでしょうか。

上の図では,インスペクタで点Qの足跡を表示し,作図ツールのアニメーションで,点Bを指定しています。

画面左下のコントローラでプレイボタンを押すと,点P,Qがゆっくり動いていきます。