[ismrmrd] 97/281: inlined the quaternion to direction functions. `

Ghislain Vaillant ghisvail-guest at moszumanska.debian.org
Wed Jan 14 20:01:01 UTC 2015


This is an automated email from the git hooks/post-receive script.

ghisvail-guest pushed a commit to annotated tag ismrmrd0.5
in repository ismrmrd.

commit 10b4ce26b5c32817a5c9b918af6dee2576a36f56
Author: IDEA User <idea at nih.gov>
Date:   Mon Mar 11 14:29:14 2013 -0400

    inlined the quaternion to direction functions.
    `
---
 CMakeLists.txt |   2 +-
 ismrmrd.cpp    | 128 ---------------------------------------------------------
 ismrmrd.h      | 123 +++++++++++++++++++++++++++++++++++++++++++++++++++---
 3 files changed, 118 insertions(+), 135 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 9c31b6c..ea16ac0 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -28,7 +28,7 @@ WRAP_XSD(XSDS_SOURCES XSD_INCLUDES ${CMAKE_CURRENT_BINARY_DIR}/schema ${XSDS} OP
 INCLUDE_DIRECTORIES(${XSD_INCLUDES} ${XSD_INCLUDE_DIR} ${XERCESC_INCLUDE_DIR} ${Boost_INCLUDE_DIR} ${HDF5_INCLUDE_DIR} ${HDF5_INCLUDE_DIR}/cpp)
 LINK_DIRECTORIES(${Boost_LIBRARY_DIRS})
 
-add_library(ismrmrd SHARED ismrmrd.cpp ismrmrd_hdf5.cpp)
+add_library(ismrmrd SHARED ismrmrd_hdf5.cpp)
 add_library(ismrmrd_xsd SHARED ${XSDS_SOURCES})
 
 # Process the MATLAB files
diff --git a/ismrmrd.cpp b/ismrmrd.cpp
deleted file mode 100644
index a29f49d..0000000
--- a/ismrmrd.cpp
+++ /dev/null
@@ -1,128 +0,0 @@
-#include "ismrmrd.h"
-#include <math.h>
-
-#ifdef __cplusplus
-namespace ISMRMRD {
-#endif
-
-/**
- * Calculates the determinant of the matrix and return the sign
- */
-int sign_of_directions(float read_dir[3], float phase_dir[3], float slice_dir[3])
-{
-    float r11 = read_dir[0], r12 = phase_dir[0], r13 = slice_dir[0];
-    float r21 = read_dir[1], r22 = phase_dir[1], r23 = slice_dir[1];
-    float r31 = read_dir[2], r32 = phase_dir[2], r33 = slice_dir[2];
-
-    /* Determinant should be 1 or -1 */
-    float deti = (r11 * r22 * r33) + (r12 * r23 * r31) + (r21 * r32 * r13) -
-                 (r13 * r22 * r31) - (r12 * r21 * r33) - (r11 * r23 * r32);
-
-    if (deti < 0) {
-        return -1;
-    } else {
-        return 1;
-    }
-}
-
-/**
- * Creates a normalized quaternion from a 3x3 rotation matrix
- */
-void directions_to_quaternion(float read_dir[3], float phase_dir[3],
-        float slice_dir[3], float quat[4])
-{
-    float r11 = read_dir[0], r12 = phase_dir[0], r13 = slice_dir[0];
-    float r21 = read_dir[1], r22 = phase_dir[1], r23 = slice_dir[1];
-    float r31 = read_dir[2], r32 = phase_dir[2], r33 = slice_dir[2];
-
-    float a = 1, b = 0, c = 0, d = 0, s = 0;
-    float trace = 0;
-    float xd, yd, zd;
-
-    /* verify the sign of the rotation*/
-    if (sign_of_directions(read_dir, phase_dir, slice_dir) < 0) {
-        /* flip 3rd column */
-        r13 = -r13;
-        r23 = -r23;
-        r33 = -r33;
-    }
-
-    /* Compute quaternion parameters */
-    /* http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q55 */
-    trace = 1.0l + r11 + r22 + r33;
-    if (trace > 0.00001l) {                /* simplest case */
-        s = sqrt(trace) * 2;
-        a = (r32 - r23) / s;
-        b = (r13 - r31) / s;
-        c = (r21 - r12) / s;
-        d = 0.25l * s;
-    } else {
-        /* trickier case...
-         * determine which major diagonal element has
-         * the greatest value... */
-        xd = 1.0 + r11 - (r22 + r33);  /* 4**b**b */
-        yd = 1.0 + r22 - (r11 + r33);  /* 4**c**c */
-        zd = 1.0 + r33 - (r11 + r22);  /* 4**d**d */
-        /* if r11 is the greatest */
-        if (xd > 1.0) {
-            s = 2.0 * sqrt(xd);
-            a = 0.25l * s;
-            b = (r21 + r12) / s;
-            c = (r31 + r13) / s;
-            d = (r32 - r23) / s;
-        }
-        /* else if r22 is the greatest */
-        else if (yd > 1.0) {
-            s = 2.0 * sqrt(yd);
-            a = (r21 + r12) / s;
-            b = 0.25l * s;
-            c = (r32 + r23) / s;
-            d = (r13 - r31) / s;
-        }
-        /* else, r33 must be the greatest */
-        else {
-            s = 2.0 * sqrt(zd);
-            a = (r13 + r31) / s;
-            b = (r23 + r32) / s;
-            c = 0.25l * s;
-            d = (r21 - r12) / s;
-        }
-
-        if (a < 0.0l) {
-            b = -b;
-            c = -c;
-            d = -d;
-            a = -a;
-        }
-    }
-
-    quat[0] = a; quat[1] = b; quat[2] = c; quat[3] = d;
-}
-
-/**
- * Converts a quaternion of the form | a b c d | to a
- * 3x3 rotation matrix
- *
- * http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q54
- */
-void quaternion_to_directions(float quat[4], float read_dir[3],
-        float phase_dir[3], float slice_dir[3])
-{
-    float a = quat[0], b = quat[1], c = quat[2], d = quat[3];
-
-    read_dir[0]  = 1.0 - 2.0 * ( b*b + c*c );
-    phase_dir[0] = 2.0 * ( a*b - c*d );
-    slice_dir[0] = 2.0 * ( a*c + b*d );
-
-    read_dir[1]  = 2.0 * ( a*b + c*d );
-    phase_dir[1] = 1.0 - 2.0 * ( a*a + c*c );
-    slice_dir[1] = 2.0 * ( b*c - a*d );
-
-    read_dir[2]  = 2.0 * ( a*c - b*d );
-    phase_dir[2] = 2.0 * ( b*c + a*d );
-    slice_dir[2] = 1.0 - 2.0 * ( a*a + b*b );
-}
-
-#ifdef __cplusplus
-} /* namespace ISMRMRD */
-#endif
diff --git a/ismrmrd.h b/ismrmrd.h
index cac5cb1..dcaab01 100644
--- a/ismrmrd.h
+++ b/ismrmrd.h
@@ -1081,12 +1081,123 @@ protected:
 
 #endif //__cplusplus
 
-/* defined in ismrmrd.c */
-int sign_of_directions(float read_dir[3], float phase_dir[3], float slice_dir[3]);
-void directions_to_quaternion(float read_dir[3], float phase_dir[3],
-        float slice_dir[3], float quat[4]);
-void quaternion_to_directions(float quat[4], float read_dir[3],
-        float phase_dir[3], float slice_dir[3]);
+/**
+ * Calculates the determinant of the matrix and return the sign
+ */
+inline int sign_of_directions(float read_dir[3], float phase_dir[3], float slice_dir[3])
+{
+    float r11 = read_dir[0], r12 = phase_dir[0], r13 = slice_dir[0];
+    float r21 = read_dir[1], r22 = phase_dir[1], r23 = slice_dir[1];
+    float r31 = read_dir[2], r32 = phase_dir[2], r33 = slice_dir[2];
+
+    /* Determinant should be 1 or -1 */
+    float deti = (r11 * r22 * r33) + (r12 * r23 * r31) + (r21 * r32 * r13) -
+                 (r13 * r22 * r31) - (r12 * r21 * r33) - (r11 * r23 * r32);
+
+    if (deti < 0) {
+        return -1;
+    } else {
+        return 1;
+    }
+}
+
+/**
+ * Creates a normalized quaternion from a 3x3 rotation matrix
+ */
+inline void directions_to_quaternion(float read_dir[3], float phase_dir[3],
+        float slice_dir[3], float quat[4])
+{
+    float r11 = read_dir[0], r12 = phase_dir[0], r13 = slice_dir[0];
+    float r21 = read_dir[1], r22 = phase_dir[1], r23 = slice_dir[1];
+    float r31 = read_dir[2], r32 = phase_dir[2], r33 = slice_dir[2];
+
+    float a = 1, b = 0, c = 0, d = 0, s = 0;
+    float trace = 0;
+    float xd, yd, zd;
+
+    /* verify the sign of the rotation*/
+    if (sign_of_directions(read_dir, phase_dir, slice_dir) < 0) {
+        /* flip 3rd column */
+        r13 = -r13;
+        r23 = -r23;
+        r33 = -r33;
+    }
+
+    /* Compute quaternion parameters */
+    /* http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q55 */
+    trace = 1.0l + r11 + r22 + r33;
+    if (trace > 0.00001l) {                /* simplest case */
+        s = sqrt(trace) * 2;
+        a = (r32 - r23) / s;
+        b = (r13 - r31) / s;
+        c = (r21 - r12) / s;
+        d = 0.25l * s;
+    } else {
+        /* trickier case...
+         * determine which major diagonal element has
+         * the greatest value... */
+        xd = 1.0 + r11 - (r22 + r33);  /* 4**b**b */
+        yd = 1.0 + r22 - (r11 + r33);  /* 4**c**c */
+        zd = 1.0 + r33 - (r11 + r22);  /* 4**d**d */
+        /* if r11 is the greatest */
+        if (xd > 1.0) {
+            s = 2.0 * sqrt(xd);
+            a = 0.25l * s;
+            b = (r21 + r12) / s;
+            c = (r31 + r13) / s;
+            d = (r32 - r23) / s;
+        }
+        /* else if r22 is the greatest */
+        else if (yd > 1.0) {
+            s = 2.0 * sqrt(yd);
+            a = (r21 + r12) / s;
+            b = 0.25l * s;
+            c = (r32 + r23) / s;
+            d = (r13 - r31) / s;
+        }
+        /* else, r33 must be the greatest */
+        else {
+            s = 2.0 * sqrt(zd);
+            a = (r13 + r31) / s;
+            b = (r23 + r32) / s;
+            c = 0.25l * s;
+            d = (r21 - r12) / s;
+        }
+
+        if (a < 0.0l) {
+            b = -b;
+            c = -c;
+            d = -d;
+            a = -a;
+        }
+    }
+
+    quat[0] = a; quat[1] = b; quat[2] = c; quat[3] = d;
+}
+
+/**
+ * Converts a quaternion of the form | a b c d | to a
+ * 3x3 rotation matrix
+ *
+ * http://www.cs.princeton.edu/~gewang/projects/darth/stuff/quat_faq.html#Q54
+ */
+inline void quaternion_to_directions(float quat[4], float read_dir[3],
+        float phase_dir[3], float slice_dir[3])
+{
+    float a = quat[0], b = quat[1], c = quat[2], d = quat[3];
+
+    read_dir[0]  = 1.0 - 2.0 * ( b*b + c*c );
+    phase_dir[0] = 2.0 * ( a*b - c*d );
+    slice_dir[0] = 2.0 * ( a*c + b*d );
+
+    read_dir[1]  = 2.0 * ( a*b + c*d );
+    phase_dir[1] = 1.0 - 2.0 * ( a*a + c*c );
+    slice_dir[1] = 2.0 * ( b*c - a*d );
+
+    read_dir[2]  = 2.0 * ( a*c - b*d );
+    phase_dir[2] = 2.0 * ( b*c + a*d );
+    slice_dir[2] = 1.0 - 2.0 * ( a*a + b*b );
+}
 
 #ifdef __cplusplus
 } //End of ISMRMRD namespace

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ismrmrd.git



More information about the debian-science-commits mailing list