You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Here's a couple functions I've used to rotate a vector about another vector and
find the angle between two vectors in 3 dimensions:
from math import sqrt, sin, cos, acos
def rotate(v1, v2, theta):
"""Rotate vector v1 about v2 by the angle theta in radians. The right hand rule applies."""
# Adapted from equations published by Glenn Murray - Thanks Glenn!!!
# http://inside.mines.edu/~gmurray/ArbitraryAxisRotation/ArbitraryAxisRotation.html
x, y, z = v1
u, v, w = v2
newx = (
(
u*(u*x + v*y + w*z)
+ (x*(v**2 + w**2) + u*(-v*y - w*z))*cos(theta)
+ sqrt(u**2 + v**2 + w**2)*(-w*y + v*z)*sin(theta)
)
/ (u**2 + v**2 + w**2)
)
newy = (
(
v*(u*x + v*y + w*z)
+ (y*(u**2 + w**2) + v*(-u*x - w*z))*cos(theta)
+ sqrt(u**2 + v**2 + w**2)*(w*x - u*z)*sin(theta)
)
/ (u**2 + v**2 + w**2)
)
newz = (
(
w*(u*x + v*y + w*z)
+ (z*(u**2 + v**2) + w*(-u*x - v*y))*cos(theta)
+ sqrt(u**2 + v**2 + w**2)*(-v*x + u*y)*sin(theta)
)
/ (u**2 + v**2 + w**2)
)
return vector([newx,newy,newz])
def angle(v1, v2):
"""Calculate the angle between vectors v1 and v2 => radians"""
return acos(dotproduct(v1, v2) / (v1.mag*v2.mag))
These are from my own vector class, but should drop into yours without much
trouble. Anyways, thought you might be interested. You can find the whole class
at http://thefekete.net/gitweb/?p=python/robotarm.git;a=blob;f=pyVec.py
BTW, I'm new to google code and couldn't find a way to message the maintainers
or commit a patch, so I'm dumping this here...
-dan
Original issue reported on code.google.com by TheFek...@gmail.com on 9 Dec 2010 at 5:44
The text was updated successfully, but these errors were encountered:
Original issue reported on code.google.com by
TheFek...@gmail.com
on 9 Dec 2010 at 5:44The text was updated successfully, but these errors were encountered: