vector オブジェクト

vector オブジェクトは表示できるオブジェクトではありません。しかし 3D 表示計算を支援する強力な道具になります。vector オブジェクトは物理や工学で使われるベクトルと良く似ています。Numeric のarray と一緒に使われます。(Numeric は Python に追加されます。数値配列に最適化されています。高速に計算できるモジュールです。 Visual によって自動的に import されます。)(訳注 vector と Numeric.array とは別物です。vector は visual\cvisual.dll 内部で定義されています。三次元に特化したベクトルとして作られています。)

vector(x,y,z)

上の式は引数要素の組からなる vector オブジェクトを返します。vector 要素は浮動小数点です。( 3 の整数引数が与えられても 3.0 に変換します)

vector オブジェクトは互いに加減算可能です。普通の数を掛けることもできます。下に例を示します。

v1 = vector(1,2,3)

v2 = vector(10,20,30)

print v1+v2 # displays (11 22 33)

print 2*v1 # displays (2 4 6)

vector オブジェクトの個別要素を読み書きできます。

v2.x is 10, v2.y is 20, v2.z is 30

vector オブジェクトから vector オブジェクトを作ることもできます。 vector(v2) もやはり vector(10,20,30)の python 式によって作られる vector オブジェクトになります。

vector(10,12)vector(10,12,0)の短縮形です。

vector オブジェクトは Python のシーケンスです。ですから v2.xv2[0] と、また v2.yv2[1] と、また v2.zv2[2] と同じです。

mag( vector ) # vector の長さを返します。数学での norm です。

mag(vector(1,1,1)) # sqrt(3) を返します

mag2(vector(1,1,1)) # 3 を返します。mag の二乗の値です。

You can also obtain the magnitude in the form v2.mag. and the square of the magnitude as v2.mag2.

vector オブジェクトの長さを v2.mag でも求められます。長さの二乗を v2.mag2 でも求められます。

vector オブジェクトは、長さの値 または 長さの二乗値で再設定できます

v2.mag = 5 # v2 を長さ 5 の vector オブジェクトに再設定します。<1.33631, 2.67261, 4.00892> にします。

v2.mag2 = 2.7 # v2 を二乗長さ 2.7 の vector オブジェクトに再設定します。<0.439155, 0.87831, 1.31747> にします。

norm() によって長さ 1 の vector オブジェクトにできます。すなわち正規化:normalize できます。

norm( vector ) # vector オブジェクトから長さ 1 の vector オブジェクトを生成して返します。

norm(vector(1,1,1)) # vector(1,1,1)/sqrt(3) オブジェクトを返します

v1.norm() と書くこともできます。 norm(v1) = v1/mag(v1)であり、ゼロ長さの vecotor オブジェクトを正規化することはできません norm(vector(0,0,0)) は 0 での割り算が入り込むのでエラーになります。

vector1.diff_angle(vector2)

上の式は二つの vector オブジェクト vector1 と vector2 の二つの間にできる角度をラディアンの単位で返します。

cross( vector1, vector2 )

上の式は二つの vector オブジェクト vector1 と vector2 の二つから定まる外積 vector オブジェクトを返します。外積は二つのベクトルより定まる平面に垂直です。その方向は右手の法則で定まります。右手の人差し指が vector1 の方向を、中指が vector2 の方向を向いているとき、親指の向きが外積ベクトルの向きです。外積ベクトルの長さは、vector1 と vector2 の長さを掛けたものに、さらに二つのベクトルの間の角度の sin を掛けた値となります。

dot( vector1, vector2 )

上の式は二つの vector オブジェクト vector1 と vector2 の二つから定まる内積値を返します。内積値の大きさは、vector1 と vector2 の長さを掛けたものに、さらに二つのベクトルの間の角度の cos を掛けた値となります。

 

vector オブジェクトの回転

v2 = rotate(v1, angle=theta, axis=(1,1,1))

  # 訳注 (1,1,1) は例としてのタプル値です。引数デフォルト値ではありません。

axis 引数のデフォルト値は (0,0,1) です。 z 軸を中心に xy 平面内で回転させることを意味します。vector オブジェクトを回転させる原点は指定しません。Visual オブジェクトに属する rotate(.) 関数を呼び出す形式でも記述できます。object.rotate() の形式です。(dot, cross 関数についても vector オブジェクトに属する関数として呼び出せます。訳注:rotate(.) 程に有効には見えませんけれど。)
# 訳注 object.rotate() 形式で記述するときは、angle 引数は明示的に引数変数名を付けねばなりません。object.rotate(v1,pi/3) と書いても objct.rotate(v1,0) の意味になってしまいます。object.rotate(v1,angle = pi/3) と書かねばなりません。

 

便利な変換

便利なことに Visual は Visual オブジェクトを生成するとき、 (a,v,c) を自動的に浮動小数点値の vector(a,b,c) に変換してくれます。しかし (a,b,c) を直接ベクトル計算に使うとエラーになります。(a,b,c) は vector オブジェクトではないからです(訳注:(a,b,c) は Python のタプル型変数値です)。代わりに vector(a,b,c) と記述します。

vector オブジェクト vec1tuple(vec1) と記述することで Python のタプル変数 (a,b,c) に変換できます。より高速に処理させるために vec1.as_tuple() と記述することもできます。