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 }