2つのベクトルのなす角を得る

f:id:startrekker:20170611224232p:plain


内積(Dot Product)は、「vAとvB内積 = |vA| * |vB| * cosθ」で求まる。

 

vAとvBのなす角を得たい場合、これが使える。

 

「vAとvB内積 = |vA| * |vB| * cosθ」より、

vA, vBはともに単位ベクトルで1なので、

「vAとvB内積 = cosθ」となる。

cosθ = Ax * Bx + Ay * By + Az * Bz 

        = 1 * 0.866 + 0 * 0.5 + 0 * 0

        ≒ 0.866

 

y = cosx ⇔  acosy = x  より、

acos(0.866) ≒ 30.002

 ゆえ、θ = 30°となる。 (0°≦θ≦180°)


以下、C#ソースコード

using System;
using System.Windows.Media.Media3D;

namespace Calc
{
    public static class Logic
    {
        /// <summary>
        /// 2つのベクトルのなす角を得る
        /// </summary>
        /// <param name="v1"></param>
        /// <param name="v2"></param>
        /// <returns>2つのベクトルのなす角(radian)</returns>
        static private double GetAngle(Vector3D v1, Vector3D v2)
        {
            v1.Normalize();
            v2.Normalize();

            double cos = Vector3D.DotProduct(v1, v2);
            double rad = Math.Acos(cos);
            return rad;
        }
    }
}