/// <summary>
 /// 
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public bool IsParallel(Vector2D v)
 {
     return 0d == RobustDeterminant.SignOfDet2x2(_x, _y, v._x, v._y);
 }
 /// <summary>
 /// Creates a new vector instance based on <paramref name="v"/>.
 /// </summary>
 /// <param name="v">The vector</param>
 public Vector2D(Vector2D v)
 {
     _x = v._x;
     _y = v._y;
 }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="v"></param>
        /// <returns></returns>
        public double AngleTo(Vector2D v)
        {
            var a1 = Angle();
            var a2 = v.Angle();
            var angDel = a2 - a1;

            // normalize, maintaining orientation
            if (angDel <= -System.Math.PI)
                return angDel + AngleUtility.PiTimes2;
            if (angDel > System.Math.PI)
                return angDel - AngleUtility.PiTimes2;
            return angDel;
        }
 /// <summary>
 /// Creates a new vector from an existing one.
 /// </summary>
 /// <param name="v">The vector to copy</param>
 /// <returns>A new vector</returns>
 public static Vector2D Create(Vector2D v)
 {
     return new Vector2D(v);
 }
 /// <summary>
 /// Computes the dot-product of two vectors
 /// </summary>
 /// <param name="v">A vector</param>
 /// <returns>The dot product of the vectors</returns>
 public double Dot(Vector2D v)
 {
     return _x * v._x + _y * v._y;
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public double Angle(Vector2D v)
 {
     return AngleUtility.Diff(v.Angle(), Angle());
 }
 /// <summary>
 /// Computes the distance between this vector and another one.
 /// </summary>
 /// <param name="v">A vector</param>
 /// <returns>The distance between the vectors</returns>
 public double Distance(Vector2D v)
 {
     double delx = v._x - _x;
     double dely = v._y - _y;
     return System.Math.Sqrt(delx * delx + dely * dely);
 }
 /// <summary>
 /// Computes the weighted sum of this vector
 /// with another vector,
 /// with this vector contributing a fraction
 /// of <tt>frac</tt> to the total.
 /// <para/>
 /// In other words, 
 /// <pre>
 /// sum = frac * this + (1 - frac) * v
 /// </pre>
 /// </summary>
 /// <param name="v">The vector to sum</param>
 /// <param name="frac">The fraction of the total contributed by this vector</param>
 /// <returns>The weighted sum of the two vectors</returns>
 public Vector2D WeightedSum(Vector2D v, double frac)
 {
     return Create(
             frac * _x + (1.0 - frac) * v._x,
             frac * _y + (1.0 - frac) * v._y);
 }
 /// <summary>
 /// 
 /// </summary>
 /// <param name="v"></param>
 /// <returns></returns>
 public Vector2D Average(Vector2D v)
 {
     return WeightedSum(v, 0.5);
 }
 /// <summary>
 /// Subtracts <paramref name="v"/> from this vector instance
 /// </summary>
 /// <param name="v">The vector to subtract</param>
 /// <returns>The result vector</returns>
 public Vector2D Subtract(Vector2D v)
 {
     return Create(_x - v._x, _y - v._y);
 }
 /// <summary>
 /// Adds <paramref name="v"/> to this vector instance.
 /// </summary>
 /// <param name="v">The vector to add</param>
 /// <returns>The result vector</returns>
 public Vector2D Add(Vector2D v)
 {
     return Create(_x + v._x, _y + v._y);
 }