You are here: Home / Community / Workshops / 2008 - Fribourg / Content / Shakespeare / Effect / bin / python / vector.py

vector.py

# only used by point.py, which is never used
# last updated 29-Jul-2008 -- dmreagan

from math import sqrt

import sys

class Vector2:
    def __init__(self, x = 0.0, y = 0.0):
        self.e = [float(x), float(y)]
        self.name = 'Vector2'

    def Set(self, x, y):
        self.e[0], self.e[1] = x,y

    def SetX(self, x):
        self.e[0] = x

    def SetY(self, y):
        self.e[1] = y

    def x(self): return self.e[0]
    def y(self): return self.e[1]

    def length(self):
        return sqrt( self.e[0]*self.e[0] + self.e[1]*self.e[1])
    def squaredLength(self):
        return self.e[0]*self.e[0] + self.e[1]*self.e[1]

    def MakeUnitVector(self):
        l = self.length()
        try:
            x = self.e[0]/l
            y = self.e[1]/l
        except:
            print 'Error', sys.exc_type, sys.exc_value
            sys.exit(1)

        else:
            self.e[0], self.e[1] = x,y


    def __getitem__(self, i):
        return self.e[i]
    def __setitem__(self, i, val):
        self.e[i] = val
    def __add__(self, other):
        return Vector2( self.e[0]+other[0], self.e[1] + other[1])
    def __sub__(self, other):
        return Vector2( self.e[0] - other[0], self.e[1] -  other[1])
    def __mul__(self, n):
        return Vector2( self.e[0] * n, self.e[1] * n)
    def __div__(self, n):
        return Vector2( self.e[0]/n, self.e[1]/n)
    def __repr__(self):
        return '%f %f' % (self.e[0], self.e[1])
    def __getattr__(self, name):
        return getattr(self, name)

class Vector3:
    def __init__(self, x = 0, y = 0, z = 0):
        self.e = [float(x), float(y), float(z)]
        self.name = 'Vector3'

    def Set(self, x, y, z):
        self.e[0], self.e[1], self.e[2] = x,y,z

    def SetX(self, x):
        self.e[0] = x

    def SetY(self, y):
        self.e[1] = y
    def SetZ(self, z):
        self.e[2] = z

    def x(self): return self.e[0]
    def y(self): return self.e[1]
    def z(self): return self.e[2]

    def length(self):
        return sqrt( self.e[0]*self.e[0] + self.e[1]*self.e[1] +
                     self.e[2]*self.e[2])
    def squaredLength(self):
        return self.e[0]*self.e[0] + self.e[1]*self.e[1] + self.e[2]*self.e[2]

    def MakeUnitVector(self):
        l = self.length()
        try:
            x = self.e[0]/l
            y = self.e[1]/l
            z = self.e[2]/l
        except:
            print 'Error', sys.exc_type, sys.exc_value
            sys.exit(1)

        else:
            self.e[0], self.e[1], self.e[2] = x,y,z


    def __getitem__(self, i):
        return self.e[i]
    def __setitem__(self, i, val):
        self.e[i] = val
    def __add__(self, other):
        return Vector3( self.e[0]+other[0], self.e[1] + other[1],
                        self.e[2]+other[2])
    def __sub__(self, other):
        return Vector3( self.e[0] - other[0], self.e[1] -  other[1],
                        self.e[2] - other[2])
    def __mul__(self, n):
        return Vector3( self.e[0] * n, self.e[1] * n,
                        self.e[2] * n)
    def __div__(self, n):
        return Vector3( self.e[0]/n, self.e[1]/n,
                        self.e[2]/n)
    def __repr__(self):
        return '%f %f %f' % (self.e[0], self.e[1], self.e[2])
    # infinite loop?
    def __getattr__(self, name):
        return getattr(self, name)


def dot(v1, v2):
    l = len(v1.e)
    if l == 2:
        return v1[0]*v2[0] + v1[1]*v2[1]
    elif l == 3:
        return v1[0]*v2[0] + v1[1]*v2[1] + v1[2]*v2[2]

def cross(v1,v2):
    return Vector3( v1[1]*v2[2] - v1[2]*v2[1],
                    -(v1[0]*v2[2] - v1[2]*v2[0]),
                    v1[0]*v2[1] - v1[1]*v2[0] )



if __name__ == '__main__':
    v1 = Vector3( 1,0,0)
    v2 = Vector3(0,1,0)

    print 'dot =', dot(v1, v2)
    print 'cross = ', cross(v1,v2)

    v3 = v1 + v2
    print v3

    v3.MakeUnitVector()
    print 'Normalized', v3
by AMcneil last modified Feb 29, 2016 12:25 PM