computing rotation matrix for vector rotation about another vector

Discussion in 'MATLAB' started by John, Sep 4, 2007.

  1. John

    John Guest

    I have two known vectors (in 3-space if it matters), v and
    b. v is rotated by an unknown rotation matrix, R, into b.

    b=Rv

    I want to rotate b by the same amount (and in the same plane
    of rotation defined by v and b) to get c. i.e.:

    c=Rb=RRv

    R is orthogonal, so RR' = R'R = I, so

    R'c=Rv=b

    I only need to compute c. If I can compute c without
    computing R, that works. But some mental block stops me from
    computing c.

    I could come up with:

    cross(v,c) = n ( 2 * cross(v,b) * dot(v,b) )/ (|v| * |b|)

    where n = cross(v,b) / |cross(v,b)|

    so the LHS can be expressed as a skew-symmetric matrix, V,
    with c, and the RHS is just a scalar times the normal
    direction, but I can't seem to solve for c because V is rank 2.

    Any ideas?

    thanks,
    john
     
    John, Sep 4, 2007
    #1
    1. Advertisements

  2. John

    W. Dale Hall Guest

    Try this: use the fact that the points

    0 (the origin)
    v
    b

    all lie in a plane (the plane containing the
    circle that v would rotate through if you took
    all real powers of the matrix R and applied to
    v), and that the triangles

    0 v b

    0 b c

    are congruent. If you were to sketch a picture
    of this plane, you would get something like this:

    v
    . .
    . .
    0--------------------b
    . .
    . .
    c

    where I've indicated the lines connecting
    0&v, 0&b, 0&c, v&b and v&c as well as I could
    given ASCII characters. The next thing to
    notice is that v and c are symmetric about the
    line 0b, so you could in fact write c as the
    reflection of v through this line.

    The easy way to do this it to take the projection
    of v along b:

    (v.b/||b||^2) b

    and subtract it from v:

    v - (v.b/ ||b||^ 2) b

    to get the component of v orthogonal to b.

    I'll let p(v,b) denote v.b / ||b||^2
    to simplify what follows.

    Note that you get a decomposition of v into
    parts parallel to b & orthogonal to b:

    v = p(v,b) b + (v - p(v,b) b)

    (you should verify for yourself that the
    second term is indeed orthogonal to b)

    The vector c you want just has the other sign
    for the component orthogonal to b:

    c = p(v,b) b - (v - p(v,b) b)

    That should do the trick.

    Dale
     
    W. Dale Hall, Sep 5, 2007
    #2
    1. Advertisements

  3. John

    W. Dale Hall Guest

    ... stuff deleted ...

    oops: I forgot to note that c is also in this plane.

    Duh.

    Dale
     
    W. Dale Hall, Sep 5, 2007
    #3
  4. John

    John Guest

    Dale,
    Thanks for the idea. That looks right. I'll try it today.
    thanks,
    john
     
    John, Sep 5, 2007
    #4
  5. John

    John Guest

    Dale, thanks. That worked.
     
    John, Sep 5, 2007
    #5
    1. Advertisements

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 (here). After that, you can post your question and our members will help you out.