多面体
多面体の描画について, 四面体の場合を例にして説明する.
四面体は4つの面からなっている.
頂点をとすると4つの面は
である.
頂点のリスト[A, B, C, D]
に対しから順に番号をつけると,
各面の頂点の順番は[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=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)
面データを用いて多面体を描く.
説明
面データは例えば四面体の場合は
[[A, B, C, D], [[1, 2, 3], [1, 2, 4], [1, 3, 4], [2, 3, 4]]]
である.
4点をとっておき,
このリストを引数に与えると四面体が描かれる.
生成されるプロットデー タは
phv3d
: 頂点リストphe4d
: 辺リストphf3d
: 面リスト なおそれぞれ末尾にname
が付加される.
【例】4点を取り正四面体を描く.
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引数のname2
はVertexEdgaFace()
で与えたname
と同じものとする.
options
は全体の線種と陰線の線種をHidden=線種
で指定できる.
初期設定では陰線は表示しない.
VertexEdgeFace()
で四面体が描かれるがPhparadata()
により非表示になる.
Figureボタンで描き出せば正しく出力されるので,
Phparadata()
を実行する前に画面上に表示して確認してから
Phpardata()
を実行するなど工夫が必要.
【例】四面体を描く.
クリックで拡大
polyhedrons_obj
(クリックすればダウンロードできる)を用いて
s06
の切頂二十面体を描く.
Setdirectory()
でカレントディレクトリを作業ディレクトリと切替ながら出力する.
クリックで拡大
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
は面のプロットデータである.
クリックで拡大
Nohiddenbyfaces("1", "phe3d1", "phf3d1", ["dr, 2"], ["da"]);
とすると
座標軸は陰線処理されず, 正四面体の辺(phe3d1
)だけが陰線処理されて破線で描かれる.
四面体は太く描かれる.
同様に
Nohiddenbyfaces("1", "ax3d", "phf3d1", [], ["da"]);
とすれば, 座標軸だけが陰線処理されて破線で描かれる.