Ejemplo n.º 1
0
        public Quaternion4d(Vector3d axis, double angle)
        {
            var axisN = axis.Normalized();

            var a    = angle * 0.5;
            var sina = Math.Sin(a);
            var cosa = Math.Cos(a);

            x = axisN.x * sina;
            y = axisN.y * sina;
            z = axisN.z * sina;
            w = cosa;
        }
Ejemplo n.º 2
0
        public Quaternion4d(Vector3d to, Vector3d from)
        {
            var f = from.Normalized();
            var t = to.Normalized();

            var dotProdPlus1 = 1.0 + f.Dot(t);

            if (dotProdPlus1 < 1e-7)
            {
                w = 0;

                if (Math.Abs(f.x) < 0.6)
                {
                    var norm = Math.Sqrt(1 - f.x * f.x);

                    x = 0;
                    y = f.z / norm;
                    z = -f.y / norm;
                }
                else if (Math.Abs(f.y) < 0.6)
                {
                    var norm = Math.Sqrt(1 - f.y * f.y);

                    x = -f.z / norm;
                    y = 0;
                    z = f.x / norm;
                }
                else
                {
                    var norm = Math.Sqrt(1 - f.z * f.z);

                    x = f.y / norm;
                    y = -f.x / norm;
                    z = 0;
                }
            }
            else
            {
                var s   = Math.Sqrt(0.5 * dotProdPlus1);
                var tmp = (f.Cross(t)) / (2.0 * s);

                x = tmp.x;
                y = tmp.y;
                z = tmp.z;
                w = s;
            }
        }