// created on 07/11/2005 at 13:56 using System; using System.Drawing; [Serializable] public class Vector{ private float fX; private float fY; private float fZ; public Vector(){ fX = 0.0f; fY = 0.0f; fZ = 0.0f; } public Vector(float x, float y, float z){ fX = x; fY = y; fZ = z; } public float X{ get { return fX; } set { fX = value; } } public float Y{ get { return fY; } set { fY = value; } } public float Z{ get { return fZ; } set { fZ = value; } } public static bool operator ==(Vector v1, Vector v2){ return (v1.X == v2.X && v1.Y == v2.Y && v1.Z == v2.Z); //W } public static bool operator !=(Vector v1, Vector v2){ return (v1.X != v2.X || v1.Y != v2.Y || v1.Z != v2.Z); //W } public static Vector operator +(Vector v1, Vector v2){ return new Vector(v1.X+v2.X, v1.Y+v2.Y, v1.Z+v2.Z); } public static Vector operator -(Vector v1, Vector v2){ return new Vector(v1.X-v2.X, v1.Y-v2.Y, v1.Z-v2.Z); } public static Vector operator -(Vector v1){ return new Vector(-v1.X, -v1.Y, -v1.Z); } public static Vector operator *(Vector v1, float fTimes){ return new Vector(v1.X * fTimes, v1.Y * fTimes, v1.Z * fTimes); } public static Vector operator *(float fTimes, Vector v1){ return new Vector(v1.X * fTimes, v1.Y * fTimes, v1.Z * fTimes); } public static Vector operator /(Vector v1, float fTimes){ return new Vector(v1.X / fTimes, v1.Y / fTimes, v1.Z / fTimes); } public static Vector operator /(float fTimes, Vector v1){ return new Vector(v1.X / fTimes, v1.Y / fTimes, v1.Z / fTimes); } public float Magnitude(){ return (float)Math.Sqrt(((fX * fX) + (fY * fY) + (fZ * fZ))); } public Vector Normalise(){ if (fX == 0.0f && fX == 0.0f && fZ == 0.0f){ return new Vector(0.0f, 0.0f, 0.0f); } float mag = this.Magnitude(); return new Vector(fX/mag, fY/mag, fZ/mag); } public void NormaliseThis(){ float mag = this.Magnitude(); fX /= mag; fY /= mag; fZ /= mag; } public float DotProd(Vector v2){ return ((fX*v2.X) + (fY*v2.Y) + (fZ*v2.Z)); } public float AngleBetween(Vector v2){ float U = this.Magnitude(); float V = v2.Magnitude(); return (float)(Math.Acos(((fX*v2.X) + (fY*v2.Y) + (fZ*v2.Z))/(U*V))); } public Vector Normal(Vector v2){ return new Vector((fY*v2.Z)-(fZ*v2.Y), (fZ*v2.X)-(fX*v2.Z), (fX*v2.Y)-(fY*v2.X)); } public Vector CrossProd(Vector v2){ return this.Normal(v2); } public Point To2DPointFromXY(){ return new Point((int)fX, (int)fY); } public void Print(){ Console.WriteLine("X: " + fX); Console.WriteLine("Y: " + fY); Console.WriteLine("Z: " + fZ); } }