「API/Vector」の編集履歴(バックアップ)一覧はこちら
「API/Vector」(2014/01/23 (木) 22:54:12) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
このページではVector APIについて解説する。
参考資料:
-[[Vector API>http://computercraft.info/wiki/index.php?title=Vector_%28API%29]]
執筆時のバージョン:
-ComputerCraft 1.58 for Minecraft 1.6.4
----
#contents
----
*Vector API
[[ベクトル>http://ja.wikipedia.org/wiki/%E7%A9%BA%E9%96%93%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB]]に関するAPI。
3次元のベクトルを表す値を作成し、それを操作することができる。GPSで3次元の位置を計算する時にも使われている。
作成したベクトルを操作する各メソッドへのアクセスは&b(){:}(コロン)を用いて行う。また、一部の算術演算子でも操作することができる。
Luaのテーブルやメタテーブルを用いてオブジェクト指向のクラスに似た機構として実装されている。ソースは是非とも一読の事。
assets\computercraft\lua\rom\apis\vector で定義
**new
-vector.new( &i(){x}, &i(){y}, &i(){z} )
-成分&i(){x}(数値)、&i(){y}(数値)、&i(){z}(数値)のベクトルを表す値を作成して返す。引数を省略した(nil)成分は0になる
-戻り値:テーブル型。ベクトル
戻り値はテーブル型であるため、戻り値から各成分(x、y、z)やメソッドへアクセスできる。
例:
local a = vector.new( 1, 2, 3 )
print( a.x )
print( a.y )
print( a.z )
数値 1, 2, 3 を成分としたベクトルを作成して変数aに代入し、各成分を表示する。
画面には以下のように表示される。
1
2
3
*ベクトル
vector.new関数で取得したベクトルのメソッドを用いてベクトル操作を行う。
ベクトルの各成分(x、y、z)へのアクセスは&b(){.}、各メソッドへのアクセスは&b(){:}を用いて行う。
ペクトル(テーブル型)は要素として各成分を表すキー(x、y、z)と内部で設定されたメタテーブルを持つ。
#region(close)
メタテーブルによって各メソッドへのアクセスや、一部の演算子(+、-、*)のイベントに対するメタメソッド、tostring関数から呼び出されたときに発生するイベントに対するメタメソッドが設定されている。
各メソッドへのアクセスは、ベクトルのテーブルにアクセスしたときに発生するindexイベント(__indexキー)で、元のテーブルにないキー(x、y、z以外のキー)へアクセスしたときに、代わりに各メソッドの関数を要素としたテーブル(vectorファイル内のlocal vector)へアクセスするように設定することで行っている。
#endregion
assets\computercraft\lua\rom\apis\vector で定義
**add
-vectorA:add( &i(){vectorB} )&br()&i(){vectorA} + &i(){vectorB}
-ベクトル&i(){vectorA}にベクトル&i(){vectorB}を足した結果を新しいベクトルとして返す
-戻り値:テーブル型。計算結果のベクトル
例:
local a = vector.new( 1, 2, 3 )
local b = vector.new( 4, 5, 6 )
local c = a:add( b )
print( c:tostring() )
ベクトルa(成分:1, 2, 3)にベクトルb(成分:4, 5, 6)を足した結果のベクトルをcへ代入し、その成分を文字列として表示する。
結果として 5,7,9 が表示される。
代わりに演算子&b(){+}を用いることもできる(メタテーブルでaddイベント(__addキー)のメタメソッドにも設定されているため)。
例:
local a = vector.new( 1, 2, 3 )
local b = vector.new( 4, 5, 6 )
local c = a + b
print( c:tostring() )
**sub
-vectorA:sub( &i(){vectorB} )&br()&i(){vectorA} - &i(){vectorB}
-ベクトル&i(){vectorA}からベクトル&i(){vectorB}を引いた結果を新しいベクトルとして返す
-戻り値:テーブル型。計算結果のベクトル
例:
local a = vector.new( 1, 2, 3 )
local b = vector.new( 3, 2, 1 )
local c = a:sub( b )
print( c:tostring() )
ベクトルa(成分:1, 2, 3)からベクトルb(成分:3, 2, 1)を引いた結果のベクトルをcへ代入し、その成分を文字列として表示する。
結果として -2,0,2 が表示される。
代わりに演算子&b(){-}を用いることもできる(メタテーブルでsubイベント(__subキー)のメタメソッドにも設定されているため)。
例:
local a = vector.new( 1, 2, 3 )
local b = vector.new( 3, 2, 1 )
local c = a - b
print( c:tostring() )
**mul
-vectorA:mul( &i(){n} )&br()&i(){vectorA} * &i(){n}
-ベクトル&i(){vectorA}にスカラー値&i(){n}(数値)を掛けた結果を新しいベクトルとして返す
-戻り値:テーブル型。計算結果のベクトル
例:
local a = vector.new( 1, 2, 3 )
local b = 2.5
local c = a:mul( b )
print( c:tostring() )
ベクトルa(成分:1, 2, 3)に数値b(2.5)を掛けた結果のベクトルをcへ代入し、その成分を文字列として表示する。
結果として 2.5,5,7.5 が表示される。
代わりに演算子&b(){*}を用いることもできる(メタテーブルでmulイベント(__mulキー)のメタメソッドにも設定されているため)。
例:
local a = vector.new( 1, 2, 3 )
local b = 2.5
local c = a * b
print( c:tostring() )
単項演算子&b(){-}を用いると符号を反転することができる。これは vectorA:mul( -1 ) と同様である(メタテーブルでunmイベント(__unmキー)のメタメソッドに設定されている)。
例:
local a = vector.new( 1, 2, 3 )
local b = -a
print( b:tostring() )
ベクトルa(成分:1, 2, 3)の符号を反転したベクトルをbへ代入し、その成分を文字列として表示する。
結果として -1,-2,-3 が表示される。
割り算のメソッドは無いが、スカラー値で割りたい場合は、逆数を掛ければよい。
**dot
-vectorA:dot( &i(){vectorB} )
-ベクトル&i(){vectorA}とベクトル&i(){vectorB}のドット積(内積)を求める
-戻り値:数値型
例:
local a = vector.new( 1, 2, 3 )
local b = vector.new( 4, 5, 6 )
local c = a:dot( b )
print( c )
ベクトルa(成分:1, 2, 3)とベクトルb(成分:4, 5, 6)のドット積の結果をcへ代入し、それを表示する。
結果として 32 が表示される。
**cross
-vectorA:cross( &i(){vectorB} )
-ベクトル&i(){vectorA}とベクトル&i(){vectorB}のクロス積(外積)の結果を新しいベクトルとして返す
-戻り値:テーブル型。計算結果のベクトル
例:
local a = vector.new( 1, 2, 3 )
local b = vector.new( 4, 5, 6 )
local c = a:cross( b )
print( c:tostring() )
ベクトルa(成分:1, 2, 3)とベクトルb(成分:4, 5, 6)のクロス積の結果のベクトルをcへ代入し、その成分を文字列として表示する。
結果として -3,6,-3 が表示される。
**length
-vectorA:length()
-ベクトル&i(){vectorA}の大きさを求める
-戻り値:数値型
例:
local a = vector.new( 2, 5, 9 )
local b = a:length()
print( b )
ベクトルa(成分:2, 5, 9)の大きさを求めてbへ代入し、それ表示する。
結果として 10.488089 が表示される。
**normalize
-vectorA:normalize()
-ベクトル&i(){vectorA}を正規化した結果を新しいベクトルとして返す
-戻り値:テーブル型。計算結果のベクトル
例:
local a = vector.new( 1, 2, 3 )
local b = a:normalize()
print( b:tostring() )
print( b:length() )
ベクトルa(成分:1, 2, 3)を正規化した結果のベクトルをbへ代入し、その成分を文字列として表示し、次の行にその大きさを表示する。
結果として1行目に 0.26726124,0.5345225,0.80178374 が、2行目に 1 (正規化した単位ベクトルなので大きさは1)が表示される。
**round
-vectorA:round()
-ベクトル&i(){vectorA}の各成分の値の小数部分を丸めて整数にした結果を新しいベクトルとして返す
-戻り値:テーブル型。計算結果のベクトル
各成分の値に対して0.5を足してmath.floor関数で丸め処理を行っている。
return vector.new(
math.floor( self.x + 0.5 ),
math.floor( self.y + 0.5 ),
math.floor( self.z + 0.5 )
)
例えば、負の数では -0.51 → -1、-0.5 → 0、正の数では 0.49 → 0、0.5 → 1。
例:
local a = vector.new( 1.4999, 1.5, 3.14 )
local b = a:round()
print( b:tostring() )
ベクトルa(成分:1.4999, 1.5, 3.14)の各成分の小数部分を丸めた結果のベクトルをbへ代入し、その成分を文字列として表示する。
結果として 1,2,3 が表示される。
**tostring
-vectorA:tostring()
-ベクトル&i(){vectorA}の成分を文字列として返す
-戻り値:文字列型
返る文字列のフォーマットは"x,y,z"。
ベクトルそのものがtostring関数から呼び出されたときも同様の文字列を返す(メタテーブルでtostringイベント(__tostringキー)のメタメソッドにも設定されているため)。
例:
local a = vector.new( 1, 2, 3 )
local b = a:tostring()
print( b )
ベクトルa(成分:1, 2, 3)の成分を文字列にしてbへ代入し、それを表示する。
結果として 1,2,3 が表示される。
このページではVector APIについて解説する。
参考資料:
-[[Vector API>http://computercraft.info/wiki/index.php?title=Vector_%28API%29]]
執筆時のバージョン:
-ComputerCraft 1.58 for Minecraft 1.6.4
----
#contents
----
*Vector API
[[ベクトル>http://ja.wikipedia.org/wiki/%E7%A9%BA%E9%96%93%E3%83%99%E3%82%AF%E3%83%88%E3%83%AB]]に関するAPI。
3次元のベクトルを表す値を作成し、それを操作することができる。GPSで3次元の位置を計算する時にも使われている。
作成したベクトルを操作する各メソッドへのアクセスは&b(){:}(コロン)を用いて行う。また、一部の算術演算子でも操作することができる。
Luaのテーブルやメタテーブルを用いてオブジェクト指向のクラスに似た機構として実装されている。ソースは是非とも一読の事。
assets\computercraft\lua\rom\apis\vector で定義
**new
-vector.new( &i(){x}, &i(){y}, &i(){z} )
-成分&i(){x}(数値)、&i(){y}(数値)、&i(){z}(数値)のベクトルを表す値を作成して返す。引数を省略した(nil)成分は0になる
-戻り値:テーブル型。ベクトル
戻り値はテーブル型であるため、戻り値から各成分(x、y、z)やメソッドへアクセスできる。
例:
local a = vector.new( 1, 2, 3 )
print( a.x )
print( a.y )
print( a.z )
数値 1, 2, 3 を成分としたベクトルを作成して変数aに代入し、各成分を表示する。
画面には以下のように表示される。
1
2
3
*ベクトル
vector.new関数で取得したベクトルのメソッドを用いてベクトル操作を行う。
ベクトルの各成分(x、y、z)へのアクセスは"&b(){.}"を、各メソッドへのアクセスは"&b(){:}"を用いて行う。
ペクトル(テーブル型)は要素として各成分を表すキー(x、y、z)と内部で設定されたメタテーブルを持つ。
#region(close)
メタテーブルによって各メソッドへのアクセスや、一部の演算子(+、-、*)のイベントに対するメタメソッド、tostring関数から呼び出されたときに発生するイベントに対するメタメソッドが設定されている。
各メソッドへのアクセスは、ベクトルのテーブルにアクセスしたときに発生するindexイベント(__indexキー)で、元のテーブルにないキー(x、y、z以外のキー)へアクセスしたときに、代わりに各メソッドの関数を要素としたテーブル(vectorファイル内のlocal vector)へアクセスするように設定することで行っている。
#endregion
assets\computercraft\lua\rom\apis\vector で定義
**add
-vectorA:add( &i(){vectorB} )&br()&i(){vectorA} + &i(){vectorB}
-ベクトル&i(){vectorA}にベクトル&i(){vectorB}を足した結果を新しいベクトルとして返す
-戻り値:テーブル型。計算結果のベクトル
例:
local a = vector.new( 1, 2, 3 )
local b = vector.new( 4, 5, 6 )
local c = a:add( b )
print( c:tostring() )
ベクトルa(成分:1, 2, 3)にベクトルb(成分:4, 5, 6)を足した結果のベクトルをcへ代入し、その成分を文字列として表示する。
結果として 5,7,9 が表示される。
代わりに演算子&b(){+}を用いることもできる(メタテーブルでaddイベント(__addキー)のメタメソッドにも設定されているため)。
例:
local a = vector.new( 1, 2, 3 )
local b = vector.new( 4, 5, 6 )
local c = a + b
print( c:tostring() )
**sub
-vectorA:sub( &i(){vectorB} )&br()&i(){vectorA} - &i(){vectorB}
-ベクトル&i(){vectorA}からベクトル&i(){vectorB}を引いた結果を新しいベクトルとして返す
-戻り値:テーブル型。計算結果のベクトル
例:
local a = vector.new( 1, 2, 3 )
local b = vector.new( 3, 2, 1 )
local c = a:sub( b )
print( c:tostring() )
ベクトルa(成分:1, 2, 3)からベクトルb(成分:3, 2, 1)を引いた結果のベクトルをcへ代入し、その成分を文字列として表示する。
結果として -2,0,2 が表示される。
代わりに演算子&b(){-}を用いることもできる(メタテーブルでsubイベント(__subキー)のメタメソッドにも設定されているため)。
例:
local a = vector.new( 1, 2, 3 )
local b = vector.new( 3, 2, 1 )
local c = a - b
print( c:tostring() )
**mul
-vectorA:mul( &i(){n} )&br()&i(){vectorA} * &i(){n}
-ベクトル&i(){vectorA}にスカラー値&i(){n}(数値)を掛けた結果を新しいベクトルとして返す
-戻り値:テーブル型。計算結果のベクトル
例:
local a = vector.new( 1, 2, 3 )
local b = 2.5
local c = a:mul( b )
print( c:tostring() )
ベクトルa(成分:1, 2, 3)に数値b(2.5)を掛けた結果のベクトルをcへ代入し、その成分を文字列として表示する。
結果として 2.5,5,7.5 が表示される。
代わりに演算子&b(){*}を用いることもできる(メタテーブルでmulイベント(__mulキー)のメタメソッドにも設定されているため)。
例:
local a = vector.new( 1, 2, 3 )
local b = 2.5
local c = a * b
print( c:tostring() )
単項演算子&b(){-}を用いると符号を反転することができる。これは vectorA:mul( -1 ) と同様である(メタテーブルでunmイベント(__unmキー)のメタメソッドに設定されている)。
例:
local a = vector.new( 1, 2, 3 )
local b = -a
print( b:tostring() )
ベクトルa(成分:1, 2, 3)の符号を反転したベクトルをbへ代入し、その成分を文字列として表示する。
結果として -1,-2,-3 が表示される。
割り算のメソッドは無いが、スカラー値で割りたい場合は、逆数を掛ければよい。
**dot
-vectorA:dot( &i(){vectorB} )
-ベクトル&i(){vectorA}とベクトル&i(){vectorB}のドット積(内積)を求める
-戻り値:数値型
例:
local a = vector.new( 1, 2, 3 )
local b = vector.new( 4, 5, 6 )
local c = a:dot( b )
print( c )
ベクトルa(成分:1, 2, 3)とベクトルb(成分:4, 5, 6)のドット積の結果をcへ代入し、それを表示する。
結果として 32 が表示される。
**cross
-vectorA:cross( &i(){vectorB} )
-ベクトル&i(){vectorA}とベクトル&i(){vectorB}のクロス積(外積)の結果を新しいベクトルとして返す
-戻り値:テーブル型。計算結果のベクトル
例:
local a = vector.new( 1, 2, 3 )
local b = vector.new( 4, 5, 6 )
local c = a:cross( b )
print( c:tostring() )
ベクトルa(成分:1, 2, 3)とベクトルb(成分:4, 5, 6)のクロス積の結果のベクトルをcへ代入し、その成分を文字列として表示する。
結果として -3,6,-3 が表示される。
**length
-vectorA:length()
-ベクトル&i(){vectorA}の大きさを求める
-戻り値:数値型
例:
local a = vector.new( 2, 5, 9 )
local b = a:length()
print( b )
ベクトルa(成分:2, 5, 9)の大きさを求めてbへ代入し、それ表示する。
結果として 10.488089 が表示される。
**normalize
-vectorA:normalize()
-ベクトル&i(){vectorA}を正規化した結果を新しいベクトルとして返す
-戻り値:テーブル型。計算結果のベクトル
例:
local a = vector.new( 1, 2, 3 )
local b = a:normalize()
print( b:tostring() )
print( b:length() )
ベクトルa(成分:1, 2, 3)を正規化した結果のベクトルをbへ代入し、その成分を文字列として表示し、次の行にその大きさを表示する。
結果として1行目に 0.26726124,0.5345225,0.80178374 が、2行目に 1 (正規化した単位ベクトルなので大きさは1)が表示される。
**round
-vectorA:round()
-ベクトル&i(){vectorA}の各成分の値の小数部分を丸めて整数にした結果を新しいベクトルとして返す
-戻り値:テーブル型。計算結果のベクトル
各成分の値に対して0.5を足してmath.floor関数で丸め処理を行っている。
return vector.new(
math.floor( self.x + 0.5 ),
math.floor( self.y + 0.5 ),
math.floor( self.z + 0.5 )
)
例えば、負の数では -0.51 → -1、-0.5 → 0、正の数では 0.49 → 0、0.5 → 1。
例:
local a = vector.new( 1.4999, 1.5, 3.14 )
local b = a:round()
print( b:tostring() )
ベクトルa(成分:1.4999, 1.5, 3.14)の各成分の小数部分を丸めた結果のベクトルをbへ代入し、その成分を文字列として表示する。
結果として 1,2,3 が表示される。
**tostring
-vectorA:tostring()
-ベクトル&i(){vectorA}の成分を文字列として返す
-戻り値:文字列型
返る文字列のフォーマットは"x,y,z"。
ベクトルそのものがtostring関数から呼び出されたときも同様の文字列を返す(メタテーブルでtostringイベント(__tostringキー)のメタメソッドにも設定されているため)。
例:
local a = vector.new( 1, 2, 3 )
local b = a:tostring()
print( b )
ベクトルa(成分:1, 2, 3)の成分を文字列にしてbへ代入し、それを表示する。
結果として 1,2,3 が表示される。