Vector, matrix, normalize, rotate. What package?

  • Thread starter =?iso-8859-1?B?TWF0dGlhcyBCcuRuZHN0cvZt?=
  • Start date
?

=?iso-8859-1?B?TWF0dGlhcyBCcuRuZHN0cvZt?=

Hello!

I'm trying to find what package I should use if I want to:

1. Create 3d vectors.
2. Normalize those vectors.
3. Create a 3x3 rotation matrix from a unit 3-d vector and an angle in
radians.
4. Perform matrix multiplication.

It seems to me that perhaps numpy should be able to help me with this.
However, I can only figure out how to do 1 and 4 using numpy. Meybe
someone knows a way to use numpy for 2 and 3? If not, what Python
package helps me with geometry related tasks such as 2 and 3?

Any help here would be greatly appreciated!

Regards,
Mattias
 
S

shredwheat

I'm trying to find what package I should use if I want to:

1. Create 3d vectors.
2. Normalize those vectors.
3. Create a 3x3 rotation matrix from a unit 3-d vector and an angle in
radians.
4. Perform matrix multiplication.

You should have good luck with cgkit. If you are having trouble
getting a compile of v2, there is an older v1 that is pure python.

There are various implementations all around the net, but I'm not sure
of anything standalone and actually released.
 
P

Paul Rubin

Mattias Brändström said:
I'm trying to find what package I should use if I want to:
1. Create 3d vectors.
2. Normalize those vectors.
3. Create a 3x3 rotation matrix from a unit 3-d vector and an angle in
radians.
4. Perform matrix multiplication.

If this is a math exercise, just use plain python and code it all by
hand, there's not much to it. You might also like to read about
quaternion multiplication--if you read German, the German Wikipedia
article looks more helpful than the English one about that.

http://de.wikipedia.org/wiki/Quaternion
 
J

James Stroud

Mattias said:
Hello!

I'm trying to find what package I should use if I want to:

1. Create 3d vectors.
2. Normalize those vectors.
3. Create a 3x3 rotation matrix from a unit 3-d vector and an angle in
radians.
4. Perform matrix multiplication.

It seems to me that perhaps numpy should be able to help me with this.
However, I can only figure out how to do 1 and 4 using numpy. Meybe
someone knows a way to use numpy for 2 and 3? If not, what Python
package helps me with geometry related tasks such as 2 and 3?

Any help here would be greatly appreciated!

Regards,
Mattias

As Paul is hinting, your best bet is to make use of quaternions, you
will save yourself a lot of frustration as soon as you need to do
anything with them outside of matrix-multiplying a bunch of 3D
coordinates. See the Scientific Python module:
Scientific.Geometry.Quaternion. To make a matrix from Quaternion, q, use
"q.asRotations().tensor".

To make a quaternion from an axis and an angle, here is what I use:

#######################################################################
# axis_angle_to_quaternion()
#######################################################################
def axis_angle_to_quaternion(axis, angle):
"""
Takes an I{axis} (3x1 array) and an I{angle} (in degrees) and
returns the rotation as a
I{Scientific.Geometry.Quaternion.Quaternion}.

@param axis: 3x1 array specifiying an axis
@type axis: numarray.array
@param angle: C{float} specifying the rotation around I{axis}
@type angle: float
@return: a I{Quaternion} from an I{axis} and an I{angle}
@rtype: Quaternion
"""
axis = normalize(axis)

angle = math.radians(float(angle))
qx = float(axis[0])
qy = float(axis[1])
qz = float(axis[2])
sin_a = math.sin(angle / 2.0)
cos_a = math.cos(angle / 2.0)
qx = qx * sin_a
qy = qy * sin_a
qz = qz * sin_a
qw = cos_a

return Quaternion(qw, qx, qy, qz).normalized()


See your linear algebra text on how to normalize a 1x3 vector.

James
 
G

greg

Mattias said:
1. Create 3d vectors.
2. Normalize those vectors.
3. Create a 3x3 rotation matrix from a unit 3-d vector and an angle in
radians.
4. Perform matrix multiplication.

Meybe someone knows a way to use numpy for 2 and 3?

Here's some code I wrote recently to do normalisation
of vectors using Numeric:

from Numeric import add, sqrt

def dots(u, v):
"""Return array of dot products of arrays of vectors."""
return add.reduce(u * v, -1)

def units(v):
"""Array of unit vectors from array of vectors."""
ds = 1.0 / sqrt(dots(v, v))
return ds * v

These work best if you give them multiple vectors to
work on at once, otherwise you don't get much advantage
from using Numeric.

I don't have anything to hand for rotation about a
vector, but if you can find a formula, you should be
able to use similar techniques to "vectorize" it
using Numeric.
 
R

r1chardj0n3s

Hello!

I'm trying to find what package I should use if I want to:

1. Create 3d vectors.
2. Normalize those vectors.
3. Create a 3x3 rotation matrix from a unit 3-d vector and an angle in
radians.
4. Perform matrix multiplication.

It seems to me that perhaps numpy should be able to help me with this.
However, I can only figure out how to do 1 and 4 using numpy. Meybe
someone knows a way to use numpy for 2 and 3? If not, what Python
package helps me with geometry related tasks such as 2 and 3?

Try Alex Holkner's euclid.py module:

http://cheeseshop.python.org/pypi/euclid/0.01


Richard
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,766
Messages
2,569,569
Members
45,043
Latest member
CannalabsCBDReview

Latest Threads

Top