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