Skip to main content

多面体

多面体の描画について, 四面体の場合を例にして説明する.

四面体は4つの面からなっている. 頂点をA,B,C,D\mathrm{A, B, C, D}とすると4つの面は ABC,ABD,ACD,BCD\triangle\mathrm{ABC}, \triangle\mathrm{ABD}, \triangle\mathrm{ACD}, \triangle\mathrm{BCD} である. 頂点のリスト[A, B, C, D]に対しA\mathrm{A}から順に番号をつけると, 各面の頂点の順番は[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]と表現できる.

頂点のリストとこの面リストを組みにして[[A, B, C, D], [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]] としたものを「面データ」という. この面データを使って多面体を描画するのがVertexEdgeFace()である.

多面体の陰線処理は2通りある. ひとつは, 多面体を線画と考えて隠れる部分だけを処理する方法でSkeletonparadata()を用いる. もうひとつは, 面と考えて面に隠れる部分を点線で描いたり, 非表示にしたりする方法でPhparadata()を用いる.

Concatobj(list, option)

いくつかのobjデータを結合する.

説明

多面体の各面の頂点リストから面データ(頂点リストと面リスト)を作る. 例えば

Concatobj([[A, B, C], [A, B, D], [A, C, D], [B, C, D]]);

とすると面データ[[A, B, C, D], [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]] が返される

【例】4点A,B,C,D\mathrm{A, B, C, D}を幾何点として作り, これを頂点とする四面体を描く.

Displayed

クリックで拡大

幾何点を作らないで四面体を描くのであれば, 以下のようにしても良い.

a=2*[-1, -1/sqrt(3), 0];
b=2*[1, -1/sqrt(3), 0];
c=2*[0, sqrt(3)-1/sqrt(3), 0];
d=2*[0, 0, sqrt(3)];
phd=Concatobj([[a, b, c], [a, b, d], [a, c, d], [b, c, d]]);

四面体のような凸型多角形の場合はCindyScriptのconvexhull3d()関数を用いて 次のようにすることができる. 面リストではなく頂点リストを与えるだけなので手間を省くことができる.

a=2*[0, 0, sqrt(3)];
b=2*[1, -1/sqrt(3), 0];
c=2*[0, sqrt(3)-1/sqrt(3), 0];
d=2*[-1, -1/sqrt(3), 0];
phd=convexhull3d([a, b, c, d]);

VertexEdgeFace(name, surface_data, options)

面データを用いて多面体を描く.

説明

面データは例えば四面体ABCD\mathrm{ABCD}の場合は [[A, B, C, D], [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]] である. 4点A,B,C,D\mathrm{A, B, C, D}をとっておき, このリストを引数に与えると四面体が描かれる. 生成されるプロットデータは

  • phv3d: 頂点リスト
  • phe4d: 辺リスト
  • phf3d: 面リスト なおそれぞれ末尾にnameが付加される.

【例】4点A,B,C,D\mathrm{A, B, C, D}を取り正四面体ABCD\mathrm{ABCD}を描く.

Putpoint3d("A", 2*[-1, -1/sqrt(3), 0]);
Putpoint3d("B", 2*[1, -1/sqrt(3), 0]);
Putpoint3d("C", 2*[0, sqrt(3)-1/sqrt(3), 0]);
Putpoint3d("D", 2*[0, 0, sqrt(3)]);
phd=[[A, B, C, D], [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]];
VertexEdgeFace("1", phd);

面リストはCongatobj()を使って作る事ができる(陰線処理して描く場合も使える).

Phparadata(name, name2, options)

多面体を陰線処理して描く.

説明

多面体のプロットデータをVertexEdgaFace()で作る. このプロットデータに対し隠れている面(辺)を陰線処理して表示する. 第1引数は通常のname, 第2引数のname2VertexEdgaFace()で与えたnameと同じものとする.

optionsは全体の線種と陰線の線種をHidden=線種で指定できる. 初期設定では陰線は表示しない.

注意

VertexEdgeFace()で四面体が描かれるがPhparadata()により非表示になる. Figureボタンで描き出せば正しく出力されるので, Phparadata()を実行する前に画面上に表示して確認してから Phpardata()を実行するなど工夫が必要.

【例】四面体を描く.

Displayed

クリックで拡大

polyhedrons_obj (クリックすればダウンロードできる)を用いて s06の切頂二十面体を描く. Setdirectory()でカレントディレクトリを作業ディレクトリと切替ながら出力する.

Displayed

クリックで拡大

Nohiddenbyfaces(name, PD1, PD2, option1, option2)

面に対し曲線を陰線処理する.

説明

PD2で与えられた面に対し曲線PD1の面に隠れている部分を陰線処理する. 引数PD1を省略すると全ての曲線が対象となる. 陰線処理された線は初期設定では点線で表される. この線種はoption2で変更できる. 例えば["da"]とすると破線になる. ["nodsip"]とすると陰線は表示されない.

option1は曲線全体のoptionであるのでoption2では"Eps="で陰線処理時の許容限界を設定できる. 陰線処理がうまくいかないときは, この値をEps=10^(-4)のように変えてみるとよい. 初期設定はEps=10^(-2).

【例】座標平面状に正四面体を描き, 各軸と正四面体の辺を陰線処理する. VertexEdgeFace("1", phd)によって辺, 頂点, 面のプロットデータが作られる. phf3d1は面のプロットデータである.

Displayed

クリックで拡大

Nohiddenbyfaces("1", "phe3d1", "phf3d1", ["dr, 2"], ["da"]);

とすると 座標軸は陰線処理されず, 正四面体の辺(phe3d1)だけが陰線処理されて破線で描かれる. 四面体は太く描かれる.

同様に

Nohiddenbyfaces("1", "ax3d", "phf3d1", [], ["da"]);

とすれば, 座標軸だけが陰線処理されて破線で描かれる.