#include"ps_vector.h"
#include<cstdio>

vec2 operator*(double i, vec2 &obj){
	vec2 tmp;
	tmp.set(i*obj.getx(),i*obj.gety());
	return tmp;
}



 
vec2::vec2(void){
    m_x=0;
    m_y=0;
}
 
vec2::vec2(double x,double y){
    set(x,y);
}
 
void vec2::set(double x,double y){
    m_x=x;
    m_y=y;
}
 
vec2 vec2::operator+(const vec2 &obj){
    vec2 tmp;
    tmp.m_x=m_x+obj.m_x;
    tmp.m_y=m_y+obj.m_y;
 
    return tmp;
}

vec2 vec2::operator+=(const vec2 &obj){
	m_x+=obj.m_x;
	m_y+=obj.m_y;

	return *this;
}


vec2 vec2::operator-(const vec2 &obj){
	vec2 tmp;
	tmp.m_x=m_x-obj.m_x;
	tmp.m_y=m_y-obj.m_y;

	return tmp;
}

vec2 vec2::operator/(const double &obj){
	vec2 tmp;
	if(obj!=0){
		tmp.m_x=m_x/obj;
		tmp.m_y=m_y/obj;
		return tmp;
	}
	else if(obj==0){
		try {
		throw "0では割れません\n";
		}
		catch (char *str) {
			printf( str);
		}
	}

	 return tmp;
}


vec2 vec2::operator*(const double &obj){
	vec2 tmp;
	tmp.m_x=m_x*obj;
	tmp.m_y=m_y*obj;
	return tmp;
}


double vec2::operator*(const vec2 &obj){
	double tmp;
	tmp=m_x*obj.m_x+m_y*obj.m_y;
	return tmp;
}

double vec2::operator|(const vec2 &obj){
	double tmp;
	tmp=m_x*obj.m_y-m_y*obj.m_x;
	return tmp;
}


vec3::vec3(void){
    m_x=0;
    m_y=0;
	m_z=0;
}
 
vec3::vec3(double x,double y,double z){
    set(x,y,z);
}
 
void vec3::set(double x,double y,double z){
    m_x=x;
    m_y=y;
	m_z=z;
}
 
vec3 vec3::operator+(const vec3 &obj){
    vec3 tmp;
    tmp.m_x=m_x+obj.m_x;
    tmp.m_y=m_y+obj.m_y;
	tmp.m_z=m_z+obj.m_z;
 
    return tmp;
}

vec3 vec3::operator+=(const vec3 &obj){
	m_x+=obj.m_x;
	m_y+=obj.m_y;
	m_z+=obj.m_z;

	return *this;
}


vec3 vec3::operator-(const vec3 &obj){
	vec3 tmp;
	tmp.m_x=m_x-obj.m_x;
	tmp.m_y=m_y-obj.m_y;
	tmp.m_z=m_z-obj.m_z;

	return tmp;
}

vec3 vec3::operator/(const double &obj){
	vec3 tmp;
	if(obj!=0){
		tmp.m_x=m_x/obj;
		tmp.m_y=m_y/obj;
		tmp.m_z=m_z/obj;
		return tmp;
	}
	else if(obj==0){
		try {
		throw "0では割れません\n";
		}
		catch (char *str) {
			printf( str);
		}
	}
	 return tmp;
}


double vec3::operator*(const vec3 &obj){
	double tmp;
	tmp=m_x*obj.m_x+m_y*obj.m_y+m_z*obj.m_z;
	return tmp;
}

vec3 vec3::operator|(const vec3 &obj){
	vec3 tmp;
	tmp.m_x=m_y*obj.m_z-m_z*obj.m_y;
	tmp.m_y=m_z*obj.m_x-m_x*obj.m_z;
	tmp.m_z=m_x*obj.m_y-m_y*obj.m_x;
	return tmp;
}

vec3 operator*(double i, vec3 &obj){
	vec3 tmp;
	tmp.set(i*obj.getx(),i*obj.gety(),i*obj.getz());
	return tmp;
}


