Flashゲーム講座 & アクションスクリプトサンプル集



2Dベクトルを作成する

 


■2Dベクトルの演算について

 
Flash 8 以降であれば、Point クラスを利用すると、2Dのベクトルの演算を行うことができます。
 
このページでは、Flash 7 以前を利用している方や、他言語を使われる方や、自前で演算したい人向けにソースコードを公開しています。
 
2Dベクトルの実践での使い方については、こちらで解説しています。
 

■ベクトルの型

 
Point 型と同じプロパティになるように、オブジェクト型で表現しています。
 
x が「x 軸の成分」
 
y が「y 軸の成分」
 
となります。
 
ベクトルの型

var vec = {
	x : 0,
	y : 0
};
 

■ベクトルを作成する

 
2Dベクトルのオブジェクトを作成する関数です。
 
第01引数に x 軸成分を指定します。
 
第02引数に y 軸成分を指定します。
 
戻り値から新規のオブジェクトが得られます。
 
ベクトルの型

function Vec2dCreate(x,y){
	return {
		x : x,
		y : y
	};
}
 
使用例です。
 
2Dベクトル(10,5)を作成する

var vec = Vec2dCreate(10,5);
 

■プロパティにアクセスする

 
オブジェクトから、直接プロパティにアクセスする事もできます。
 
ベクトルのプロパティにアクセスする

var vec = Vec2dCreate(0,0);
vec.x = 10;
vec.y = 5;

trace("x:" + vec.x + " y:" + vec.y);
 




2Dベクトル同士を加算する

 


■2Dベクトルと2Dベクトルの加算

 
2Dベクトルと2Dベクトルを加算して新しい2Dベクトルを得る関数です。
 
第01引数に 1つ目のオブジェクトを指定します。
 
第02引数に 2つ目のオブジェクトを指定します。
 
戻り値から新規のオブジェクトが得られます。
 
ベクトル同士の加算

function Vec2dAdd( vec1, vec2 ){
	return {
		x : vec1.x + vec2.x,
		y : vec1.y + vec2.y
	};
}
 
使用例です。
 
2Dベクトル(10,5)と2Dベクトル(20,-7)を加算する

var vec1 = Vec2dCreate(10,5);	// 1つ目のベクトルを作成する
var vec2 = Vec2dCreate(20,-7);	// 2つ目のベクトルを作成する
	
var vec3 = Vec2dAdd(vec1,vec2);	// 2つのベクトルを加算して新しいベクトルを得る
 




2Dベクトル同士を減算する

 


■2Dベクトルから2Dベクトルを減算

 
2Dベクトルから2Dベクトルを減算して新しい2Dベクトルを得る関数です。
 
引数に渡す順序を間違えると結果が変わるので注意します。
 
第01引数に 1つ目のオブジェクトを指定します。
 
第02引数に 2つ目のオブジェクトを指定します。
 
戻り値から新規のオブジェクトが得られます。
 
2Dベクトルから2Dベクトルを減算

function Vec2dSub( vec1, vec2 ){
	return {
		x : vec1.x - vec2.x,
		y : vec1.y - vec2.y
	};
}
 
使用例です。
 
2Dベクトル(10,5) を 2 倍する

var vec1 = Vec2dCreate(10,5);	// 1つ目のベクトルを作成する
var vec2 = Vec2dCreate(20,-7);	// 2つ目のベクトルを作成する

var vec3 = Vec2dSub(vec1,vec2);	// 1つ目のベクトルから2つ目のベクトルを減算して新しいベクトルを得る
 




2Dベクトルを乗算する

 


■2Dベクトルを任意の値で乗算する

 
2Dベクトルに、値を掛けて新しい2Dベクトルを得る関数です。
 
第01引数に ベクトルのオブジェクトを指定します。
 
第02引数に 乗算したい値を指定します。
 
戻り値から新規のオブジェクトが得られます。
 
2Dベクトルに任意の値を乗算

function Vec2dScale( vec, scale ){
	return {
		x : vec.x * scale,
		y : vec.y * scale
	};
}
 
使用例です。
 
2Dベクトル(10,5)から2Dベクトル(20,-7)を減算する

var vec1 = Vec2dCreate(10,5);	// ベクトルを作成する

var vec2 = Vec2dScale(vec1,2);	// ベクトルを乗算する
 




2Dベクトルの長さを求める

 


 
ベクトルの長さを計算

ベクトルの長さを返します。

第01引数にベクトル
戻り値に長さが返ります。

ベクトルの長さを求める

function Vec2dLength( vec ){
	return Math.sqrt((vec.x * vec.x) + (vec.y * vec.y));
}
 
使用例です。

ベクトル(10,5)の長さを求める


	vec1 = _root.Vec2dCreate(10,5);
	
	length = _root.Vec2dLength(vec1);
	
length → 11.1803…
 

 




2Dベクトル同士の内積を求める

 


 
ベクトルとベクトルの内積を計算

ベクトルとベクトルの内積を計算して結果を返します。

内積とは2つの単位ベクトルが如何に平行に近いかという事を表す数値で、

1 に近いほど平行である
0 に近いほど直角である
-1 に近いほど反対方向で平行である

ということがわかります。

単位ベクトル=長さが1のベクトル
 
第01引数に1つ目のベクトル
第02引数に2つ目のベクトル
戻り値に計算後の数値が返ります。

ベクトル同士の内積を求める

function Vec2dDotProduct( vec1, vec2 ){
	return (vec1.x * vec2.x) + (vec1.y * vec2.y);
}
 
使用例です。

ベクトル(10,5)とベクトル(20,-7)の内積を求める


	vec1 = _root.Vec2dCreate(10,5);
	vec2 = _root.Vec2dCreate(20,-7);
	
	dot = _root.Vec2dDotProduct(vec1,vec2);
	
dot → 165
 

 




垂直な2Dベクトルを求める

 


 
垂直な2Dベクトルを計算

ベクトルに対して垂直な法線を計算して結果を返します。

法線とはベクトルの面に対して90度に垂直な方向を表しています。 法線を使うと面に対して表か裏なのか、ベクトルの反射方向はどこか といった、新たな計算結果を求めるために役に立ちます。



第01引数にベクトル
戻り値に計算後のベクトルが返ります。

ベクトルの法線を求める

function Vec2dPerp( vec ){
	return {
		x : -vec.y,
		y : vec.x
	};
}
 
使用例です。

ベクトル(10,5)の法線を求める


	vec1 = _root.Vec2dCreate(10,5);
	vec2 = _root.Vec2dPerp(vec1);
	
vec2.x → -5
vec2.y → 10
 

 




2Dベクトルを正規化する

 


 
正規化ベクトルを計算

ベクトルを正規化して結果を返します。

ベクトルは方向と長さを持っているので一度、方向を維持したまま長さだけを 1 にして方向だけ意味を持たせます。 この後に、拡大縮小変換をすると、好きな長さに変換できます。
 
第01引数にベクトル
戻り値に計算後のベクトルが返ります。

ベクトルを正規化する

function Vec2dNormalize ( vec ){
  var length = Math.sqrt((vec.x * vec.x) + (vec.y * vec.y));
  if(length > 0)	length = 1 / length;
  return {
    x : vec.x * length,
    y : vec.y * length
  };
}
 
使用例です。

ベクトル(10,5)を正規化する


	vec1 = _root.Vec2dCreate(10,5);
	vec2 = _root.Vec2dNormalize(vec1);
	
vec2.x → 0.8944…
vec2.y → 0.4472…
 

 




ソースをダウンロード

 





- 関数をまとめたソース -

vec2d.as(6kバイト)ActionScript ファイル