Go to the documentation of this file.00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00041 
00042 #include <pcl/apps/point_cloud_editor/common.h>
00043 #include <pcl/apps/point_cloud_editor/localTypes.h>
00044 
00045 void
00046 setIdentity(float* matrix)
00047 {
00048   std::fill_n(matrix, MATRIX_SIZE, 0.0f);
00049   for (unsigned int i = 0; i < MATRIX_SIZE; i+=MATRIX_SIZE_DIM+1)
00050     matrix[i] = 1.0f;
00051 }
00052 
00053 void
00054 multMatrix(const float* left, const float* right, float* result)
00055 {
00056   float r[MATRIX_SIZE];
00057   for(unsigned int i = 0; i < MATRIX_SIZE_DIM; ++i)
00058   {
00059     for(unsigned int j = 0; j < MATRIX_SIZE_DIM; ++j)
00060     {
00061       float sum = 0.0;
00062       for(unsigned int k = 0; k < MATRIX_SIZE_DIM; ++k)
00063         sum += left[i * MATRIX_SIZE_DIM + k] * right[k * MATRIX_SIZE_DIM + j];
00064       r[i * MATRIX_SIZE_DIM + j] = sum;
00065     }
00066   }
00067   std::copy(r, r+MATRIX_SIZE, result);
00068 }
00069 
00070 
00071 
00072 
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088 
00089 
00090 
00091 
00092 
00093 
00094 
00095 
00096 
00097 
00098 
00099 
00100 
00101 
00102 
00103 
00104 
00105 
00106 
00107 
00108 
00109 bool invertMatrix(const float* matrix, float* inverse)
00110 {
00111   double inv[16], det;
00112 
00113   inv[0] = matrix[5]  * matrix[10] * matrix[15] -
00114       matrix[5]  * matrix[11] * matrix[14] -
00115       matrix[9]  * matrix[6]  * matrix[15] +
00116       matrix[9]  * matrix[7]  * matrix[14] +
00117       matrix[13] * matrix[6]  * matrix[11] -
00118       matrix[13] * matrix[7]  * matrix[10];
00119 
00120   inv[4] = -matrix[4]  * matrix[10] * matrix[15] +
00121       matrix[4]  * matrix[11] * matrix[14] +
00122       matrix[8]  * matrix[6]  * matrix[15] -
00123       matrix[8]  * matrix[7]  * matrix[14] -
00124       matrix[12] * matrix[6]  * matrix[11] +
00125       matrix[12] * matrix[7]  * matrix[10];
00126 
00127   inv[8] = matrix[4]  * matrix[9] * matrix[15] -
00128       matrix[4]  * matrix[11] * matrix[13] -
00129       matrix[8]  * matrix[5] * matrix[15] +
00130       matrix[8]  * matrix[7] * matrix[13] +
00131       matrix[12] * matrix[5] * matrix[11] -
00132       matrix[12] * matrix[7] * matrix[9];
00133 
00134   inv[12] = -matrix[4]  * matrix[9] * matrix[14] +
00135       matrix[4]  * matrix[10] * matrix[13] +
00136       matrix[8]  * matrix[5] * matrix[14] -
00137       matrix[8]  * matrix[6] * matrix[13] -
00138       matrix[12] * matrix[5] * matrix[10] +
00139       matrix[12] * matrix[6] * matrix[9];
00140 
00141   inv[1] = -matrix[1]  * matrix[10] * matrix[15] +
00142       matrix[1]  * matrix[11] * matrix[14] +
00143       matrix[9]  * matrix[2] * matrix[15] -
00144       matrix[9]  * matrix[3] * matrix[14] -
00145       matrix[13] * matrix[2] * matrix[11] +
00146       matrix[13] * matrix[3] * matrix[10];
00147 
00148   inv[5] = matrix[0]  * matrix[10] * matrix[15] -
00149       matrix[0]  * matrix[11] * matrix[14] -
00150       matrix[8]  * matrix[2] * matrix[15] +
00151       matrix[8]  * matrix[3] * matrix[14] +
00152       matrix[12] * matrix[2] * matrix[11] -
00153       matrix[12] * matrix[3] * matrix[10];
00154 
00155   inv[9] = -matrix[0]  * matrix[9] * matrix[15] +
00156       matrix[0]  * matrix[11] * matrix[13] +
00157       matrix[8]  * matrix[1] * matrix[15] -
00158       matrix[8]  * matrix[3] * matrix[13] -
00159       matrix[12] * matrix[1] * matrix[11] +
00160       matrix[12] * matrix[3] * matrix[9];
00161 
00162   inv[13] = matrix[0]  * matrix[9] * matrix[14] -
00163       matrix[0]  * matrix[10] * matrix[13] -
00164       matrix[8]  * matrix[1] * matrix[14] +
00165       matrix[8]  * matrix[2] * matrix[13] +
00166       matrix[12] * matrix[1] * matrix[10] -
00167       matrix[12] * matrix[2] * matrix[9];
00168 
00169   inv[2] = matrix[1]  * matrix[6] * matrix[15] -
00170       matrix[1]  * matrix[7] * matrix[14] -
00171       matrix[5]  * matrix[2] * matrix[15] +
00172       matrix[5]  * matrix[3] * matrix[14] +
00173       matrix[13] * matrix[2] * matrix[7] -
00174       matrix[13] * matrix[3] * matrix[6];
00175 
00176   inv[6] = -matrix[0]  * matrix[6] * matrix[15] +
00177       matrix[0]  * matrix[7] * matrix[14] +
00178       matrix[4]  * matrix[2] * matrix[15] -
00179       matrix[4]  * matrix[3] * matrix[14] -
00180       matrix[12] * matrix[2] * matrix[7] +
00181       matrix[12] * matrix[3] * matrix[6];
00182 
00183   inv[10] = matrix[0]  * matrix[5] * matrix[15] -
00184       matrix[0]  * matrix[7] * matrix[13] -
00185       matrix[4]  * matrix[1] * matrix[15] +
00186       matrix[4]  * matrix[3] * matrix[13] +
00187       matrix[12] * matrix[1] * matrix[7] -
00188       matrix[12] * matrix[3] * matrix[5];
00189 
00190   inv[14] = -matrix[0]  * matrix[5] * matrix[14] +
00191       matrix[0]  * matrix[6] * matrix[13] +
00192       matrix[4]  * matrix[1] * matrix[14] -
00193       matrix[4]  * matrix[2] * matrix[13] -
00194       matrix[12] * matrix[1] * matrix[6] +
00195       matrix[12] * matrix[2] * matrix[5];
00196 
00197   inv[3] = -matrix[1] * matrix[6] * matrix[11] +
00198       matrix[1] * matrix[7] * matrix[10] +
00199       matrix[5] * matrix[2] * matrix[11] -
00200       matrix[5] * matrix[3] * matrix[10] -
00201       matrix[9] * matrix[2] * matrix[7] +
00202       matrix[9] * matrix[3] * matrix[6];
00203 
00204   inv[7] = matrix[0] * matrix[6] * matrix[11] -
00205       matrix[0] * matrix[7] * matrix[10] -
00206       matrix[4] * matrix[2] * matrix[11] +
00207       matrix[4] * matrix[3] * matrix[10] +
00208       matrix[8] * matrix[2] * matrix[7] -
00209       matrix[8] * matrix[3] * matrix[6];
00210 
00211   inv[11] = -matrix[0] * matrix[5] * matrix[11] +
00212       matrix[0] * matrix[7] * matrix[9] +
00213       matrix[4] * matrix[1] * matrix[11] -
00214       matrix[4] * matrix[3] * matrix[9] -
00215       matrix[8] * matrix[1] * matrix[7] +
00216       matrix[8] * matrix[3] * matrix[5];
00217 
00218   inv[15] = matrix[0] * matrix[5] * matrix[10] -
00219       matrix[0] * matrix[6] * matrix[9] -
00220       matrix[4] * matrix[1] * matrix[10] +
00221       matrix[4] * matrix[2] * matrix[9] +
00222       matrix[8] * matrix[1] * matrix[6] -
00223       matrix[8] * matrix[2] * matrix[5];
00224 
00225   det = matrix[0] * inv[0] + matrix[1] * inv[4] +
00226         matrix[2] * inv[8] + matrix[3] * inv[12];
00227 
00228   if (det == 0)
00229     return (false);
00230 
00231   det = 1.0 / det;
00232 
00233   for (unsigned int i = 0; i < MATRIX_SIZE; ++i)
00234     inverse[i] = inv[i] * det;
00235 
00236   return (true);
00237 }
00238 
00239 void
00240 stringToLower(std::string &s)
00241 {
00242   std::transform(s.begin(), s.end(), s.begin(), tolower);
00243 }