[数学]捻じれて縺れてこんがらかる の続きです。
今回は軽くおさらいです。
ベクトルを使うに当たり、三次元空間の内積、外積を解説します。
・内積
別名、スカラー積ともよばれ、ベクトルaとベクトルbの内積は一次元の数値となります。
要は、ベクトルじゃないよ、ってことです。
なお、内積が0になるときは、掛け合わせたベクトルが直交するときです。
これは二次元における内積と同じです。
なお、計算式は以下のようになります。
x、y、zそれぞれを掛け合わせてたします。
struct Vec3{
int x, y, z;
};
int inner(const Vec3 &a, const Vec3 &b){
return a.x * b.x + a.y * b.y + a.z * b.z;
}
・外積
別名、ベクトル積で、ベクトルaとベクトルbの内積はベクトルとなります。
この外積で出てくるベクトルはベクトルa、ベクトルbの両方に直交します。
前を表すベクトルと、上を表すベクトルから右を表すベクトルを作り出せます。
ここで、前と上を表すベクトルは必ずしも直行しなくてよいことが重要です。
なお、外積の結果が零ベクトルになることがありますが、
これは掛け合わせたベクトルが同一方向か逆方向を向いているときです。
先ほどの例だと、前を表すベクトルが真上を向いてしまうと、
北極点における東方向という感じで、右方向というのが決まらなくなってしまいます。
こういう場合に零ベクトルとなるわけです。
外積の計算式は以下の通りです。
x→y→z→x というローテーションを意識して、別々を掛けて引くというという形になります。
Vec3 outer(const Vec3 &a, const Vec3 &b){
Vec3 c;
c.x = a.y * b.z - a.z * b.y;
c.y = a.z * b.x - a.x * b.z;
c.z = a.x * b.y - a.y * b.x;
return c;
}