/// <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); }