Location : Home > Languages > Perl > Package
Title : Math::Polyhedra
Toolbox Logo

名称

 Math::Polyhedra - 多面体の頂点・端・面の回転


概要

use Math::Polyhedra qw(polyhedron vertices edges faces tris);

my $hedron = polyhedron('rhombic dodecahedron');
my $vertices = vertices($hedron);
my $edges = edges($hedron);
my $faces = faces($hedron);
my $tris = tris($hedron);

概要

 本モジュールはよく用いられる多面体のライブラリの座標を計算し構築する。これらの幾何図形は名前または辺の数により選択される。データの中心部分は多面体を定義する62個の座標の集合である。各頂点は黄金比(約 1.618)として知られる phi の倍数及びべき乗で計測される点の集合で定義される。
 本パッケージは Robert W. Gray: http://www.rwgrayprojects.com/Lynn/Coordinates/coord01.html によって提供された参照ページによりインスピレーションを受けた。他のサイトは黄金比及び多面体に関するものである。


関数

phi()

 ギリシャ文字 φ (phi)で参照される黄金比で、以下の式で定義される。

               ____
         1 + \/ 5
phi  =  ------------  =  (1 + sqrt(5)) / 2
             2

 この関数は数値を返すのみで、その値はおおよそ 1.61803398874989 である。この数はπ(pi)のように興味深い属性を持っており、自然にも人工にも現れる。

coordinates()

 座標ベクトルの主集合を含むリスト参照を返す。
 これらの座標の全てまたは大半は phiの値から計算される。
 引数がなければ、点は本関数が最初に呼び出された点に配置され、計算される。引数無しで連続して呼び出された場合にはそれぞれ同じリスト参照を返す。各ベクトルは [ $x, $y, $z ] のようなリスト参照である。
 引数が指定されれば本関数は新しいリスト参照を計算する。本関数は少しのメモリと時間を消費するだけであるが、リストを修正してしまし将来に呼び出しをできないようにするアルゴリズムもある。
 最初の引数がコード参照であれば、そのコードはベクトルごとに引数として呼び出される。それからコードの結果は他の関数で利用されるマスタ集合の元のベクトルを置換する。これは以下のような他の数学パッケージなどでベクトルを変換する際に用いられる。

use Math::Polyhedra;
use Math::VectorReal;

my $coords = coordinates( sub { vector(@{$_[0]}) } );

 上記コードの後、本モジュールの関数により返されるベクトルは Math::VectorReal オブジェクトインスタンスへの参照である。ベクトルライブラリについても同様に稼動する。ベクトル変換を行うコード参照が与えられるのでベクトルモジュールの選択は任意である。

polyhedra(), polyhedron()

 名前または面の数により多面体構造への参照を取得する。所与の多面体図形の頂点・辺・面の情報を定義する変更不可の構造である。
 引数は数値か名前でなければならない。例えば, polyhedron(6) 及び polyhedron('cube')、polyhedron('rhombic hexahedron') は全て等値な、正方形の面を6つもつ6面体を取得するメソッドである。

my $cube = polyhedron(6); # 通常の6面体
my $ico = polyhedron(20); # 20面体は20面の三角形の面を持つ
my $rhombdod = polyhedron($_ = 'rhombic dodecahedron');

print 'Found ', scalar @$ico, ' variations of ', $_, $/;

 参照内部での値は各連続呼び出し時に再計算されないように修正されるべきではない。スカラ参照が vertices(), edges(), faces(), tris() 関数への引数として与えられることを想定している。
 以下の名前と面数が利用可能である。

 他の10面体(the decahedron;菱形10面による図形)のような図形は phi の値だけを用いては構成されないため、本モジュールでは現在はサポートしていない。120面体('hexicosahedron')と言う名称も120の規則的な面から構成されているわけではないので、正しいとはいえない。しかし他の立体の結合で構成されている。
 所与の多面体構造には複数の構造のバリエーションがあることが知られている。例えば62この phi 点のライブラリで定義される10の異なる「4面体」が存在している。所与の構造に対する式(スカラの @$hedron)は定義されたバリエーションの数を返し、($hedron->[3]) は他の関数のために特定のバリエーションを選択する。これらは形状の上では異なっていないが元のものと相対的な向きが異なる。ほとんどのアプリケーションではこの情報は不要だが、黄金比の検討にはこれらのバリエーションから選択する必要がある。
 polyhedra() 関数は参照名 polyhedron() のエイリアスである。

vertices()

my $verts = vertices($cube);
while (@$verts){
   draw_dot(shift @$verts);
}

 多面体の各頂点を示すベクトルを含むリスト参照を返す。各頂点は [ $x, $y, $z ] のような座標の組のリスト参照である。

edges()

my $edges = edges($cube);
while (@$edges){
   move_to(shift @$edges);
   draw_to(shift @$edges);
}

 多面体の各辺を定義する2つのベクトルを含むリスト参照を返す。各対は独立した辺である。.最初の辺はベクトル 0 及び 1 であり、次は 2 と 3 と、以下同様である。(これは最適化された行帯ではない) ベクトルは必要に応じて繰り返し参照される。

faces()

 各面を定める同一平面上にある少なくとも3つのベクトルのリストを含むリスト参照を返す。各リストは独立した面である。ベクトルは必要に応じて繰り返し参照される。
 各面の頂点は面を回るように順番化されていない。典型的にはグラフィックプログラムは順序情報には edges() または tris() を使う。

tris()

my $tris = tris($cube);
while (@$tris)
   {first_vertex(shift @$tris);
    second_vertex(shift @$tris),
    third_vertex(shift @$tris);
   }

 リストにおける各三角形の座標を示す3つの組 [ X, Y, Z ] を含むリスト参照を返す。各組は独立した三角形で、1つめの三角形はベクトル 0, 1, 2 の間にあり、他の三角形はベクトル 3, 4, 5 の間にある。(これは最適化された三角帯ではない)ベクトルは必要に応じて繰り返し参照される。
 返される全ての三角形は時計回りに定義される。(B-A)x(C-A) は外向きである。 多くのグラフィックアプリケーションは外側に向いた法線を定義してそれに矛盾がないようにしている。


use Math::Polyhedra qw(polyhedron vertices edges faces);

# 図形を取得
my $hedron = polyhedron($_ = 'cube');
my $verts = vertices($hedron);
my $edges = edges($hedron);
my $faces = faces($hedron);

# オイラーの公式を確認
$verts = (scalar @$verts);
$edges = (scalar @$edges) / 2; # 各辺は2つの面に共有される
$faces = (scalar @$faces);
print "$_ has $verts vertices, $edges edges, and $faces faces.\n";

my $Euler = $verts - $edges + $faces;
my $is = $Euler==2? "is" : "is not";
print "V - E + F = $Euler so the $_ $is simple.\n";

将来の仕事

 現在のモジュールは黄金比または phi で定義できる有名な多面体しか扱っていない。将来は10面体など phi で表せない多面体や様々なモザイク形態、プリズムの集合などを扱えるようにしたい。
 faces() ルーチンは各面に対して返された頂点の固有の順番を導出すべきである。いくつかのグラフィックライブラリでは暗黙の規範に矛盾がないように部分三角形に再分割することができる。
 各面に対して1つのベクトルを normals() では返す。いくつかのグラフィックライブラリでは暗黙の規範で稼動することを拒否した、必要な値を予め計算する場合に必要となる。


著者

 Ed Halley, <ed@halley.cc>


著作権とライセンス

 Copyright 1998-2003 by Ed Halley

 本ライブラリはフリーソフトウェアであり、Perl 本体と同等の条件で修正/再配布してもよい。

Toolbox Logo
Updated : 2007/10/01