109 lines
2.4 KiB
Python
109 lines
2.4 KiB
Python
class Vec3:
|
|
def __init__(self, x=0, y=0, z=0):
|
|
self.x = x
|
|
self.y = y
|
|
self.z = z
|
|
|
|
def __add__(self, rhs):
|
|
c = self.clone()
|
|
c += rhs
|
|
return c
|
|
|
|
def __iadd__(self, rhs):
|
|
self.x += rhs.x
|
|
self.y += rhs.y
|
|
self.z += rhs.z
|
|
return self
|
|
|
|
def length(self):
|
|
return self.lengthSqr ** .5
|
|
|
|
def lengthSqr(self):
|
|
return self.x * self.x + self.y * self.y + self.z * self.z
|
|
|
|
def __mul__(self, k):
|
|
c = self.clone()
|
|
c *= k
|
|
return c
|
|
|
|
def __imul__(self, k):
|
|
self.x *= k
|
|
self.y *= k
|
|
self.z *= k
|
|
return self
|
|
|
|
def clone(self):
|
|
return Vec3(self.x, self.y, self.z)
|
|
|
|
def __neg__(self):
|
|
return Vec3(-self.x, -self.y, -self.z)
|
|
|
|
def __sub__(self, rhs):
|
|
return self.__add__(-rhs)
|
|
|
|
def __isub__(self, rhs):
|
|
return self.__iadd__(-rhs)
|
|
|
|
def __repr__(self):
|
|
return "Vec3(%s,%s,%s)"%(self.x,self.y,self.z)
|
|
|
|
def __iter__(self):
|
|
return iter((self.x, self.y, self.z))
|
|
|
|
def _map(self, func):
|
|
self.x = func(self.x)
|
|
self.y = func(self.y)
|
|
self.z = func(self.z)
|
|
|
|
def __cmp__(self, rhs):
|
|
dx = self.x - rhs.x
|
|
if dx != 0: return dx
|
|
dy = self.y - rhs.y
|
|
if dy != 0: return dy
|
|
dz = self.z - rhs.z
|
|
if dz != 0: return dz
|
|
return 0
|
|
|
|
def iround(self): self._map(lambda v:int(v+0.5))
|
|
def ifloor(self): self._map(int)
|
|
|
|
def rotateLeft(self): self.x, self.z = self.z, -self.x
|
|
def rotateRight(self): self.x, self.z = -self.z, self.x
|
|
|
|
def testVec3():
|
|
# Note: It's not testing everything
|
|
|
|
# 1.1 Test initialization
|
|
it = Vec3(1, -2, 3)
|
|
assert it.x == 1
|
|
assert it.y == -2
|
|
assert it.z == 3
|
|
|
|
assert it.x != -1
|
|
assert it.y != +2
|
|
assert it.z != -3
|
|
|
|
# 2.1 Test cloning and equality
|
|
clone = it.clone()
|
|
assert it == clone
|
|
it.x += 1
|
|
assert it != clone
|
|
|
|
# 3.1 Arithmetic
|
|
a = Vec3(10, -3, 4)
|
|
b = Vec3(-7, 1, 2)
|
|
c = a + b
|
|
assert c - a == b
|
|
assert c - b == a
|
|
assert a + a == a * 2
|
|
|
|
assert a - a == Vec3(0,0,0)
|
|
assert a + (-a) == Vec3(0,0,0)
|
|
|
|
# Test repr
|
|
e = eval(repr(it))
|
|
assert e == it
|
|
|
|
if __name__ == "__main__":
|
|
testVec3()
|