Oh, I guess they are pretty much equivalent, even though Casey seems to say complex have better performance than euclid.
I just use complex because it's available out of the box with Python :) (and because I didn't know about Euclid; maybe I'll use it if I do 3D) On Thu, Jan 22, 2009 at 11:58 PM, Jake b <ninmonk...@gmail.com> wrote: > Still confused on the difference between complex and euclid.Vector2 [ doc: > http://www.partiallydisassembled.net/euclid/vector-classes.html ] > > On Wed, Jan 21, 2009 at 9:24 PM, Casey Duncan <ca...@pandora.com> wrote: >> >> Here's some example code with some commonly used functions. Addition and >> subtraction are built into the complex type and work as expected (I use the >> real part > > So far, this looks like euclid.Vector2. Are you doing the same thing, only > using 'real as the x component, and 'imag' as y? ( Meaning you are using > complex instead of tuple, equivalent to using vector2 instead of tuple ? ) > > Or, I think i'm missing something. What is the advantage to to use this over > euclid.Vector2? [ more below ] > >> for x and the imaginary part for y). complex multiply can be used to >> rotate vectors: > > Does complex multiply behind the scenes do something like this? > > def rad2v(rad,mag=1.): # convert radians to vector with magnitude > return mag*Vector2(cos(rad), sin(rad)) > > def v2rad(v): return atan2(v.y, v.x) # convert vector to radians > > def mod_angle(v,rad): # add radians to vector's orientation > r = v2rad(v) > r+=rad > return rad2v( r, v.magnitude() ) > > >>> v = rad2v( radians(142.8),2.5) > # now equals: deg=142.8, mag=2.5, v=Vector2(-1.99, 1.51) > >>> v = mod_angle( v, radians(3.)) > # now equals: deg=145.8, mag=2.5, v=Vector2(-2.07, 1.41) > >> >> # 2D vectors using python complex numbers >> >> def radians(vector): >> return atan2(vector.imag, vector.real) >> >> def unit(radians): >> return cmath.exp(radians * 1j) >> >> def normal(vector): >> L = length(vector) >> if L == 0: >> return vector2() >> else: >> return vector / L >> >> def clamp(vector, max_length): >> L = length(vector) >> if L > max_length: >> return vector * (max_length / L) >> else: >> return vector > > At first, this code looks the same, except there are new functions: > .radians(v) and unit(r). Radians looks like a 'convert vector to euler > radians angle'. > > But whatis .unit()? I'm guessing it's to create a new unit vector in the > angle of 'radians.' But calling it with a few values, I'm not getting what I > was expecting. > > Is it the equivalent of rad2v(r) for Vector2, but unit(r) does the same for > complex numbers? > >> >> def distance(vector1, vector2): >> return length(vector1 - vector2) >> This is good if the list may change during iteration. If you do this >> repeatedly in a given frame, it might be better to create a custom class >> (perhaps subclass set) that contains a stable set of the actors. When you >> add or remove, these are stored in ancillary sets rather than changing the >> stable set immediately. An update method called at the beginning of each >> frame adds and removes the items from the ancillary sets to update the >> stable set. These ancillary sets are then cleared. This mean less memory >> allocation/cleanup and work copying the lists >> >> class StableSet(set): > > I'll try it out. > > @emile: ( continued from above ), I'm trying to understand how/why complex > numbers are used. > > Here is my Vector2 equivalent to your code. > > It looks like you treat complex same way I treat euclid.Vector2 ? Am I > missing something? > > from euclid import Vector2 > class Spaceship(): > def __init__(self, pos=Vector2(0,0), max_accel=100): > self.pos = pos > self.vel = Vector2(0, 0) # or'speed'. changed named to not be > confused as Scalar > self.accel = Vector2(0, 1.) # or 'direction' > self.boosters_on = False > self.max_accel = max_accel > > def update(self, dt): > if self.boosters_on: > self.vel += self.accel * self.max_accel * dt > self.pos += self.vel * dt > -- > Jake >