helper.h

Go to the documentation of this file.
00001 /* -*- C++ -*- ------------------------------------------------------------
00002  
00003 Copyright (c) 2007 Jesse Anders and Demian Nave http://cmldev.net/
00004 
00005 The Configurable Math Library (CML) is distributed under the terms of the
00006 Boost Software License, v1.0 (see cml/LICENSE for details).
00007 
00008  *-----------------------------------------------------------------------*/
00013 #ifndef helper_h
00014 #define helper_h
00015 
00016 #include <cstddef>
00017 #include <cml/constants.h>
00018 
00019 namespace cml {
00020 
00021 /* Helper classes for axis order, coordinate system handedness, z-clipping
00022  * range and spherical coordinate type.
00023  */
00024  
00026 // Euler order
00028 
00029 enum EulerOrder {
00030     euler_order_xyz, // 0x00 [0000]
00031     euler_order_xyx, // 0x01 [0001]
00032     euler_order_xzy, // 0x02 [0010]
00033     euler_order_xzx, // 0x03 [0011]
00034     euler_order_yzx, // 0x04 [0100]
00035     euler_order_yzy, // 0x05 [0101]
00036     euler_order_yxz, // 0x06 [0110]
00037     euler_order_yxy, // 0x07 [0111]
00038     euler_order_zxy, // 0x08 [1000]
00039     euler_order_zxz, // 0x09 [1001]
00040     euler_order_zyx, // 0x0A [1010]
00041     euler_order_zyz  // 0x0B [1011]
00042 };
00043 
00044 namespace detail {
00045 
00046 inline void unpack_euler_order(
00047     EulerOrder order,
00048     size_t& i,
00049     size_t& j,
00050     size_t& k,
00051     bool& odd,
00052     bool& repeat)
00053 {
00054     enum { REPEAT = 0x01, ODD = 0x02, AXIS = 0x0C };
00055 
00056     repeat = order & REPEAT;
00057     odd = ((order & ODD) == ODD);
00058     size_t offset = size_t(odd);
00059     i = (order & AXIS) % 3;
00060     j = (i + 1 + offset) % 3;
00061     k = (i + 2 - offset) % 3;
00062 }
00063 
00064 } // namespace detail
00065 
00067 // Axis order
00069 
00070 enum AxisOrder {
00071     axis_order_xyz = euler_order_xyz, // 0x00 [0000]
00072     axis_order_xzy = euler_order_xzy, // 0x02 [0010]
00073     axis_order_yzx = euler_order_yzx, // 0x04 [0100]
00074     axis_order_yxz = euler_order_yxz, // 0x06 [0110]
00075     axis_order_zxy = euler_order_zxy, // 0x08 [1000]
00076     axis_order_zyx = euler_order_zyx, // 0x0A [1010]
00077 };
00078 
00079 namespace detail {
00080 
00081 inline void unpack_axis_order(
00082     AxisOrder order,
00083     size_t& i,
00084     size_t& j,
00085     size_t& k,
00086     bool& odd)
00087 {
00088     enum { ODD = 0x02, AXIS = 0x0C };
00089 
00090     odd = ((order & ODD) == ODD);
00091     size_t offset = size_t(odd);
00092     i = (order & AXIS) % 3;
00093     j = (i + 1 + offset) % 3;
00094     k = (i + 2 - offset) % 3;
00095 }
00096 
00097 inline AxisOrder pack_axis_order(size_t i, bool odd) {
00098     return AxisOrder((i << 2) | (size_t(odd) << 1));
00099 }
00100 
00101 inline AxisOrder swap_axis_order(AxisOrder order)
00102 {
00103     size_t i, j, k;
00104     bool odd;
00105     unpack_axis_order(order, i, j, k, odd);
00106     return pack_axis_order(j, !odd);
00107 }
00108 
00109 } // namespace detail
00110 
00112 // Axis order 2D
00114 
00115 enum AxisOrder2D {
00116     axis_order_xy = axis_order_xyz, // 0x00 [0000]
00117     axis_order_yx = axis_order_yxz, // 0x06 [0110]
00118 };
00119 
00120 namespace detail {
00121 
00122 inline void unpack_axis_order_2D(
00123     AxisOrder2D order,
00124     size_t& i,
00125     size_t& j,
00126     bool& odd)
00127 {
00128     enum { ODD = 0x02, AXIS = 0x0C };
00129 
00130     odd = ((order & ODD) == ODD);
00131     size_t offset = size_t(odd);
00132     i = (order & AXIS) % 3;
00133     j = (i + 1 + offset) % 3;
00134 }
00135 
00136 } // namespace detail
00137 
00139 // Handedness
00141 
00142 enum Handedness { left_handed, right_handed };
00143 
00145 // Z clip
00147 
00148 enum ZClip { z_clip_neg_one, z_clip_zero };
00149 
00151 // Spherical coordinate type
00153 
00154 enum SphericalType { latitude, colatitude };
00155 
00156 } // namespace cml
00157 
00158 #endif

Generated on Sat Jul 18 19:35:21 2009 for CML 1.0 by  doxygen 1.5.9