角錐・角錐台・角柱
(1) frustum() 関数
frustum(name, n,上面の大きさ,底面の大きさ,高さ,オプション)
底面が正n角形の角錐、角錐台を描きます。面はオプションで指定した色で塗ります。上面と底面が同じ大きさなら直方体になります。上面,底面の大きさは,外接する円の半径を表します。
frustum(4,0,2,3,["Color=green"]);
で四角錐ができます。左が画面、右がTeXの図です。
稜線を描くには,戻り値を用います。戻り値は面データなので,VertexEdgeFace() で稜線が描けます。
さらに,Nohiddenbyfaces() で陰線処理ができます。次の図では座標軸は非表示にしています。
fd=frustum("1",4,0,2,3,["Color=green"]);
VertexEdgeFace("1",fd);
Nohiddenbyfaces("1","phe3d1","phf3d1",["dr,2"],["do"]);
上面の大きさが0でなければ角錐台になります。
たとえば
fd=frustum("1",5,1,2,3,["Color=yellow"]);
VertexEdgeFace("1",fd);
Nohiddenbyfaces("1","phe3d1","phf3d1",["dr,2"],["do"]);
で五角錐を黄色で描きます。
nodisp オプションをつければ,稜線だけが描かれます。
fd=frustum("1",5,1,2,3,["nodisp"]);
VertexEdgeFace("1",fd);
Nohiddenbyfaces("1","phe3d1","phf3d1",["dr,2"],["do"]);
次に,三角柱と、それに内接する球面を描いてみましょう。
三角柱のすべての面に接するようにするには、ちょっと計算が必要です。
三角柱の大きさから決めるか、球の半径から決めるかですが、ここで使っている関数では、上面と底面の大きさを、外接円の半径で指定しているので、球の半径から決める方が計算しやすいでしょう。
球の半径を1とすれば、三角柱の底面はこれに外接しますが、その正三角形の外接円の半径は2になります。正三角形では、内心、外心、重心が一致することを利用すれば簡単に計算できます。
そこで、スクリプトは次のようになります。
fd=frustum("1",3,2,2,2,["nodisp"]);
VertexEdgeFace("1",fd);
Nohiddenbyfaces("1","phe3d1","phf3d1",["dr,2","Color=blue"],["do"]);
drawsphere("1",[0,0,1],1,["Color=cyan"]);
(2) convexhedron() 関数
底面が正多角形でない場合の角錐・角錐台を描きます。この場合は、底面の各頂点の座標をリストにしてconvexhedron() 関数(凸型多面体を描く)で描きます。
上底と下底を長方形にして平行に少しずらすと平行六面体ができます。
pd=[[-1,1,1],[1,1,1],[1,4,1],[-1,4,1],[0,0,0],[2,0,0],[2,3,0],[0,3,0]];
fd=convexhedron("1",pd,["nodisp"]);
VertexEdgeFace("1",fd);
Nohiddenbyfaces("1","phe3d1","phf3d1",["dr,2","Color=blue"],["do"]);
平行六面体は、空間ベクトルの和を示すのによく使われます。
ベクトル記号の表示位置は、座標軸と方眼を表示して決めます。
pd=[[-1,1,1],[1,1,1],[1,4,1],[-1,4,1],[0,0,0],[2,0,0],[2,3,0],[0,3,0]];
fd=convexhedron("1",pd,["nodisp"]);
VertexEdgeFace("1",fd);
Nohiddenbyfaces("1","phe3d1","phf3d1",["dr,2"],["do"]);
arrow3d("1",[[2,0,0],[-1,4,1]],[2,1,1,"dr,2","Color=red"]);
arrow3d("2",[[2,0,0],[1,1,1]],["dr,2"]);
arrow3d("3",[[2,0,0],[2,3,0]],["dr,2"]);
arrow3d("4",[[2,0,0],[0,0,0]],["dr,2"]);
Expr([[-0.6,0.6],"s2","\vec{a}",[0.6,-1],"s2","\vec{b}",[-0.1,-0.2],"e2","\vec{c}",[4,1],"n","\vec{a}+\vec{b}+\vec{c}"]);
次に、高校数学の図形の計量でよくある問題の図を描きます。
問題は
AB=8,AC=7,A=120° である三角形を底面とする三角柱に球が内接している。この球の半径を求めよ。
ここで、三角柱に「内接」しているとは、5つの面のすべてと接しているということです。
まず、三角柱を描きます。
問題図の長さは結構大きいので、長さを半分にしましょう。
drawsphere("1",[-1,sqrt(3),sqrt(3)]/2,sqrt(3)/2,["Color=skyblue"]);
pd=[[0,0,0],[4,4*sqrt(3),0],[-7,0,0],[0,0,2*sqrt(3)],[4,4*sqrt(3),2*sqrt(3)],[-7,0,2*sqrt(3)]]/2;
fd=convexhedron("1",pd,["Color=blue","nodisp"]);
VertexEdgeFace("1",fd);
Nohiddenbyfaces("1","phe3d1","phf3d1",["dr,2"],["do"]);
Letter([[0,-0.2],"s","A",[2.5,1.5],"s2","B",[-3.5,0],"s","C"]);
適当な位置に回転してTeXに書き出します。
これに、辺の長さと角の大きさを書き入れます。
それには、Bowdata()とAnglemark() を使います。
次のスクリプトを追加します。
pta=map2d([0,0,0]);
ptb=map2d([2,2*sqrt(3),0]);
ptc=map2d([-7/2,0,0]);
Bowdata("1",[pta,ptb],["Expr=8"]);
Bowdata("2",[ptc,pta],["Expr=7"]);
Anglemark("1",[ptb,pta,ptc]);
Letter([pta,"nw4","120°"]);
< 戻る >