bonhomeExamJanvier/Bonhomme02/Vecteur.cs

118 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Numerics;
using System.Text;
using System.Threading.Tasks;
namespace Bonhomme02
{
class Vecteur
{
#region donnée
private Vecteur parent = null;
private Complex vecteur;
#endregion
#region accesseur
public double Angle
{
get
{
if (parent != null)
return parent.Angle - Math.PI/2;
else
return vecteur.Phase;
}
set
{
if (parent != null)
{
parent.vecteur = Complex.FromPolarCoordinates(parent.vecteur.Magnitude, value);
vecteur = Complex.FromPolarCoordinates(vecteur.Magnitude, parent.Angle - Math.PI / 2);
}
else
vecteur = Complex.FromPolarCoordinates(vecteur.Magnitude, value);
}
}
public int X
{
get
{
return (int)Math.Round(vecteur.Real);
}
}
public int Y
{
get
{
return (int)Math.Round(vecteur.Imaginary);
}
}
public double ABS
{
get
{
return vecteur.Magnitude;
}
}
#endregion
#region constructeur
public Vecteur()
{
}
public Vecteur(double longueur, double angle)
{
vecteur = Complex.FromPolarCoordinates(longueur, angle);
}
public Vecteur(Point origine, Point bout)
{
vecteur = new Complex(bout.X-origine.X, bout.Y - origine.Y);
}
public Vecteur(double longueur, ref Vecteur parent, bool flag) : this(longueur, parent.Angle - Math.PI / 2)
{
this.parent = parent;
}
#region operateur
public static explicit operator Point(Vecteur v) // Rsique de perte de précision donc explicit
{
return new Point(v.X, v.Y);
}
public static implicit operator Vecteur(Point pt)
{
Complex c = new Complex(pt.X, pt.Y);
return new Vecteur(c.Magnitude, c.Phase);
}
public static Point operator +(Vecteur v, Point pt)
{
return new Point(v.X + pt.X, v.Y + pt.Y);
}
public static Point operator +(Point pt, Vecteur v)
{
return new Point(v.X + pt.X, v.Y + pt.Y);
}
public static Point operator -(Vecteur v, Point pt)
{
return new Point(v.X - pt.X, v.Y - pt.Y);
}
public static Point operator -(Point pt, Vecteur v)
{
return new Point(pt.X - v.X, pt.Y - v.Y);
}
public static Vecteur operator /(double d, Vecteur v)
{
return new Vecteur(d / v.ABS, v.Angle);
}
public static Vecteur operator /(Vecteur v, double d)
{
return new Vecteur(v.ABS / d, v.Angle);
}
#endregion
}
#endregion
}