Jump to content

  • Log In with Google      Sign In   
  • Create Account


Is there a built-in Python vector class?


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
6 replies to this topic

#1 silverphyre673   Members   -  Reputation: 454

Like
0Likes
Like

Posted 09 March 2008 - 12:57 AM

I'm experimenting with flocking bots, and I don't want to go to the trouble of coming up with a vector class. Is there something that works well already out there? Thanks.

Sponsor:

#2 Ezbez   Crossbones+   -  Reputation: 1164

Like
0Likes
Like

Posted 09 March 2008 - 01:30 AM

If you want, here's the vector class that I wrote. No guarantees on anything, but it's working great for me. It's only for 2D vectors, but I'm guessing that that will be enough for your work. Note that I also define a class Point to be the same as Vector, which you might not want.

import math
class Vector:
'Represents a 2D vector.'
def __init__(self, x = 0, y = 0):
self.x = float(x)
self.y = float(y)

def __add__(self, val):
return Point( self[0] + val[0], self[1] + val[1] )

def __sub__(self,val):
return Point( self[0] - val[0], self[1] - val[1] )

def __iadd__(self, val):
self.x = val[0] + self.x
self.y = val[1] + self.y
return self

def __isub__(self, val):
self.x = self.x - val[0]
self.y = self.y - val[1]
return self

def __div__(self, val):
return Point( self[0] / val, self[1] / val )

def __mul__(self, val):
return Point( self[0] * val, self[1] * val )

def __idiv__(self, val):
self[0] = self[0] / val
self[1] = self[1] / val
return self

def __imul__(self, val):
self[0] = self[0] * val
self[1] = self[1] * val
return self

def __getitem__(self, key):
if( key == 0):
return self.x
elif( key == 1):
return self.y
else:
raise Exception("Invalid key to Point")

def __setitem__(self, key, value):
if( key == 0):
self.x = value
elif( key == 1):
self.y = value
else:
raise Exception("Invalid key to Point")

def __str__(self):
return "(" + str(self.x) + "," + str(self.y) + ")"
Point = Vector

def DistanceSqrd( point1, point2 ):
'Returns the distance between two points squared. Marginally faster than Distance()'
return ( (point1[0]-point2[0])**2 + (point1[1]-point2[1])**2)
def Distance( point1, point2 ):
'Returns the distance between two points'
return math.sqrt( DistanceSqrd(point1,point2) )
def LengthSqrd( vec ):
'Returns the length of a vector sqaured. Faster than Length(), but only marginally'
return vec[0]**2 + vec[1]**2
def Length( vec ):
'Returns the length of a vector'
return math.sqrt( LengthSqrd(vec) )
def Normalize( vec ):
'Returns a new vector that has the same direction as vec, but has a length of one.'
if( vec[0] == 0. and vec[1] == 0. ):
return Vector(0.,0.)
return vec / Length(vec)
def Dot( a,b ):
'Computes the dot product of a and b'
return a[0]*b[0] + a[1]*b[1]
def ProjectOnto( w,v ):
'Projects w onto v.'
return v * Dot(w,v) / LengthSqrd(v)



In addition, it seems that you can use NumPy for vector work, but I can't find much good documentation on how to do that. NumPy would require installation by end-users, but it's darn near standard for Python and if you're just playing around, that might not be an issue.

Hope that helps.

#3 SiCrane   Moderators   -  Reputation: 9558

Like
0Likes
Like

Posted 09 March 2008 - 01:31 AM

What kind of vector class are you looking for? A mathematical vector class for doing orientations and dot products, etc. or a container vector class for storing stuff in?

#4 silverphyre673   Members   -  Reputation: 454

Like
0Likes
Like

Posted 09 March 2008 - 09:29 AM

Sorry -- that could have been a little more clear. I'm looking for a mathematical vector class, not a container. I think I would want to be familiar with pretty much one of the most basic features of the language before I go about writing programs in it :)

#5 Zahlman   Moderators   -  Reputation: 1682

Like
0Likes
Like

Posted 28 March 2008 - 05:16 AM

Quote:
Original post by silverphyre673
Sorry -- that could have been a little more clear. I'm looking for a mathematical vector class, not a container. I think I would want to be familiar with pretty much one of the most basic features of the language before I go about writing programs in it :)


One of the built-in Python types is 'complex', and complex numbers are (2D) points (or vectors).

#6 XXX_Andrew_XXX   Members   -  Reputation: 340

Like
0Likes
Like

Posted 31 March 2008 - 10:27 PM

In almost all cases which make use of vector math, the array type in the numpy module is appropriate. All of the appropriate functions are implemented in optimized C, and the types are closely compatible with python lists.

Some 'common' operations on numpy arrays that you would expect on a custom 2 or 3 dimensional vector class aren't present (dot product), but are very easy to reproduce.



#7 Kylotan   Moderators   -  Reputation: 3338

Like
1Likes
Like

Posted 08 April 2008 - 04:48 AM

I just found pyeuclid. "Vector, matrix and quaternion classes for use with 2D and 3D games and graphics applications".




Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS