ベクトルと角度

ベクトルa = (a1, a2)とベクトルb = (b1, b2)の成す角度θを求めよ。


ベクトルの内積(dot product)はa1*b1 + a2*b2である。
これをa dp b = a1*b1+a2*b2と書くものとする。
ベクトル自身の内積はベクトルの長さの二乗になる。
a dp a = a1*a1 + a2*a2
b dp b = b1*b1 + b2*b2
今、ベクトルaを起点(0,0)を中心に回転しx軸上に持ってくる。
するとa'= (|a|, 0)である。ここで|a|はaの長さである。
同じ角度だけベクトルbも回転し、b'とする。
ベクトルの内積は回転に対し普遍であるので次の式が成立する。
a db b = a' db b' = (|a|, 0) dp (b'1, b'2) = |a| * b'1
ところでb'1はb'のx成分なので|b| * cos θである。
よって、
a dp b = |a| * |b| * cos θ
cos θ = (a dp b) / (|a| * |b|)
θ = arccos ( (a dp b) / (|a| * |b|))

さて、例えばaを(1, 0) 、bを(1, 1)とすると角度は45°になるはずだが、やってみよう。

   ]a =: 1 0
1 0
   ]b =: 1 1
1 1
   dp =: +/ . *  NB.dot product = ベクトルの内積
   a dp b
1
   a dp a
1
   b dp b
2
   180 * ( (2&o. ^:_1) 1 % 2 ^ 0.5) % (o.1)   NB.2&o.はコサインで、^:_1はその逆関数
45
   180 * (_2&o. 1 % 2 ^ 0.5) % (o.1)  NB._2&o.はArccos。o.1はπ。
45

こんなのはどうか。

   ]a=:1 1
1 1
   ]b=:1 _1
1 _1
   a dp b
0
   a dp a
2
   b dp b
2
   180 * (_2&o. 0 % 4 ^ 0.5) % (o.1)
90