From 66288861241823271f75b3020e284bfa47a0e4b2 Mon Sep 17 00:00:00 2001 From: Wolfgang Ludwig <wolfgang.ludwig@esrf.fr> Date: Tue, 5 Jun 2018 18:19:11 +0200 Subject: [PATCH] bugfix by Yohann Signed-off-by: Wolfgang Ludwig <wolfgang.ludwig@esrf.fr> --- zUtil_Maths/gtMathsRod2Euler.m | 101 +++++++++++++++++---------------- 1 file changed, 52 insertions(+), 49 deletions(-) mode change 100644 => 100755 zUtil_Maths/gtMathsRod2Euler.m diff --git a/zUtil_Maths/gtMathsRod2Euler.m b/zUtil_Maths/gtMathsRod2Euler.m old mode 100644 new mode 100755 index bfa7bf97..af615405 --- a/zUtil_Maths/gtMathsRod2Euler.m +++ b/zUtil_Maths/gtMathsRod2Euler.m @@ -1,49 +1,52 @@ -function euler = gtMathsRod2Euler(r) -% GTMATHSROD2EULER Convert Rodrigues vectors to Euler angles (in degrees). -% These follow Bunge convention (ZXZ) [phi1; phi; phi2]. -% -% euler = gtMathsRod2Euler(r) -% ------------------------------------------------------------------------- -% -% INPUT: -% r = <double> Rodrigues vectors, as column vectors (3xN array). -% -% OUTPUT: -% euler = <double> Euler angles triplets, as column vectors (3xN array). -% Output angles are in degrees and only positive. -% -% Version 002 17-10-2012 by YGuilhem -% Vectorize function to process quickly lots of Rogrigues vectors -% -% Version 001 15-06-2012 by YGuilhem - -% Check size of r column vectors -if size(r, 1) ~= 3 - gtError('Rodrigues:wrong_input_size', ... - 'Input array r should be sized 3xN!'); -end - -% Set epsilon to avoid singular values -epsilon = 1.e-9; - -% Build regular filters -regular = r >= epsilon; -regular_a = regular(1, :) & regular(2, :); -regular_b = regular(3, :); - -% conpute intermediate values -a = double(~regular_a).*pi/4 + double(regular_a).*atan2(r(2, :), r(1, :)); -b = double(~regular_b).*pi/4 + double(regular_b).*atan(r(3, :)); - -% Compute Euler angles in radians -phi1 = a + b; -phi = 2*atan2(sqrt(r(1, :).^2 + r(2, :).^2), sqrt(1. + r(3, :).^2)); -phi2 = b - a; - -% Switch to degrees -euler = [phi1 ; phi ; phi2] * 180 / pi; - -% Shift to positive angles range -euler = mod(euler, 360.); - -end % end of function +function euler = gtMathsRod2Euler(r) +% GTMATHSROD2EULER Convert Rodrigues vectors to Euler angles (in degrees). +% These follow Bunge convention (ZXZ) [phi1; phi; phi2]. +% +% euler = gtMathsRod2Euler(r) +% ------------------------------------------------------------------------- +% +% INPUT: +% r = <double> Rodrigues vectors, as column vectors (3xN array). +% +% OUTPUT: +% euler = <double> Euler angles triplets, as column vectors (3xN array). +% Output angles are in degrees and only positive. +% +% Version 002 17-10-2012 by YGuilhem +% Vectorize function to process quickly lots of Rogrigues vectors +% +% Version 001 15-06-2012 by YGuilhem + +% Check size of r column vectors +if size(r, 1) ~= 3 + gtError('Rodrigues:wrong_input_size', ... + 'Input array r should be sized 3xN!'); +end + +% Set epsilon to avoid singular values +epsilon = 1.e-9; + +% Compute first intermediate value +c = cos(atan(sqrt(sum(r.^2)))); + +% Build regular filters +regular = abs(c.*r) >= epsilon; +regular_a = regular(1, :) | regular(2, :); +regular_b = regular(3, :) | c >= epsilon; + +% Compute second intermediate values +a = double(~regular_a).*pi/4 + double(regular_a).*atan2(r(2, :), r(1, :)); +b = double(~regular_b).*pi/4 + double(regular_b).*atan2(r(3, :), 1.); + +% Compute Euler angles in radians +phi1 = a + b; +phi = 2*atan2(sqrt(r(1, :).^2 + r(2, :).^2), sqrt(1. + r(3, :).^2)); +phi2 = b - a; + +% Switch to degrees +euler = [phi1 ; phi ; phi2] * 180 / pi; + +% Shift to positive angles range +euler = mod(euler, 360.); + +end % end of function -- GitLab