;+ ; Contains the q_prod function ; ; :Author: ; Baptiste Cecconi ; ; :History: ; 2005/01/13: Created ; ; 2005/01/13: Last Edit ;- ; ;+ ; q_prod is a function that <behavior desc here> ; ; :Returns: ; <return desc here> ; ; :Params: ; q1in: in, required, type=sometype ; A parameter named q1in ; q2in: in, required, type=sometype ; A parameter named q2in ;- FUNCTION Q_prod,q1in,q2in s1 = size(q1in) s2 = size(q2in) n1 = (s1(0) eq 1) + (s1(0) eq 2)*s1(2) n2 = (s2(0) eq 1) + (s2(0) eq 2)*s2(2) err = bytarr(3) err(0) = s1(1) ne 4 or n1 eq 0 err(1) = s2(1) ne 4 or n2 eq 0 err(2) = not (n1 eq 1 or n2 eq 1 or (n1 eq n2 and n1 ne 1 and n2 ne 1) ) err = err mod 2 if (where(err ne 0))(0) ne -1 then begin print,"Q_PROD : error, wrong argument size..." print," Use : Q_PROD,q1in,q2in" if err(0) then print," > q1in must be a quaternion (4) or a vector of quaternions (4,n)" if err(1) then print," > q2in must be a quaternion (4) or a vector of quaternions (4,n)" if err(2) then print," > in case of vector of quaternions (4,n1) and (4,n2), n1=n2 is required" return,-1 endif n3 = max([n1,n2]) q3 = dblarr(4,n3) q1 = rebin(reform(double(q1in),4,n1),4,n3) q2 = rebin(reform(double(q2in),4,n2),4,n3) q3(0,*) = q1(0,*)*q2(0,*) - q1(1,*)*q2(1,*) - q1(2,*)*q2(2,*) - q1(3,*)*q2(3,*) q3(1,*) = q1(0,*)*q2(1,*) + q2(0,*)*q1(1,*) + q1(2,*)*q2(3,*) - q1(3,*)*q2(2,*) q3(2,*) = q1(0,*)*q2(2,*) + q2(0,*)*q1(2,*) + q1(3,*)*q2(1,*) - q1(1,*)*q2(3,*) q3(3,*) = q1(0,*)*q2(3,*) + q2(0,*)*q1(3,*) + q1(1,*)*q2(2,*) - q1(2,*)*q2(1,*) return,reform(q3) end