「がんばれない」けど「がんばりたい」

ITエンジニアの仕事のこと。AI、機械学習、ディープラーニング。地頭力。車のこと。

Dot Product|Nature of Code

内積についてはOPENFRAMEWORKS.CC TUTORIAL|Vector Mathsを読むで1度、まとめているが、具体的に使用した事がなかったので、いまいちなママでした。実は。

Nature of Codeを読み進めていて、このタイミングで同様に内積についての記事が出てきました。内容や定義はもちろん同じですが、次のPath Followの記事で内積を利用していて、「いつ内積を利用するのか?」というイメージの1つが具体的になっていて目から鱗でした。再度、頭に刻み込む理由でNature of Codeでの内積の記事をまとめてみたいと思います。

上の動画は黒色の横方向ベクトルAとマウス位置までのベクトルBのなす角度を内積で求め画面に数字で表示しています。また、もう一つの青色ベクトルはベクトルAからBへ垂線を落としたポイントを示すために引いています。勘違いしないでほしいのは、この青色のベクトルを内積求める事は出来なくて、垂線を下ろした位置が分かるという事です。

あくまで内積は一方のベクトルが、もう一方のベクトルに対して、どのくらい関与しているか?を求めるものです。ただ、この説明が実際に利用する時のイメージにつながりにくいので、次のPath Followの記事で考えて行こうと思っています。

内積の定義
内積 = ax * bx + ay * by
ベクトルA = (ax, ay)
ベクトルB = (bx, by)

例)
ベクトルA = (-3, 5)
ベクトルB = (10, 1)
内積 = 35

openFrameworks code example

float dot = a1.dot(b1);

■ 2つのベクトルが成す角度を求めたい

float theta;
theta = acos( 内積 / ベクトルAの大きさ*ベクトルBの大きさ );
thate = acos( a.dot(b) / a.length * b.length );

こんなメソッドを用意しておいてもいいですね。

static public function angleBetween(ofVec3f v1, ofVev3f v2)
{
  float dot = v1.dot(v2);
  float theta = (float)acos(dot / (v1.length() * v2.length()) );
  return theta;
}

  • もし2つのベクトルがnormalizeされている場合は

  • θ = 90度(直角)の場合は、