/*
||
|| MIRIA - http://miria.codeplex.com
|| Copyright (C) 2008-2011 Generoso Martello
||
|| This program 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 3 of the License, or
|| (at your option) any later version.
||
|| This program 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 this program. If not, see
|| .
||
*/
using System;
using System.Windows;
namespace MIRIA.Utility
{
///
/// Summary description for Vector2D.
///
public struct Vector2D
{
private double x, y;
public static readonly Vector2D Empty = new Vector2D();
public Vector2D(double x, double y)
{
this.x = x;
this.y = y;
}
#region Properties
public double X
{
get { return x; }
set { x = value; }
}
public double Y
{
get { return y; }
set { y = value; }
}
#endregion
#region Object
public override bool Equals(object obj)
{
if (obj is Vector2D)
{
Vector2D v = (Vector2D)obj;
if (v.x == x && v.y == y)
return obj.GetType().Equals(this.GetType());
}
return false;
}
public override int GetHashCode()
{
return base.GetHashCode ();
}
public override string ToString()
{
return String.Format("{{X={0}, Y={1}}}", x, y);
}
#endregion
public double Norm()
{
return Math.Sqrt(x*x + y*y);
}
public static bool operator==(Vector2D u, Vector2D v)
{
if (u.X == v.x && u.y == v.y)
return true;
else
return false;
}
public static bool operator !=(Vector2D u, Vector2D v)
{
return u != v;
}
public static Vector2D operator+(Vector2D u, Vector2D v)
{
return new Vector2D(u.x + v.x, u.y + v.y);
}
public static Vector2D operator-(Vector2D u, Vector2D v)
{
return new Vector2D(u.x - v.x, u.y - v.y);
}
public static Vector2D operator*(Vector2D u, double a)
{
return new Vector2D(a*u.x, a*u.y);
}
public static Vector2D operator/(Vector2D u, double a)
{
return new Vector2D(u.x/a, u.y/a);
}
public static Vector2D operator-(Vector2D u)
{
return new Vector2D(-u.x, -u.y);
}
public static double GetAngle(Point c)
{
// angolo retta passante per l'origine
return GetAngle(c, new Point(0, 0));
}
public static double GetAngle(Point c, Point f)
{
// angolo in gradi tra i due punti c ed f - gradi
// return Math.Atan((f.X - c.X) / (f.Y - c.Y) / Math.PI * 180 );
return (180 * (1 + Math.Atan2((c.Y - f.Y), (c.X - f.X)) / Math.PI));
}
public static double Distance(Point a, Point b)
{
return Math.Sqrt(Math.Pow((a.X - b.X),2) + Math.Pow((a.Y - b.Y), 2));
}
public static Point Rotate(Point point, Point origin, double angle)
{
double X = origin.X + ((point.X - origin.X) * Math.Cos(angle) -
(point.Y - origin.Y) * Math.Sin(angle));
double Y = origin.Y + ((point.X - origin.X) * Math.Sin(angle) +
(point.Y - origin.Y) * Math.Cos(angle));
return new Point(X, Y);
}
public static Point GetPoint(Point origin, double length, double angle)
{
return new Point(origin.X + length * Math.Cos(angle),
origin.Y + length * Math.Sin(angle));
}
public static explicit operator Point(Vector2D u)
{
return new Point((float)u.x, (float)u.y);
}
public static implicit operator Vector2D(Point p)
{
return new Vector2D(p.X, p.Y);
}
}
}