ベクトル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