diff --git a/vector3.py b/vector3.py new file mode 100644 --- /dev/null +++ b/vector3.py @@ -0,0 +1,89 @@ +import math + + +class Vector3: + + def __init__(self,x,y,z): + self.x=x + self.y=y + self.z=z + + def __add__(self,v): + return Vector3(self.x+v.x, self.y+v.y, self.z+v.z) + + def __iadd__(self,v): + self.x+=v.x + self.y+=v.y + self.z+=v.z + return self + + def __sub__(self,v): + return Vector3(self.x-v.x, self.y-v.y, self.z-v.z) + + def __isub__(self,v): + self.x-=v.x + self.y-=v.y + self.z-=v.z + return self + + def __neg__(self): + return Vector3(-self.x, -self.y, -self.z) + + def __mul__(self,a): # scalar or dot product + if isinstance(a,Vector3): + return self.x*a.x + self.y*a.y + self.z*a.z + else: + return Vector3(self.x*a, self.y*a, self.z*a) + + def __imul__(self,a): + if isinstance(a,Vector3): raise BadOperandError(self,a,'attempted in-place dot multiplication') + self.x*=a + self.y*=a + self.z*=a + return self + + def __rmul__(self,a): + return self.__mul__(a) + + def __truediv__(self,a): + return Vector3(self.x/a, self.y/a, self.z/a) + + def __itruediv__(self,a): + self.x/=a + self.y/=a + self.z/=a + return self + + def __floordiv__(self,a): + return Vector3(self.x//a, self.y//a, self.z//a) + + def __ifloordiv__(self,a): + self.x//=a + self.y//=a + self.z//=a + return self + + def __xor__(self,v): # vector cross product + return Vector3(self.y*v.z-self.z*v.y, self.z*v.x-self.x*v.z, self.x*v.y-self.y*v.x) + + def __ixor__(self,v): + self.x=self.y*v.z-self.z*v.y + self.y=self.z*v.x-self.x*v.z + self.z=self.x*v.y-self.y*v.x + return self + + def __abs__(self): + return math.sqrt(self.x*self.x + self.y*self.y + self.z*self.z) + + def __str__(self): + return str((self.x,self.y,self.z)) + + def __repr__(self): + return 'Vector3'+self.__str__() + + +class BadOperandError(ArithmeticError): + def __init__(self,u,v,message): + self.u=u + self.v=v + self.message=message