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(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);
        }
        #endregion

    }
#endregion
}