Mega Code Archive

 
Categories / C# / Development Class
 

Vector class

using System; using System.Collections.Generic; using System.Text; using System.ComponentModel; namespace CJC.DynamicsEngine.Engine.Util {   /**    * CJC.DynamicsEngine - 2D Dynamics Engine    * Release 0.1 alpha     * Vector class    * Copyright 2007 Chris Cavanagh    *     * Based on Flade source code by Alec Cove.    *     * CJC.DynamicsEngine is free software; you can redistribute it and/or modify    * it under the terms of the GNU General Public License as published by    * the Free Software Foundation; either version 2 of the License, or    * (at your option) any later version.    *    * CJC.DynamicsEngine is distributed in the hope that it will be useful,    * but WITHOUT ANY WARRANTY; without even the implied warranty of    * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    * GNU General Public License for more details.    *    * You should have received a copy of the GNU General Public License    * along with CJC.DynamicsEngine; if not, write to the Free Software    * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA    */   public class Vector : INotifyPropertyChanged   {     private static double atanZero = Math.Atan2( 0, 0 );     private double x;     private double y;     public Vector( double px, double py )     {       x = px;       y = py;     }     public Vector Clone()     {       return new Vector( x, y );     }     public void Set( double px, double py )     {       x = px;       y = py;     }     public void Copy( Vector v )     {       x = v.x;       y = v.y;     }     public double Dot( Vector v )     {       return x * v.x + y * v.y;     }         public double Cross( Vector v )     {       return x * v.y - y * v.x;     }     public Vector Plus( Vector v )     {       x += v.x;       y += v.y;       return this;     }     public Vector PlusNew( Vector v )     {       return new Vector( x + v.x, y + v.y );      }         public Vector Minus( Vector v )     {       x -= v.x;       y -= v.y;       return this;     }     public Vector MinusNew( Vector v )     {       return new Vector( x - v.x, y - v.y );     }     public Vector Mult( double s )     {       x *= s;       y *= s;       return this;     }     public Vector MultNew( double s )     {       return new Vector( x * s, y * s );     }     public double Distance( Vector v )     {       double dx = x - v.x;       double dy = y - v.y;       return Math.Sqrt( dx * dx + dy * dy );     }     public Vector Normalize()     {        double mag = Math.Sqrt( x * x + y * y );        x /= mag;        y /= mag;        return this;     }          public double Magnitude()     {       return Math.Sqrt( x * x + y * y );     }     /**      * projects this vector onto b      */     public Vector Project( Vector b )     {       double adotb = this.Dot( b );       double len = ( b.x * b.x + b.y * b.y );       Vector proj = new Vector( 0, 0 );       proj.x = ( adotb / len ) * b.x;       proj.y = ( adotb / len ) * b.y;       return proj;     }     public Vector Rotate( double angle )     {       double sin = Math.Sin( angle );       double cos = Math.Cos( angle );       return new Vector( x * cos - y * sin, x * sin + y * cos );     }     public double Angle     {       get { return Math.Atan2( y, x ) - atanZero; }     }     public void OnPropertyChanged( string propertyName )     {       if ( PropertyChanged != null ) PropertyChanged( this, new PropertyChangedEventArgs( propertyName ) );     }     public double X { get { return x; } set { x = value; } }     public double Y { get { return y; } set { y = value; } }     #region INotifyPropertyChanged Members     public event PropertyChangedEventHandler PropertyChanged;     #endregion   } }