I did provide you with a single quaternion s.t. Q A (1/Q) = A' Q B (1/Q) = B' However, one normally (pun intended!) does the computation like this: (Q A conjugate(Q))/N(Q) = A' (Q B conjugate(Q))/N(Q) = B' where N(Q) = Q conjugate(Q) because it is cheaper/easier/more precise to normalize at the end. If you compute the _unit_ quaternion Q/sqrt(N(Q)), then in this case, (1/Q) = conjugate(Q) There is no way to do the rotation with only one quaternion multiply, because each quaternion multiply only computes a _reflection_, and you need 2 reflections to make a rotation. See Coxeter's wonderful paper about quaternion rotations & reflections here: www.math.utah.edu/~ptrapa/math-library/coxeter/Coxeter-Quaternions-and-reflections-AMM-1946.pdf Coxeter shows that quaternions can even do all the rotations in 4D, but there you need a different quaternion for the pre- and post- multiplication in order to get enough degrees of freedom. At 12:13 AM 6/26/2014, Robert Smith wrote:
Last one for the night. (It's midnight here.)
I got the above math to work numerically as well, but now I want to see if it's possible to boil that down into a single quaternion Q, as opposed to a function, so that for
Q # v = Q * v * conj(Q),
we have the simultaneously satisfied
Q # A = A' Q # B = B'.
I am introducing all of these symbols (#, ., *, implicit) just to be absolutely clear. I guess it's the programmer in me.
Do you think there's a nice expression for this? I'm betting on "no", but you've surprised me above.
Robert
On Wed, Jun 25, 2014 at 11:20 PM, Robert Smith <quad@symbo1ics.com> wrote:
Sorry for the noise. I also meant
Let R = (A' - A) x (B' - B) Let U = R x A Let U' = R x A'
Robert
On Wed, Jun 25, 2014 at 10:22 PM, Robert Smith <quad@symbo1ics.com> wrote:
Sorry, I guess what I said doesn't quite make sense in the last bit. When I said Q * A, I meant more rotate(Q, A) = A', where
rotate(Q, A) = Q * A * conj(Q).
Robert
On Wed, Jun 25, 2014 at 6:06 PM, Robert Smith <quad@symbo1ics.com> wrote:
Henry:
You've provided a function which maps a quaternion
v = r + xi + yj + zk
to a new quaternion
v' = r' + x'i + y'j + z'k.
If I followed along correctly, the expression can be rewritten as follows:
A -> A' B -> B'
Let S = (A' - A) x (B' - B) Let U = R x A Let U = R x A'
Then the mapping sought is
v -> (|U|^2 - U' * U) * v * (|U|^2 - U * U') --------------------------------------- 2(U . U)(U . (U + U'))
which is equal to
v -> (|U|^2 - U' * U) * v * (|U|^2 - U * U') --------------------------------------- 2 |U|^2 (|U|^2 + U . U')
where implicit multiplication is scalar-by-scalar, the dot is vector dot product (which in all these cases, if U is interpreted as a quaternion, then it has a realpart of 0), and the asterisk * is quaternion multiply associating left to right.
If the above interpretation is right, how can we recover a quaternion Q such that
Q * A = A' Q * B = B'
where a vector [x y z] is the quaternion xi + yj + ck? Just use v = 1?
I haven't verified this correct yet because I'm trying to ensure all the types check out. :)
Cheers,
Robert
On Wed, Jun 25, 2014 at 3:50 PM, Robert Smith <quad@symbo1ics.com> wrote:
Fantastic. I didn't expect it to be as nice as that, for certain!
Robert
On Fri, Jun 13, 2014 at 9:54 AM, Henry Baker <hbaker1@pipeline.com> wrote:
I have confirmed via a number of numerical experiments that
v->(|SxA|^2-(SxA')(SxA))v(|SxA|^2-(SxA)(SxA'))/Nq
where S=(A'-A)x(B'-B)
does indeed transform A->A' and B->B'.
Here's a slightly simpler form for
Nq = 2*|SxA|^2*(|SxA|^2+(SxA).(SxA')) = 2*[(SxA).(SxA)]*[(SxA).(Sx(A+A'))]
At 09:24 PM 6/10/2014, Henry Baker wrote: >Another solution based on vectors & quaternions w/o matrices. > >If A,B are unit vectors (|A|=|B|=1), then rotating them >will preserve length (|A'|=|B'|=1). > >We need to warm up a bit before solving the full problem; >we first consider mapping A->A' without worrying about B. > >The most straightforward rotation that maps A->A' is >the quaternion q=sqrt((-A')A). Here (-A')A is >the quaternion product of the quaternion inverse of A' >and A. (For unit vector quaternions like A', (A')^-1=-A'.) >We use the standard mapping of vectors into >quaternions: A -> 0+A; i.e., the scalar part of (0+A) >is 0, and the vector part of (0+A) is A itself. > >The mapping > >v -> q v (q)^-1 = (q v q*)/(qq*) > >will transform A->A'. q* is conjugate(q). > >(The second form is preferred, since we don't have to >normalize q, and we don't have to compute absolute values.) > >The "sqrt()" above is the _quaternion_ square root, which >can be computed: > >sqrt(q) = (|q|+q)/sqrt(2*(|q|+S(q))) > >(Note that the denominator is a real scalar quantity.) > >Here S(q) is the "scalar part" of q, or > >S(q) = (q+q*)/2 > >But since we don't need a _normalized_ q, we can use a >cheap sqrt: > >elcheaposqrt(q) = |q|+q (!) > >Proof: > >(|q|+q)^2 = |q|^2+2|q|q+q^2 > = |q|^2+2|q|q+(Sq+Vq)^2 > = |q|^2+2|q|q+Sq^2+2SqVq+Vq^2 > = |q|^2+2|q|q+Sq^2+2SqVq-|Vq|^2 > = |q|^2+2|q|q+Sq^2+2SqVq-|Vq|^2-Sq^2+Sq^2 > = |q|^2+2|q|q+2Sq^2+2SqVq-|q|^2 > = 2|q|q+2Sq^2+2SqVq > = 2|q|q+2Sq(Sq+Vq) > = 2|q|q+2Sq q > = 2(|q|+Sq) q > >QED > >In particular, the function that takes A->A' is > >v -> (1-A'A)v(1-AA')/2/(1+A.A') > >(Here A.A' is the dot product of A & A'.) > >We now attack your actual question: you want a >rotation that _simultaneously_ transports >A->A' and B->B'. > >As Dan pointed out, the axis of rotation that we >want is (A'-A)x(B'-B), but we can't use (A'-A).(B'-B) >as the scalar part of a quaternion, because that >would rotate the projection of A into the projection >of B (or equivalently, the projection of A' into the >projection of B') -- not what we want. > >Let S=(A'-A)x(B'-B) be our axiS. If we are careful, >we won't have to normalize S into a unit vector. We >also no longer need B,B' since we only needed B,B' >to establish the axis S. > >If we compute SxA and SxA', we note that they are in >a plane orthogonal to S, and during the rotation that >maps A->A' and B->B', we will also map SxA into SxA'. >So the axis of this rotation is S itself. Also, >obviously, |SxA|=|SxA'|. > >So, we can now utilize the method of our warmup >exercise to map SxA into SxA' via the mapping: > >v->(|SxA|^2-(SxA')(SxA))v(|SxA|^2-(SxA)(SxA'))/Nq > >and Nq is the "absolute value squared" of >(|SxA|^2-(SxA')(SxA)) or of (|SxA|^2-(SxA)(SxA')). > >This is the mapping that we seek that will >simultaneously map A->A' and B->B'. > >Thus, although we talked about square roots and >absolute values in our development, we find that >the final result requires no square roots or >absolute values. > >I'd be surprised if there is a simpler expression >for computing this quaternion. > >At 04:03 PM 6/9/2014, Henry Baker wrote: >>We can take our matrix product below, which is >>an orthogonal matrix. Let's call it M. >> >>Then we can easily recover the quaternion from >>the orthogonal matrix M using the inverse _Cayley >>Transform_: >> >>S = (I-M)(I+M)^-1 >> >>The matrix I+M is invertible, because we have _rigid_ >>rotations (i.e., no reflections, hence no eigenvalues >>of -1). >> >>S is a _skew-symmetric_ matrix: >> >>[ 0 z -y] >>[-z 0 x] >>[ y -x 0] = S >> >>Then our (non-normalized) quaternion is [1,x,y,z]. >> >>http://en.wikipedia.org/wiki/Cayley_transform >> >>At 02:06 PM 6/7/2014, Henry Baker wrote: >>>We can easily do it with vectors & matrices: >>> >>>We are given A,B,A',B', where |A|=|B|=|A'|=|B'|. >>>R(A)=A', R(B)=B'. >>> >>>Because the rotation R is rigid, we know that >>> >>>R(AxB) = A'xB' = R(A)xR(B) >>> >>>Assuming that B is not a multiple of A, we can >>>form the 3x3 matrices R=matrix(A,B,AxB) and >>>R'=matrix(A',B',A'xB'). >>> >>>Our answer is then the matrix product >>> >>>R^-1 R' = >>> >>>matrix(A,B,AxB)^-1 matrix(A',B',A'xB') >>> >>>You are now free to convert this _orthogonal_ >>>matrix into a quaternion at your leisure. >>> >>>(Although AxB, A'xB' are not unit vectors, >>>hence R,R' are not orthogonal matrices, >>>nevertheless, R^-1 R' _is_ orthogonal.) >>> >>>(Contrary to Knuth, I did actually try this >>>on some numbers & it worked!) >>> >>>At 04:25 AM 6/7/2014, Dan Asimov wrote: >>>>In almost all cases, V := (A-A')x(B-B') will be a vector in the direction of the axis of rotation. Knowing V makes it easy to project say A and A' onto the perpendicular plane to C to determine the angle T. >>>> >>>>The remaining cases should be easy to exclude or deal with. >>>> >>>>--Dan >>>> >>>>On Jun 7, 2014, at 1:32 AM, Robert Smith <quad@symbo1ics.com> wrote: >>>> >>>>> Let A and B be unit vectors in R^3. Suppose they are rotated about >>>>> some vector V by an angle T, resulting in A' and B' respectively. What >>>>> are V and T? >>>>> >>>>> I set up a quadratic system using quaternions and got a result that >>>>> was 3 million terms large. Am I missing something?