Mega Code Archive

 
Categories / C# / Data Types
 

Inverts a Matrix

//----------------------------------------------------------------------- // <copyright file="Extensions.cs" company="Microsoft Corporation copyright 2008."> // (c) Copyright Microsoft Corporation. // This source is subject to the Microsoft Public License (Ms-PL). // Please see http://go.microsoft.com/fwlink/?LinkID=131993 for details. // All other rights reserved. // </copyright> // <date>26-Feb-2009</date> // <summary>Extensions class.</summary> //----------------------------------------------------------------------- namespace Blacklight.Controls {     using System;     using System.Windows;     using System.Windows.Media;     /// <summary>     /// This set of internal extension methods provide general solutions and      /// utilities in a small enough number to not warrant a dedicated extension     /// methods class.     /// </summary>     internal static partial class Extensions     {         /// <summary>         /// Inverts a Matrix. The Invert functionality on the Matrix type is          /// internal to the framework only. Since Matrix is a struct, an out          /// parameter must be presented.         /// </summary>         /// <param name="m">The Matrix object.</param>         /// <param name="outputMatrix">The matrix to return by an output          /// parameter.</param>         /// <returns>Returns a value indicating whether the type was          /// successfully inverted. If the determinant is 0.0, then it cannot          /// be inverted and the original instance will remain untouched.</returns>         public static bool Invert(this Matrix m, out Matrix outputMatrix)         {             double determinant = m.M11 * m.M22 - m.M12 * m.M21;             if (determinant == 0.0)             {                 outputMatrix = m;                 return false;             }             Matrix matCopy = m;             m.M11 = matCopy.M22 / determinant;             m.M12 = -1 * matCopy.M12 / determinant;             m.M21 = -1 * matCopy.M21 / determinant;             m.M22 = matCopy.M11 / determinant;             m.OffsetX = (matCopy.OffsetY * matCopy.M21 - matCopy.OffsetX * matCopy.M22) / determinant;             m.OffsetY = (matCopy.OffsetX * matCopy.M12 - matCopy.OffsetY * matCopy.M11) / determinant;             outputMatrix = m;             return true;         }         /// <summary>         /// An implementation of the Contains member of string that takes in a          /// string comparison. The traditional .NET string Contains member uses          /// StringComparison.Ordinal.         /// </summary>         /// <param name="s">The string.</param>         /// <param name="value">The string value to search for.</param>         /// <param name="comparison">The string comparison type.</param>         /// <returns>Returns true when the substring is found.</returns>         public static bool Contains(this string s, string value, StringComparison comparison)         {             return s.IndexOf(value, comparison) >= 0;         }     } }