Location : Home > Languages > Perl > Package Title : Math::Vector |
![]() |
Math::Vector - ベクトル演算及び関連する処理
Wayne M. Syvinski, MS <syvinski@techcelsior.com>
Copyright 2003 Wayne M. Syvinski
本ソフトウェアは明示的にも暗示的にも無保証である、ユーザは自らのリスクで本ソフトウェアを利用すること。損失が生じたとしても Wayne M. Syvinski にも他の誰にも責任はなく、ユーザに責任がある。あなたは警告された。
本ソフトウェは以下のライセンスのうち一方の下で利用することができる。
本モジュールは Windows 2000 Professional 上の ActivePerl build 618, version 5.6.0 を用いて開発された。ユーザの Perl ライブラリのディレクトリは /Math (Wimn32 の場合は \Math)に置かれている必要がある。
本モジュール全て Perl で書かれており、将来の拡張を見越して、アークコサイン関数を使うために Math::Complex に依存している。
use Math::Vector; $v = Math::Vector->new();
TMTOWTDI(There's more than one way to do it;やりかたは1つじゃない)という精神に則り、スカラコンテキストの場合にはスカラのリストを、リストコンテキストまたは配列の場合にはスカラのリストを、メソッドに対して引数として渡すことができる。それゆえ関数プロトタイプは使用していない。本メソッドを利用する際には一般的にベクトルを3つの実数からなる配列(すなわち順序付け3値)でなければならない。
Example:
メソッド UnitVector が引数として1つのベクトルをとる。これを初期化するには以下のようにすればよい。
方法1
my ($x,$y,$z) = (1,2,3); my $uv = $v->UnitVector($x,$y,$z);
方法2
my (@vector) = (1,2,3); my $uv = $v->UnitVector(@vector);
メソッドが3つのスカラ(Perl の意味で)を引数としてとる際に4つの値を持つ配列を渡した場合、4つめの値は無視されることの留意することは重要である。言い換えればその引数はアチラの世界(Twilight Zone)に逝ってしまう。しかしながらメソッドが2つまたはそれ以上のベクトルを受け入れる場合に、そのうち1つが4次元であった場合、思いもしていなかった結果となることになる。配列として渡したものが何次元であるかを常に意識しておかねばならないことはユーザには重荷かも知れない。(配列の中で渡した値の数を確認するために array slices を使うとよい。)
PLEASE NOTE:
全ての計算は直交座標上で計算される。球座標・円柱座標または他の非直交座標系で直接計算を行う機能は提供していない。
球座標や円柱座標を用いてベクトル演算を行いたい場合には、 Math::Trig モジュールにある以下の関数を用いるとよい。(Math::Trig の POD から参照)
cartesian_to_cylindrical($rho, $theta, $z) = cartesian_to_cylindrical($x, $y, $z); cartesian_to_spherical($rho, $theta, $phi) = cartesian_to_spherical($x, $y, $z); cylindrical_to_cartesian($x, $y, $z) = cylindrical_to_cartesian($rho, $theta, $z); cylindrical_to_spherical($rho_s, $theta, $phi) = cylindrical_to_spherical($rho_c, $theta, $z);
$z が 0 でなければ $rho_s は $rho_c と等しくないことに注意。
spherical_to_cartesian($x, $y, $z) = spherical_to_cartesian($rho, $theta, $phi); spherical_to_cylindrical($rho_c, $theta, $z) = spherical_to_cylindrical($rho_s, $theta, $phi);
$z が 0 でなければ $rho_c は $rho_s と等しくないことに注意。
本パッケージは3次元ベクトルの数学的計算を支援する。垂直方向の要素の値を 0 に設定することで2次元のベクトルにも適用可能である。4次元以上のベクトルはサポートしていない。
本パッケージはユークリッド幾何や工学の分野に適用するために2次元及び3次元に限定している。繰り返すが、明示的にも暗示的にも無保証である。自らのリスクで利用すること!!!
本モジュールを使用する人は基本的なベクトル演算や三角法について知識を持っているものと想定している。そのため背景となる理論は説明しない。
Magnitude
$scalar_result = $v->Magnitude($x,$y,$z);
または
my @vec1 = ($x,$y,$z); $scalar_result = $v->Magnitude(@vec1);
数学的な意味でのスカラ・絶対値(大きさ)を返す。
ScalarMult
@vector_result = $v->ScalarMult($sc,$x,$y,$z);
または
my $sc; #数学的なスカラ my @vec1 = ($x,$y,$z); @vector_result = $v->ScalarMult($sc,@vec1);
ベクトルに数学的な意味でのスカラを乗じた結果のベクトルを返す。メソッドに渡された最初の値がベクトルに乗じるスカラと認識されることに留意すること。
DotProduct
$scalar_result = $v->DotProduct($x1,$y1,$z1,$x2,$y2,$z2);
または
my @vec1 = ($x1,$y1,$z1); my @vec2 = ($x2,$y2,$z2); $scalar_result = $v->DotProduct(@vec1,@vec2);
2つのベクトルのドット積(内積)を返す。
CrossProduct
@vector_result = $v->CrossProduct($x1,$y1,$z1,$x2,$y2,$z2);
または
my @vec1 = ($x1,$y1,$z1); my @vec2 = ($x2,$y2,$z2); @vector_result = $v->CrossProduct(@vec1,@vec2);
2つのベクトルのクロス積(外積)を返す。計算順には注意すること。(外積は可換ではない!!!)
最初のベクトルが2つめのベクトルに対して外積を計算する。
UnitVector
@vector_result = $v->UnitVector($x,$y,$z);
または
my @vec1 = ($x,$y,$z); @vector_result = $v->UnitVector(@vec1);
親ベクトルと同じ向きで大きさが1の単位ベクトルを返す。
UnitVectorPoints
@vector_result = $v->UnitVectorPoints($xA,$yA,$zA,$xA,$yA,$zA);
または
my @pointA = ($xA,$yA,$zA); my @pointB = ($xB,$yB,$zB); @vector_result = $v->UnitVectorPoints(@pointA,@pointB);
2点から定められる単位ベクトルを返す。すなわち点Aから点Bへのベクトルの向きを示す。
VecAdd
@vector_result = $v->VecAdd($x1,$y1,$z1,...$xN,$yN,$zN);
または
@vector_result = $v->VecAdd(@vec1,@vec2,...@vecN);
任意の数のベクトルの和を返す。本メソッドは任意の数のベクトルを引数に取る。しかしながら3の倍数でない数が渡された場合には、「最後の配列」は3値よりも少ない値となるため、これはユーザの意図と見なして 0 で埋めて処理する。コードではめったに起こらないが実際にある)
VecSub
@vector_result = $v->VecSub($x1,$y1,$z1,$x2,$y2,$z2);
または
my @vec1 = ($x1,$y1,$z1); my @vec2 = ($x2,$y2,$z2); @vector_result = (@vec1,@vec2);
2つのベクトルの差を返す。最初のベクトルから2番目のベクトルを引く。(@vec1 - @vec2)
InnerAngle
$scalar_result = $v->InnerAngle($x1,$y1,$z1,$x2,$y2,$z2);
または
my @vec1 = ($x1,$y1,$z1); my @vec2 = ($x2,$y2,$z2); $scalar_result = $v->InnerAngle(@vec1,@vec2);
同一平面にある2つのベクトルがなす最も小さい角を返す。角度はラジアンである。他の単位で欲しい場合には Math::Trig モジュールまたは自身で作成した関数を用いること。
InnerAnglePoints
$scalar_result = $v->InnerAnglePoints($pxA,$pyA,$pyA,$pxB,$pyB,$pzB,$pxC,$pyC,$pzC);
または
my @pointA = ($pxA,$pyA,$pzA); my @pointB = ($pxB,$pyB,$pzB); my @pointC = ($pxC,$pyC,$pzC); $scalar_result = $v->InnerAnglePoints(@pointA,@pointB,@pointC);
同一平面にある3点ABCからなる角Bを返す。
DirAngles
@array_result = $v->DirAngles($x,$y,$z);
または
my @vec = ($x,$y,$z); @array_result = $v->DirAngles(@vec);
始点における終点に対するベクトルの方向角を返す。本メソッドはラジアンで表された角度を含む配列−ベクトルではない!!−を返すことに注意すること。
PlaneUnitNormal
@vector_result = $v->PlaneUnitNormal($pxA,$pyA,$pzA,$pxB,$pyB,$pzB,$pxC,$pyC,$pzC);
または
my @pointA = ($pxA,$pyA,$pzA); my @pointB = ($pxB,$pyB,$pzB); my @pointC = ($pxC,$pyC,$pzC); @vector_result = $v->PlaneUnitNormal(@pointA,@pointB,@pointC);
空間における3点の定める平面に対する単位法線ベクトルを返す。
2つのベクトルが定める平面に対する単位法線ベクトルを取得するには以下のコードを実行する。
@vector_result = $v->UnitVector($v->CrossProduct(@vec1,@vec2));
TriAreaPoints
$scalar_result = $v->TriAreaPoints($pxA,$pyA,$pzA,$pxB,$pyB,$pzB,$pxC,$pyC,$pzC);
または
my @pointA = ($pxA,$pyA,$pzA); my @pointB = ($pxB,$pyB,$pzB); my @pointC = ($pxC,$pyC,$pzC); $scalar_result = $v->TriAreaPoints(@pointA,@pointB,@pointC);
3点の定める三角形の面積を返す。
TriAreaLengths
$scalar_result = $v->TriAreaLengths($lengthA,$lengthB,$lengthC);
または
my @generic_array = ($lengthA,$lengthB,$lengthC); $scalar_result = $v->TriAreaLengths(@generic_array);
3辺の長さを用いて定められる三角形の面積を返す。
TripleProduct
$scalar_result = $v->TripleProduct($x1,$y1,$z1,$x2,$y2,$z2,$x3,$y3,$z3);
または
my @vec1 = ($x1,$y1,$z1); my @vec2 = ($x2,$y2,$z2); my @vec3 = ($x3,$y3,$z3); $scalar_result = $v->TripleProduct(@vec1,@vec2,@vec3);
3つのベクトルの3重積を返す。これは以下の行列式で定義される。
|$x1 $y1 $z1| |$x2 $y2 $z2| |$x3 $y3 $z3|
IJK
$string = $v->IJK($i,$j,$k);
または
my @vec = ($i,$j,$k); $string = $v->IJK(@vec);
ベクトルの配列またはリストコンテキスト表現を、 'ai+bj+ck' という形式に変換する。
Example:my @vec = (2,-5,6); my $vecstring = $v->IJK(@vec);
メソッド IJK は スカラ変数 $vecstring に '2i-5j+6k' として返す。
OrdTrip
$string = $v->OrdTrip($i,$j,$k);
または
my @vec = ($i,$j,$k); $string = $v->OrdTrip(@vec);
ベクトルの配列またはリストコンテキスト表現を、 '<i,j,k>' という形式(順序対)に変換する。
Example:my @vec = (2,-5,6); my $vecstring = $v->OrdTrip(@vec);
メソッド OrdTrip は スカラ変数 $vecstring に '<2,-5,6>' として返す。
STV ("String To Vector")
@vector_result = $v->STV('2i-5j+6k');
または
@vector_result = $v->STV('<2,-5,6>');
ijk または順序対の文字列として表現されたベクトルを配列表現に変換する。引数はスカラ変数または文字れるリテラルである。
Equil
@vector_result = $v->Equil($s1,$x1,$y1,$z1,...$sN,$xN,$yN,$zN);
または
my ($s1,...$sN); my ($x1,$y1,$z1,...$xN,$yN,$zN); my (@vec1,...@vecN); @vec1 = ($x1,$y1,$z1); . . . @vecN = ($xN,$yN,$zN); @vector_result = $v->Equil($s1,@vec1,...$sN,@vecN);
ベクトルのグループに対し、力学平衡に達するのに必要なベクトルを返す。本関数は任意の数の引数をとるが、4つを順に1つのグループとして受け取る。順にスカラ乗数・x-座標・y-座標・z-座標とみなす。
Example:1つめのベクトルを 3i+4j-7k に沿って 1000 N 、2つめのベクトルを -5i-7j+k に沿って 1300 N とし、方向ベクトルによる大きさに関する情報はないものとする。このとき力学平衡をもたらすベクトルを求めよ。@vector_result = $v->Equil(1000,3,4,-7,1300,-5,-7,1);解はおおよそ (401.8i + 585.8j + 663.6k) N または 972.1(0.413i + 0.602j + 0.683k) N である。
[END OF EXAMPLE]
メソッドは最初に所与のベクトルの単位ベクトルを計算し、次にスカラ倍する。
ベクトルからは大きさに関する情報は得られないことに注意すること。
大きさを表す情報を使いたくてスカラ乗数とベクトルの組があるなら以下のように書かねばならない。
@vector_result = $v->Equil($s*$v->Magnitude(@vec),@vec); @vector_result = $v->Equil(1,$v->ScalarMult($s,@vec)); #こちらを勧めるが YMMV(場合によりけり;your mileage may vary)だ。
結果として大きさと単位ベクトルがほしければ、 $v->Magnitude() 及び $v->UnitVector() と2段階を経なければならない。
ベクトル群が既に均衡に達している場合にはこの関数を使うか否か決定しなければならない。零ベクトルが返されるか否かを確認するだけでよい。
![]() |
Updated : 2007/02/02 |