double v2::dot(const v2& p) const { return internal_x*p.x()+internal_y*p.y(); }
v2 v2::product_compontentwise(const v2& p) const { return v2(internal_x*p.x(),internal_y*p.y()); }
v2 operator*(const double& s,const v2& p) { return v2(p.x()*s,p.y()*s); }
v2 operator-(const double& s,const v2& p) { return v2(s-p.x(),s-p.y()); }
v2 v2::operator-(const v2& p2) const { return v2(x()-p2.x(),y()-p2.y()); }
v2 operator+(const double& s,const v2& p) { return v2(s+p.x(),s+p.y()); }