【Processing】ベクトルを扱ってみよう!

ベクトルとは

ベクトルは、大きさと方向を持つ量です。下図のように有向線分で表され、矢印がベクトルの方向、長さがベクトルの大きさを表します。

矢印の始まりである赤い点Aを始点、終わりである青い点Bを終点と呼びます。物体に働く力や物体の速度、加速度などがベクトルで表されます。ベクトルは方向と大きさを持つ量ですが、大きさだけを持つ量をスカラーと呼びます。例えば、時間や長さ、温度がスカラー量になります。ベクトルは一般的に文字の上に矢印をつけるか太字で表記されます。これによって、スカラーと区別することができます。

  • ベクトル:\vec{a},\boldsymbol{a}
  • スカラー:t

ベクトルの成分表示

次の図のように方眼紙の上でベクトル\overrightarrow{AB}を考えてみます。この例では、XY平面上において、Xの正の方向に3マス、Yの正の方向に4マス移動しています。\overrightarrow{AB}のX成分とY成分がそれぞれ分かっていますので、次のように成分表示することもできます。

\overrightarrow{AB}=(3, 4)

ベクトルの演算

ここでは基本的なベクトルの演算について紹介します。

加算

2つのベクトルを加算するには、単純に両ベクトルのx成分同士、y成分同士を加算します。先ほどベクトルの成分表示について説明しましたが、この説明の中にベクトルの加算の考え方が含まれています。\overrightarrow{AB}は、「X方向に+3移動するベクトル」と「Y方向に+4移動するベクトル」の2つの加算から得られたベクトルと考えることもできるからです。X方向に+3移動するベクトルを\vec{S}、Y方向に+4移動するベクトルを\vec{T}とすれば、次のように書くことができます。

\vec{S}=(3, 0)

\vec{T}=(0, 4)

\overrightarrow{AB}=(3,4)

実際に\vec{S}\vec{T}を足してみると、

\vec{S} + \vec{T}=(3 + 0, 0 + 4) = (3, 4) = \overrightarrow{AB}

となります。ベクトルの加算についてもう一度整理しておきます。\vec{u}=(u_x, u_y), \vec{v}=(v_x, v_y)という2つのベクトルの加算は、次のように計算することができます。

\overrightarrow{w} = \overrightarrow{u} + \overrightarrow{v}

w_x = u_x + v_x

w_y = u_y + v_y

減算

2つのベクトルの減算は、次のように計算することができます。

\overrightarrow{w} = \overrightarrow{u} - \overrightarrow{v}

w_x = u_x - v_x

w_y = u_y - v_y

例えば、\vec{u}=(5, 4), \vec{v}=(3, 1)であれば、

w_x = 5 - 3 = 2

w_y = 4 - 1 = 3

\overrightarrow{w} = (2, 3)

となります。次に図で考えてみます。まず、2つのベクトル\vec{u}, \vec{v}をそれぞれ図示すると下図のようになります。

この2つのベクトルの始点を揃えて、x成分・y成分それぞれの差を図示します。

図中の赤い破線が「x成分の差」、青い破線が「y成分の差」を表しています。この図からもw_x = 2, w_y=3であることが分かります。w_xと,w_yが図示できているので、あとは\overrightarrow{w}を示す矢印をかくだけです。\overrightarrow{v}の終点から\overrightarrow{v}の終点に向けて矢印をかいてみます。

これで\overrightarrow{w}を図示することができました。また、この図から\overrightarrow{u} = \overrightarrow{v} + \overrightarrow{w}であることが分かります。つまり、ベクトルの減算で\overrightarrow{w}を求めるということは、\overrightarrow{v}にどのようなベクトルを足せば、\overrightarrow{u}と同じベクトルになるかを求めるのと同じ意味になります。

乗算

ベクトルにスカラーをかけることで、ベクトルのスケーリングをすることができます。例えば、ベクトルの大きさを2倍にしたければ、ベクトルに2を掛けます。このとき、ベクトルの大きさはスケーリングによって変わりますが、方向については変わりません。ベクトルのスケーリングは、次のように計算することができます。ここでnはスカラーです。

\overrightarrow{w} = n \cdot \overrightarrow{u}

w_x = n \cdot u_x

w_y = n \cdot u_y

例えば、\vec{u}=(1, 2), n=3であれば、

w_x = 3 \cdot 1 = 3

w_y = 3 \cdot 2 = 6

\overrightarrow{w} = (3, 6)

となります。次に図で考えてみます。まず、\overrightarrow{u}を図示すると下図のようになります。

このベクトルに3を掛けるということは、3回ベクトルを足し合わせるのと同じ意味です。そこで、\overrightarrow{u}を下図の様に3つ並べてみます。

この図からw_x = 3, w_y=6であることが分かります。w_xと,w_yが図示できているので、\overrightarrow{w}を示す矢印をかいてみます。

これで\overrightarrow{w}を図示することができました。先ほど計算した結果と同じになっていますね。

正規化

ベクトルの正規化とは、方向を変えずにその大きさを「1」にすることを指します。この大きさが「1」であるベクトルを単位ベクトルと呼びます。ベクトル\overrightarrow{u}の単位ベクトル\boldsymbol{\widehat{u}}は、次のように計算することができます。

\boldsymbol{\widehat{u}}=\cfrac{\overrightarrow{u}}{\|\overrightarrow{u} \|}

この式は、「ベクトルを正規化するには、各成分をベクトルの大きさで割る」ということを意味しています。「ベクトルの大きさ」はスカラーになります。ベクトルのスケーリングについては、「乗算」のところで説明しました。ではベクトルの大きさ\|\overrightarrow{u} \|はどのように計算すればよいでしょうか?

具体的な例として、\vec{u}=(4, 3)の場合について、図示して考えてみます。\vec{u}を図示すると、下図のようになります。

この図からベクトルの矢印は直角三角形の斜辺になっていることが分かります。斜辺の長さは、ピタゴラスの定理によって、次のように簡単に計算することができます。

\|\overrightarrow{u} \| = \sqrt{u_x \cdot u_x + u_y \cdot u_y}

今の場合u_x=4, u_y=3なので、ベクトルの大きさは

\|\overrightarrow{u} \| = \sqrt{4 \cdot 4 + 3 \cdot 3} = \sqrt{25} = 5

となります。単位ベクトルは、各成分をベクトルの大きさで割ればよいので、次のように求められます。

\boldsymbol{\widehat{u}}=\cfrac{\overrightarrow{u}}{5} = (4/5, 3/5)

これでベクトルの正規化ができました。

Processingでベクトルを扱う

ここまでで、ベクトルの基本について整理しました。では、Processingでベクトルを扱うためにはどのようにすればよいでしょうか?

実はProcessingにはベクトルを扱うためのクラス「PVectorクラス」が用意されています。ベクトルの成分はコンストラクタの引数で指定することができます。例えば、ベクトル\overrightarrow{u}=(4,5)を定義したければ、次のように書きます。

PVector v = new PVector(4,5);

ベクトルの加算や減算など基本的な演算について紹介してきましたが、PVectorクラスにはベクトルの演算をするためのメソッドも用意されています。メソッドを下表に整理しました。

メソッド 機能
set() ベクトルの成分を指定する
random2D() 2次元のランダムな向きを持った単位ベクトルを作成
random3D() 3次元のランダムな向きを持った単位ベクトルを作成
fromAngle() 指定した角度から2次元の単位ベクトルを作成
copy() ベクトルのコピー
mag() ベクトルの大きさを計算
magSq() ベクトルの大きさの2乗を計算
add() ベクトルの加算
sub() ベクトルの減算
mult() ベクトルにスカラーを掛ける
div() ベクトルをスカラーで割る
dist()  2点間の距離を計算
dot()  2つのベクトルのドット積
cross()  2つのベクトルのクロス積(3次元のみ)
normalize()  ベクトルを長さ1に正規化
limit()  ベクトルの大きさを制限する
setMag()  ベクトルの大きさを設定
heading()  ベクトルの方向を角度で表す
rotate()  角度を指定してベクトルを回転(2次元のみ)
leap()  ベクトルと他のベクトルとの線形補間
angleBetween()  2つのベクトル間の角度
array()  ベクトルをfloat型の配列として返す

ベクトル演算のサンプルコード

「PVectorクラス」を使ったサンプルコードとその実行結果を示します。まず、1行目〜2行目で2つのベクトル\overrightarrow{u}=(6,8),\overrightarrow{v}=(1,2)を定義して、3行目〜4行目で成分ごとに値を出力しています。6行目〜9行目では、2つのベクトル\overrightarrow{u}, \overrightarrow{v}の加算と減算を行なっています。。11行目〜14行目では、ベクトル\overrightarrow{u}とスカラーの乗算と除算を行なっています。16行目〜20行目では、ベクトル\overrightarrow{u}の大きさと正規化したベクトルを求めています。実行結果からは、各演算が正しく行われていることが分かります。「PVectorクラス」を使うことで、このようにベクトルの定義と演算を簡単に行うことができます。

コード

実行結果

ベクトルu:6.0,8.0
ベクトルv:1.0,2.0
ベクトルの加算:7.0,10.0
ベクトルの減算:5.0,6.0
ベクトルの乗算:60.0,80.0
ベクトルの除算:3.0,4.0
ベクトルの大きさ:10.0
ベクトルの正規化:0.6,0.8

まとめ

この記事では、ベクトルの基礎とProcessingのPVectorクラスについて扱いました!シミュレーションやジェネラティブアートのプログラム作成に是非活用してください!!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です