Esempio n. 1
0
        /// <summary>
        /// Rotate around an axis. Angle in degrees.
        /// </summary>
        /// <param name="angle"></param>
        /// <param name="axis"></param>
        public void RotateAboutOrigin(double angle, IVector3D axis)
        {
            axis.Norm();
            double a    = angle * Math.PI / 180;
            double cosA = Math.Cos(a);
            double sinA = Math.Sin(a);
            double xx   = Math.Pow(axis.X, 2);
            double yy   = Math.Pow(axis.Y, 2);
            double zz   = Math.Pow(axis.Z, 2);
            double xy   = axis.X * axis.Y;
            double yz   = axis.Y * axis.Z;
            double xz   = axis.X * axis.Z;

            double[][] data = new double[4][];
            data[0] = new double[] { xx + (1 - xx) * cosA, xy *(1 - cosA) - axis.Z * sinA, xz *(1 - cosA) + axis.Y * sinA, 0 };
            data[1] = new double[] { xy *(1 - cosA) + axis.Z * sinA, yy + (1 - yy) * cosA, yz *(1 - cosA) - axis.X * sinA, 0 };
            data[2] = new double[] { xz *(1 - cosA) - axis.Y * sinA, yz *(1 - cosA) + axis.X * sinA, zz + (1 - zz) * cosA, 0 };
            data[3] = new double[] { 0, 0, 0, 1 };
            IMatrix m = new IMatrix(data);

            TransformationMatrix = IMatrix.Mult(TransformationMatrix, m);
        }