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

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 vector in 3D space.
  12.     /// </summary>
  13.     public struct Vector3D : IEquatable<Vector3D>
  14.     {
  15.         #region Members
  16.         private Double _x, _y, _z;
  17.         #endregion
  18.         #region Properties
  19.         public Double X 
  20.         {
  21.             get { return _x; }
  22.             set { _x = value; }
  23.         }
  24.         public Double Y
  25.         {
  26.             get { return _y; }
  27.             set { _y = value; }
  28.         }
  29.         public Double Z
  30.         {
  31.             get { return _z; }
  32.             set { _z = value; }
  33.         }
  34.         /// <summary>
  35.         /// The length of the vector.
  36.         /// </summary>
  37.         public Double Length
  38.         {
  39.             get { return Math.Sqrt(_x * _x + _y * _y + _z * _z); }
  40.         }
  41.         /// <summary>
  42.         /// The normal vector of the given vector.
  43.         /// </summary>
  44.         public Vector3D Normalized
  45.         {
  46.             get
  47.             {
  48.                 if (this == Vector3D.Empty) return Vector3D.Empty;
  49.                 return this / Length;
  50.             }
  51.         }
  52.         #endregion
  53.         #region Constants
  54.         /// <summary>
  55.         /// The null vector.
  56.         /// </summary>
  57.         public static readonly Vector3D Empty = new Vector3D();
  58.         /// <summary>
  59.         /// The x-axis base vector.
  60.         /// </summary>
  61.         public static readonly Vector3D XAxis = new Vector3D(1, 0, 0);
  62.         /// <summary>
  63.         /// The y-axis base vector.
  64.         /// </summary>
  65.         public static readonly Vector3D YAxis = new Vector3D(0, 1, 0);
  66.         /// <summary>
  67.         /// The z-axis base vector.
  68.         /// </summary>
  69.         public static readonly Vector3D ZAxis = new Vector3D(0, 0, 1);
  70.         #endregion
  71.         #region Constructor
  72.         public Vector3D(Double x, Double y, Double z)
  73.         {
  74.             _x = x;
  75.             _y = y;
  76.             _z = z;
  77.         }
  78.         #endregion
  79.         #region Methods 
  80.         /// <summary>
  81.         /// The dot product with another vector
  82.         /// </summary>
  83.         public Double Dot(Vector3D b)
  84.         {
  85.             Vector3D a = this;
  86.             return a.X * b.X + a.Y * b.Y + a.Z * b.Z;
  87.         }
  88.         #endregion
  89.         #region Equality
  90.         public override Boolean Equals(object o)
  91.         {
  92.             if (!(o is Vector3D)) return false;
  93.             return Equals((Vector3D)o);
  94.         }
  95.         public Boolean Equals(Vector3D v)
  96.         {
  97.             return Equals(this, v);
  98.         }
  99.         public static Boolean Equals(Vector3D a, Vector3D b)
  100.         {
  101.             return a._x == b._x && a._y == b._y && a._z == b._z;
  102.         }
  103.         public override Int32 GetHashCode()
  104.         {
  105.             return _x.GetHashCode() ^ _y.GetHashCode() ^ _z.GetHashCode();
  106.         }
  107.         #endregion
  108.         #region Operators
  109.         public static Vector3D operator *(Vector3D vector, Double scalar)
  110.         {
  111.             return new Vector3D(vector._x * scalar, vector._y * scalar, vector._z * scalar);
  112.         }
  113.         public static Vector3D operator /(Vector3D vector, Double scalar)
  114.         {
  115.             return vector * (1d / scalar);
  116.         }
  117.         public static Boolean operator ==(Vector3D a, Vector3D b)
  118.         {
  119.             return a._x == b._x && a._y == b._y && a._z == b._z;
  120.         }
  121.         public static Boolean operator !=(Vector3D a, Vector3D b)
  122.         {
  123.             return a._x != b._x || a._y != b._y || a._z != b._z;
  124.         }
  125.         #endregion
  126.     }
  127. }