gazesim/code/vector.py

72 lines
1.9 KiB
Python
Raw Normal View History

2016-03-09 19:52:35 +01:00
from math import sqrt
from numpy import array
2016-04-28 18:14:38 +02:00
'''
Vector object has the same functionality as VPython's vector.
this module is used when only vector processing is required and
VPython is not available (e.g. non-Windows platforms)
'''
2016-03-09 19:52:35 +01:00
class Vector:
x, y, z = (0.0, 0.0, 0.0)
def __init__(self, *xyz):
if len(xyz) == 1:
xyz = xyz[0]
if isinstance(xyz, Vector):
self.x, self.y, self.z = xyz.x, xyz.y, xyz.z
else:
if len(xyz) == 2: xyz = xyz[0], xyz[1], 0
self.x, self.y, self.z = xyz
self.__update__()
def __update__(self):
self.mag = sqrt(self.x**2 + self.y**2 + self.z**2)
def norm(self):
return Vector(self.x/self.mag, self.y/self.mag, self.z/self.mag)
def dot(self, other):
return self.x*other.x + self.y*other.y + self.z*other.z
def cross(self, other):
return Vector(self.y*other.z - self.z*other.y,
self.z*other.x - self.x*other.z,
self.x*other.y - self.y*other.x)
def tuple(self):
return self.x, self.y, self.z
def __array__(self):
return array(self.tuple())
def __radd__(self, other):
return self.__add__(other)
def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y, self.z + other.z)
def __rsub__(self, other):
return self.__sub__(other)
def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y, self.z - other.z)
def __rtruediv__(self, scalar):
return self.__div__(scalar)
def __rfloordiv__(self, scalar):
return self.__div__(scalar)
def __truediv__(self, scalar):
return self.__div__(scalar)
def __floordiv__(self, scalar):
return self.__div__(scalar)
def __div__(self, scalar):
scalar = float(scalar)
return Vector(self.x/scalar, self.y/scalar, self.z/scalar)
def __mul__(self, scalar):
return self.__rmul__(scalar)
def __rmul__(self, scalar):
return Vector(self.x*scalar, self.y*scalar, self.z*scalar)
def __neg__(self):
return self*-1
def __repr__(self):
return '({0}, {1}, {2})'.format(self.x, self.y, self.z)