Matrix3D.cs
上传用户:huazai0421
上传日期:2008-05-30
资源大小:405k
文件大小:7k
源码类别:

SilverLight

开发平台:

C#

  1. // Silver.Globe, version 0.11 for Silverlight 1.1 Alpha
  2. // Copyright © Florian Krüsch (xaml-kru.com)
  3. // xaml-kru.com/silverglobe
  4. // This source is subject to the Microsoft Public License (Ms-PL).
  5. // See http://www.microsoft.com/resources/sharedsource/licensingbasics/publiclicense.mspx.
  6. // All other rights reserved.
  7. using System;
  8. namespace SilverGlobe.Math3D
  9. {
  10.     /// <summary>
  11.     /// Represents a 4x4 matrix.
  12.     /// </summary>
  13.     public struct Matrix3D
  14.     {
  15.         #region Members
  16.         private Double _m11, _m12, _m13, _m14, _m21, _m22, _m23, _m24, _m31, _m32, _m33, _m34, _offsetX, _offsetY, _offsetZ, _m44;
  17.         #endregion
  18.         #region Properties
  19.         public Double M11 
  20.         { 
  21.             get { return _m11; } 
  22.             set { _m11 = value; } 
  23.         }
  24.         public Double M12
  25.         {
  26.             get { return _m12; }
  27.             set { _m12 = value; }
  28.         }
  29.         public Double M13
  30.         {
  31.             get { return _m13; }
  32.             set { _m13 = value; }
  33.         }
  34.         public Double M14
  35.         {
  36.             get { return _m14; }
  37.             set { _m14 = value; }
  38.         }
  39.         public Double M21
  40.         {
  41.             get { return _m21; }
  42.             set { _m21 = value; }
  43.         }
  44.         public Double M22
  45.         {
  46.             get { return _m22; }
  47.             set { _m22 = value; }
  48.         }
  49.         public Double M23
  50.         {
  51.             get { return _m23; }
  52.             set { _m23 = value; }
  53.         }
  54.         public Double M24
  55.         {
  56.             get { return _m24; }
  57.             set { _m24 = value; }
  58.         }
  59.         public Double M31
  60.         {
  61.             get { return _m31; }
  62.             set { _m31 = value; }
  63.         }
  64.         public Double M32
  65.         {
  66.             get { return _m32; }
  67.             set { _m32 = value; }
  68.         }
  69.         public Double M33
  70.         {
  71.             get { return _m33; }
  72.             set { _m33 = value; }
  73.         }
  74.         public Double M34
  75.         {
  76.             get { return _m34; }
  77.             set { _m34 = value; }
  78.         }
  79.         public Double OffsetX
  80.         {
  81.             get { return _offsetX; }
  82.             set { _offsetX = value; }
  83.         }
  84.         public Double OffsetY
  85.         {
  86.             get { return _offsetY; }
  87.             set { _offsetY = value; }
  88.         }
  89.         public Double OffsetZ
  90.         {
  91.             get { return _offsetZ; }
  92.             set { _offsetZ = value; }
  93.         }
  94.         public Double M44
  95.         {
  96.             get { return _m44; }
  97.             set { _m44 = value; }
  98.         }
  99.         #endregion
  100.         #region Constancts
  101.         /// <summary>
  102.         /// The identity matrix.
  103.         /// </summary>
  104.         public static readonly Matrix3D Identity = new Matrix3D { M11 = 1, M22 = 1, M33 = 1, M44 = 1 };
  105.         #endregion
  106.         #region Constructor
  107.         public Matrix3D(Double m11, Double m12, Double m13, Double m14,
  108.                         Double m21, Double m22, Double m23, Double m24,
  109.                         Double m31, Double m32, Double m33, Double m34,
  110.                         Double offsetX, Double offsetY, Double offsetZ, Double m44)
  111.         {
  112.             _m11 = m11; _m12 = m12; _m13 = m13; _m14 = m14;
  113.             _m21 = m21; _m22 = m22; _m23 = m23; _m24 = m24;
  114.             _m31 = m31; _m32 = m32; _m33 = m33; _m34 = m34;
  115.             _offsetX = offsetX; _offsetY = offsetY; _offsetZ = offsetZ; _m44 = m44;
  116.         }
  117.         #endregion
  118.         #region Methods
  119.         /// <summary>
  120.         /// Add a scale vector to the matrix.
  121.         /// </summary>
  122.         public Matrix3D Scale(Vector3D scale)
  123.         {
  124.             _m11 *= scale.X;
  125.             _m12 *= scale.Y;
  126.             _m13 *= scale.Z;
  127.             _m21 *= scale.X;
  128.             _m22 *= scale.Y;
  129.             _m23 *= scale.Z;
  130.             _m31 *= scale.X;
  131.             _m32 *= scale.Y;
  132.             _m33 *= scale.Z;
  133.             _offsetX *= scale.X;
  134.             _offsetY *= scale.Y;
  135.             _offsetZ *= scale.Z;
  136.             return this;
  137.         }
  138.         /// <summary>
  139.         /// Add a translation to the matrix.
  140.         /// </summary>
  141.         public Matrix3D Translate(Vector3D offset)
  142.         {
  143.             M11 += M14 * offset.X;
  144.             M12 += M14 * offset.Y;
  145.             M13 += M14 * offset.Z;
  146.             M21 += M24 * offset.X;
  147.             M22 += M24 * offset.Y;
  148.             M23 += M24 * offset.Z;
  149.             M31 += M34 * offset.X;
  150.             M32 += M34 * offset.Y;
  151.             M33 += M34 * offset.Z;
  152.             OffsetX += M44 * offset.X;
  153.             OffsetY += M44 * offset.Y;
  154.             OffsetZ += M44 * offset.Z;
  155.             return this;
  156.         }
  157.         /// <summary>
  158.         /// Multiplies a point array with the matrix. 
  159.         /// </summary>
  160.         public Point3D[] Transform(Point3D[] points)
  161.         {
  162.             Point3D[] outPoints = new Point3D[points.Length];
  163.             for (int i = 0; i < points.Length; i++)
  164.             {
  165.                 outPoints[i] = this * points[i];
  166.             }
  167.             return outPoints;
  168.         }
  169.         #endregion
  170.         #region Operatiors
  171.         public static Matrix3D operator *(Matrix3D a, Matrix3D b)
  172.         {
  173.             return new Matrix3D
  174.                    (
  175.                        a._m11 * b._m11 + a._m12 * b._m21 + a._m13 * b._m31 + a._m14 * b._offsetX,
  176.                        a._m11 * b._m12 + a._m12 * b._m22 + a._m13 * b._m32 + a._m14 * b._offsetY,
  177.                        a._m11 * b._m13 + a._m12 * b._m23 + a._m13 * b._m33 + a._m14 * b._offsetZ,
  178.                        a._m11 * b._m14 + a._m12 * b._m24 + a._m13 * b._m34 + a._m14 * b._m44,
  179.                        a._m21 * b._m11 + a._m22 * b._m21 + a._m23 * b._m31 + a._m24 * b._offsetX,
  180.                        a._m21 * b._m12 + a._m22 * b._m22 + a._m23 * b._m32 + a._m24 * b._offsetY,
  181.                        a._m21 * b._m13 + a._m22 * b._m23 + a._m23 * b._m33 + a._m24 * b._offsetZ,
  182.                        a._m21 * b._m14 + a._m22 * b._m24 + a._m23 * b._m34 + a._m24 * b._m44,
  183.                        a._m31 * b._m11 + a._m32 * b._m21 + a._m33 * b._m31 + a._m34 * b._offsetX,
  184.                        a._m31 * b._m12 + a._m32 * b._m22 + a._m33 * b._m32 + a._m34 * b._offsetY,
  185.                        a._m31 * b._m13 + a._m32 * b._m23 + a._m33 * b._m33 + a._m34 * b._offsetZ,
  186.                        a._m31 * b._m14 + a._m32 * b._m24 + a._m33 * b._m34 + a._m34 * b._m44,
  187.                        a._offsetX * b._m11 + a._offsetY * b._m21 + a._offsetZ * b._m31 + a._m44 * b._offsetX,
  188.                        a._offsetX * b._m12 + a._offsetY * b._m22 + a._offsetZ * b._m32 + a._m44 * b._offsetY,
  189.                        a._offsetX * b._m13 + a._offsetY * b._m23 + a._offsetZ * b._m33 + a._m44 * b._offsetZ,
  190.                        a._offsetX * b._m14 + a._offsetY * b._m24 + a._offsetZ * b._m34 + a._m44 * b._m44
  191.                    );
  192.         }
  193.         public static Point3D operator *(Matrix3D m, Point3D point)
  194.         {
  195.             Double x = point.X, y = point.Y, z = point.Z;
  196.             Point3D p = new Point3D(x * m._m11 + y * m._m21 + z * m._m31 + m._offsetX,
  197.                                     x * m._m12 + y * m._m22 + z * m._m32 + m._offsetY,
  198.                                     x * m._m13 + y * m._m23 + z * m._m33 + m._offsetZ);
  199.             Double k = x * m._m14 + y * m._m24 + z * m._m34 + m._m44;
  200.             
  201.             return p * (1 / k);
  202.         }
  203.         #endregion
  204.     }
  205. }