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
00036
00037
00038
00039 #ifndef _GMTL_GAUSSPOINTSFIT_H
00040 #define _GMTL_GAUSSPOINTSFIT_H
00041
00042
00043
00044
00045
00046
00047
00048
00049 #include <gmtl/Vec3.h>
00050 #include <gmtl/Point3.h>
00051 #include <gmtl/Numerics/Eigen.h>
00052
00053 namespace gmtl
00054 {
00055
00056
00057
00058
00059
00060
00061 void GaussPointsFit (int iQuantity, const Point3* akPoint,
00062 Point3& rkCenter, Vec3 akAxis[3], float afExtent[3]);
00063
00064
00065
00066
00067
00068
00069
00070 bool GaussPointsFit (int iQuantity, const Vec3* akPoint,
00071 const bool* abValid, Vec3& rkCenter, Vec3 akAxis[3],
00072 float afExtent[3]);
00073
00074
00075
00076 void GaussPointsFit (int iQuantity, const Point3* akPoint,
00077 Point3& rkCenter, Vec3 akAxis[3], float afExtent[3])
00078 {
00079
00080 rkCenter = akPoint[0];
00081 unsigned i;
00082 for (i = 1; i < iQuantity; i++)
00083 rkCenter += akPoint[i];
00084 float fInvQuantity = 1.0f/iQuantity;
00085 rkCenter *= fInvQuantity;
00086
00087
00088 float fSumXX = 0.0, fSumXY = 0.0, fSumXZ = 0.0;
00089 float fSumYY = 0.0, fSumYZ = 0.0, fSumZZ = 0.0;
00090 for (i = 0; i < iQuantity; i++)
00091 {
00092 Vec3 kDiff = akPoint[i] - rkCenter;
00093 fSumXX += kDiff[Xelt]*kDiff[Xelt];
00094 fSumXY += kDiff[Xelt]*kDiff[Yelt];
00095 fSumXZ += kDiff[Xelt]*kDiff[Zelt];
00096 fSumYY += kDiff[Yelt]*kDiff[Yelt];
00097 fSumYZ += kDiff[Yelt]*kDiff[Zelt];
00098 fSumZZ += kDiff[Zelt]*kDiff[Zelt];
00099 }
00100 fSumXX *= fInvQuantity;
00101 fSumXY *= fInvQuantity;
00102 fSumXZ *= fInvQuantity;
00103 fSumYY *= fInvQuantity;
00104 fSumYZ *= fInvQuantity;
00105 fSumZZ *= fInvQuantity;
00106
00107
00108 gmtl::Eigen kES(3);
00109 kES.Matrix(0,0) = fSumXX;
00110 kES.Matrix(0,1) = fSumXY;
00111 kES.Matrix(0,2) = fSumXZ;
00112 kES.Matrix(1,0) = fSumXY;
00113 kES.Matrix(1,1) = fSumYY;
00114 kES.Matrix(1,2) = fSumYZ;
00115 kES.Matrix(2,0) = fSumXZ;
00116 kES.Matrix(2,1) = fSumYZ;
00117 kES.Matrix(2,2) = fSumZZ;
00118 kES.IncrSortEigenStuff3();
00119
00120 akAxis[0][Xelt] = kES.GetEigenvector(0,0);
00121 akAxis[0][Yelt] = kES.GetEigenvector(1,0);
00122 akAxis[0][Zelt] = kES.GetEigenvector(2,0);
00123
00124 akAxis[1][Xelt] = kES.GetEigenvector(0,1);
00125 akAxis[1][Yelt] = kES.GetEigenvector(1,1);
00126 akAxis[1][Zelt] = kES.GetEigenvector(2,1);
00127
00128 akAxis[2][Xelt] = kES.GetEigenvector(0,2);
00129 akAxis[2][Yelt] = kES.GetEigenvector(1,2);
00130 akAxis[2][Zelt] = kES.GetEigenvector(2,2);
00131
00132 afExtent[0] = kES.GetEigenvalue(0);
00133 afExtent[1] = kES.GetEigenvalue(1);
00134 afExtent[2] = kES.GetEigenvalue(2);
00135 }
00136
00137
00138
00139 bool GaussPointsFit (int iQuantity, const Vec3* akPoint,
00140 const bool* abValid, Vec3& rkCenter, Vec3 akAxis[3],
00141 float afExtent[3])
00142 {
00143
00144 rkCenter = ZeroVec3;
00145 int i, iValidQuantity = 0;
00146 for (i = 0; i < iQuantity; i++)
00147 {
00148 if ( abValid[i] )
00149 {
00150 rkCenter += akPoint[i];
00151 iValidQuantity++;
00152 }
00153 }
00154 if ( iValidQuantity == 0 )
00155 return false;
00156
00157 float fInvQuantity = 1.0/iValidQuantity;
00158 rkCenter *= fInvQuantity;
00159
00160
00161 float fSumXX = 0.0, fSumXY = 0.0, fSumXZ = 0.0;
00162 float fSumYY = 0.0, fSumYZ = 0.0, fSumZZ = 0.0;
00163 for (i = 0; i < iQuantity; i++)
00164 {
00165 if ( abValid[i] )
00166 {
00167 Vec3 kDiff = akPoint[i] - rkCenter;
00168 fSumXX += kDiff[Xelt]*kDiff[Xelt];
00169 fSumXY += kDiff[Xelt]*kDiff[Yelt];
00170 fSumXZ += kDiff[Xelt]*kDiff[Zelt];
00171 fSumYY += kDiff[Yelt]*kDiff[Yelt];
00172 fSumYZ += kDiff[Yelt]*kDiff[Zelt];
00173 fSumZZ += kDiff[Zelt]*kDiff[Zelt];
00174 }
00175 }
00176 fSumXX *= fInvQuantity;
00177 fSumXY *= fInvQuantity;
00178 fSumXZ *= fInvQuantity;
00179 fSumYY *= fInvQuantity;
00180 fSumYZ *= fInvQuantity;
00181 fSumZZ *= fInvQuantity;
00182
00183
00184 Eigen kES(3);
00185 kES.Matrix(0,0) = fSumXX;
00186 kES.Matrix(0,1) = fSumXY;
00187 kES.Matrix(0,2) = fSumXZ;
00188 kES.Matrix(1,0) = fSumXY;
00189 kES.Matrix(1,1) = fSumYY;
00190 kES.Matrix(1,2) = fSumYZ;
00191 kES.Matrix(2,0) = fSumXZ;
00192 kES.Matrix(2,1) = fSumYZ;
00193 kES.Matrix(2,2) = fSumZZ;
00194 kES.IncrSortEigenStuff3();
00195
00196 akAxis[0][Xelt] = kES.GetEigenvector(0,0);
00197 akAxis[0][Yelt] = kES.GetEigenvector(1,0);
00198 akAxis[0][Zelt] = kES.GetEigenvector(2,0);
00199
00200 akAxis[1][Xelt] = kES.GetEigenvector(0,1);
00201 akAxis[1][Yelt] = kES.GetEigenvector(1,1);
00202 akAxis[1][Zelt] = kES.GetEigenvector(2,1);
00203
00204 akAxis[2][Xelt] = kES.GetEigenvector(0,2);
00205 akAxis[2][Yelt] = kES.GetEigenvector(1,2);
00206 akAxis[2][Zelt] = kES.GetEigenvector(2,2);
00207
00208 afExtent[0] = kES.GetEigenvalue(0);
00209 afExtent[1] = kES.GetEigenvalue(1);
00210 afExtent[2] = kES.GetEigenvalue(2);
00211
00212 return true;
00213 }
00214
00215 };
00216
00217
00218
00219
00220
00221
00222
00223
00224
00225
00226
00227
00228
00229
00230
00231
00232
00233
00234
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265
00266
00267
00268
00269
00270
00271
00272
00273
00274
00275
00276
00277
00278
00279
00280
00281
00282
00283
00284
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303
00304
00305
00306
00307
00308
00309
00310
00311
00312
00313
00314
00315
00316
00317
00318
00319 #endif