ベクトルはPVectorクラスを使う
Processingでは、ベクトルをPVectorクラスを用いて扱うことができます。以下では、PVectorクラスについて、このサイトで利用する部分を中心に簡単に説明したいと思います。特にPVectorクラスは3次元ベクトルを扱うことができますが、ここでは2次元ベクトルの解説となります。より詳細に知りたい方はProcessingの公式なチュートリアルなどでご確認ください。
ベクトルの生成および演算
このサイトで紹介するPVectorクラスを用いたベクトルの生成方法やベクトルの演算についてまとめておきます。
ベクトルの生成1 (コンストラクタを利用) | PVector v = new PVector(x,y); | x:ベクトルのx成分(float) y:ベクトルのy成分(float) |
ベクトルの生成2 (ベクトルの向きを指定) | PVector v = PVector.fromAngle(angle); | angle:x軸正方向を基準とした角度(ラジアン, float) |
ベクトルの和 | v1.add(v2); | v1, v2:ベクトル(PVector) |
ベクトルの差 | v1.sub(v2); | v1, v2:ベクトル(PVector) |
ベクトルの定数倍 | v.mult(n); | v:ベクトル(PVector) n:ベクトルを何倍するかの倍率(float) |
ベクトルの回転 | v.rotate(angle); | angle:角度(ラジアン, float) |
2点間の距離 | d = v1.dist(v2); | v1, v2:ベクトル(PVector) d:2点間の距離(float) |
ベクトルの生成1 コンストラクタを利用する
一番基本的なベクトルの生成方法でコンストラクタを使う方法です。ベクトルの成分を与えることで作成します。
PVector v = new PVector(x,y);
各パラメータは次のようになっています。
- x (float) ベクトルのx成分
- y (float) ベクトルのy成分
以下に、コンストラクタを利用した作成例を示します。
void setup(){
PVector v = new PVector(1.0,1.0);
println(v);
}
これを実行すると、スケッチ下部のコンソール部分に以下のように表示されます。
[ 1.0, 1.0, 0.0 ]
ベクトルの生成2 ベクトルの向きを指定する
2つ目はベクトルの向きを指定して生成するためのfromAngleメソッドを使う方法です。引数に指定した角度の向きに単位ベクトルを生成します。
PVector v = PVector.fromAngle(angle);
各パラメータは次のようになっています。
- angle (float) x軸正方向を基準としたベクトルの角度(ラジアン)
以下に、fromAngleメソッドを利用した作成例を示します。ここではx軸正方向から60°傾けた向きのベクトルを作成します。
void setup(){
PVector v = PVector.fromAngle(radians(60.0));
println(v);
}
これを実行すると、スケッチ下部のコンソール部分に以下のように表示されます。
[ 0.49999997, 0.86602545, 0.0 ]
ベクトルの和
ベクトル同士の足し算を行うためにはaddメソッドを使います。たとえば、ベクトルv2にベクトルv1を加えるとき、以下のようにします。
v2.add(v1);
以下に、addメソッドを利用した例を示します。
void setup(){
PVector v1 = new PVector(1.0,0.0);
PVector v2 = new PVector(0.0,1.0);
v2.add(v1);
println(v2);
}
これを実行すると、スケッチ下部のコンソール部分に以下のように表示されます。
[ 1.0, 1.0, 0.0 ]
ベクトルの差
ベクトル同士の引き算を行うためにはsubメソッドを使います。たとえば、ベクトルv2からベクトルv1を引くとき、以下のようにします。
v2.sub(v1);
以下に、subメソッドを利用した例を示します。
void setup(){
PVector v1 = new PVector(1.0,0.0);
PVector v2 = new PVector(0.0,1.0);
v2.sub(v1);
println(v2);
}
これを実行すると、スケッチ下部のコンソール部分に以下のように表示されます。
[ -1.0, 1.0, 0.0 ]
ベクトルの定数倍
ベクトルの大きさを調整するためにはmultメソッドを使います。たとえば、ベクトルvをn倍するとき、以下のようにします。
v.mult(n); // nはfloat型
以下に、multメソッドを利用した例を示します。
void setup(){
PVector v = new PVector(1.0,1.0);
v.mult(2.0);
println(v);
}
これを実行すると、スケッチ下部のコンソール部分に以下のように表示されます。
[ 2.0, 2.0, 0.0 ]
ベクトルの回転
ベクトルを回転するためにはrotateメソッドを使います。たとえば、ベクトルvをangle(ラジアン)だけ回転するとき、以下のようにします。
v.rotate(angle); // angleはfloat型
以下に、rotateメソッドを利用した例を示します。
void setup(){
PVector v = new PVector(1.0,0.0);
v.rotate(radians(90.0));
println(v);
}
これを実行すると、スケッチ下部のコンソール部分に以下のように表示されました。
[ -4.371139E-8, 1.0, 0.0 ]
2点間の距離
2つのベクトルで表された2点の間の距離を計算するためにはdistメソッドを使います。たとえば、2つのベクトルv1とv2で表された2点間の距離を計算するとき、以下のようにします。
float d = v2.dist(v1);
以下に、distメソッドを利用した例を示します。
void setup(){
PVector v1 = new PVector(1.0,0.0);
PVector v2 = new PVector(0.0,1.0);
float d = v2.dist(v1);
println(d);
}
これを実行すると、スケッチ下部のコンソール部分に以下のように表示されました。
1.4142135
ベクトル演算を行う際の注意点(copyをうまく利用しよう)
PVectorの和や差、PVectorの回転などのベクトル演算を行う際は注意が必要です。
たとえば、PVector v1とPVector v2の和をPVector v3とすることを考えます。このとき、単純に考えると、
void setup(){
PVector v1 = new PVector(1.0,0.0);
PVector v2 = new PVector(0.0,1.0);
PVector v3 = v2.add(v1);
println(v1, v2, v3);
}
としてしまいそうですが、実際に実行してみると、コンソールには
[ 1.0, 0.0, 0.0 ] [ 1.0, 1.0, 0.0 ] [ 1.0, 1.0, 0.0 ]
と表示されます。もともとの意図としては、v1とv2はそのままでv3=v1+v2を計算したかったのですが、v2も更新されてしまっています。ちょっと考えたらわかりますが、v2.add(v1)をすることでv2を更新し、それから更新されたv2をv3に代入しているので、当然です。
今回意図していた演算を行うためには、v2のcopyを利用することで対応できます。
void setup(){
PVector v1 = new PVector(1.0,0.0);
PVector v2 = new PVector(0.0,1.0);
PVector v3 = v2.copy().add(v1);
println(v1, v2, v3);
}
これを実行すると、
[ 1.0, 0.0, 0.0 ] [ 0.0, 1.0, 0.0 ] [ 1.0, 1.0, 0.0 ]
となり、意図したとおりに動作していることが分かります。