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 #ifndef HxHistogram_h
00036 #define HxHistogram_h
00037
00038 #include <list>
00039 #include "HxRcPtr.h"
00040 #include "HxString.h"
00041 #include "HxPointInt.h"
00042 #include "HxScalarInt.h"
00043 #include "HxScalarDouble.h"
00044 #include "HxVec2Int.h"
00045 #include "HxVec2Double.h"
00046 #include "HxVec3Int.h"
00047 #include "HxVec3Double.h"
00048 #include "HxHistogramData.h"
00049 #include "HxIo.h"
00050
00060 class HxHistogram {
00061 public:
00062
00064
00067 HxHistogram();
00068
00070 HxHistogram(const HxHistogram&);
00071
00075 HxHistogram(int dimSize);
00076
00080 HxHistogram(int dimSize1, int dimSize2);
00081
00085 HxHistogram(int dimSize1, int dimSize2, int dimSize3);
00086
00091 HxHistogram(HxValueType dataType, int dimensions,
00092 int dimSize1, int dimSize2 = 0, int dimSize3 = 0);
00093
00097 HxHistogram(HxValueType dataType, int dimensions,
00098 double lowBin1, double highBin1, int nBins1,
00099 double lowBin2, double highBin2, int nBins2,
00100 double lowBin3, double highBin3, int nBins3);
00101
00103 HxHistogram(HxString filename);
00104
00105
00107
00109
00111 ~HxHistogram();
00113
00115
00117 HxHistogram& operator=(const HxHistogram&);
00118
00120 int isNull() const;
00121
00123 operator int() const;
00125
00127
00129 int ident() const;
00130
00134 HxValueType dataType() const;
00135
00137 int dimensionality() const;
00138
00142 int dimensionSize(int dim) const;
00143
00146 int nrOfBins() const;
00147
00149 double lowBin(int dim) const;
00150
00152 double highBin(int dim) const;
00153
00155 double binWidth(int dim) const;
00156
00158 double binToValue(int bin, int dimension) const;
00159
00161 int valueToBin(double value, int dimension) const;
00162
00164 double get(int bin1) const;
00165
00167 double get(int bin1, int bin2) const;
00168
00170 double get(int bin1, int bin2, int bin3) const;
00172
00174
00176 void insertValChecked(int val);
00177
00179 void insertValChecked(double val);
00180
00182 void insertValChecked(HxScalarInt val);
00183
00185 void insertValChecked(HxScalarDouble val);
00186
00188 void insertValChecked(HxVec2Int val);
00189
00191 void insertValChecked(HxVec2Double val);
00192
00194 void insertValChecked(HxVec3Int val);
00195
00197 void insertValChecked(HxVec3Double val);
00198
00203 void incBinChecked(int bin);
00204
00209 void incBinChecked(int bin1, int bin2);
00210
00215 void incBinChecked(int bin1, int bin2, int bin3);
00217
00219
00222 void insertVal(int val);
00223
00225 void insertVal(double val);
00226
00228 void insertVal(double val, double sigma);
00229
00231 void insertVal(HxScalarInt val);
00232
00234 void insertVal(HxScalarDouble val);
00235
00237 void insertVal(HxVec2Int val);
00238
00240 void insertVal(HxVec2Double val);
00241
00243 void insertVal(HxVec3Int val);
00244
00246 void insertVal(HxVec3Double val);
00247
00248
00252 void incBin(int bin);
00253
00257 void incBin(int bin1, int bin2);
00258
00262 void incBin(int bin1, int bin2, int bin3);
00263
00267 void setBin(int bin1, long val);
00268
00272 void setBin(int bin1, int bin2, long val);
00273
00277 void setBin(int bin1, int bin2, int bin3, long val);
00278
00282 void setBin(int bin1, double val);
00283
00287 void setBin(int bin1, int bin2, double val);
00288
00292 void setBin(int bin1, int bin2, int bin3, double val);
00293
00295
00297
00299 HxHistogram smooth(double sigma = 3.0);
00300
00302 std::list<HxVec2Double> modes();
00303
00305 HxHistogram normalize(double weight = 1.0);
00306
00308 double sum() const;
00309
00311 double minVal() const;
00312
00316 double minVal(int *index) const;
00317
00319 double maxVal() const;
00320
00324 double maxVal(int *index) const;
00325
00327 double intersection(const HxHistogram&) const;
00328
00330 double chiSquare(const HxHistogram&) const;
00331
00333 double chiSquareNorm(const HxHistogram&) const;
00334
00336
00338
00340 HxHistogram convert(HxValueType dataType);
00341
00345 void getDataDouble(double* data);
00346
00350 void getDataInt(int* data);
00351
00356 void render3d(int* data, int dataWidth, int dataHeight,
00357 double elevation, double alpha, double threshold);
00358
00360 STD_OSTREAM& put(STD_OSTREAM&, HxString delimit = " ") const;
00361
00363 int write(HxString filename);
00364
00366
00368
00373 HxHistogram threshold(double valThreshold);
00374
00378 int countBins(double valThreshold=0.0);
00379
00384 HxHistogram reduceRange(int binMin1, int binMax1=-1,
00385 int binMin2=0, int binMax2=-1,
00386 int binMin3=0, int binMax3=-1);
00387
00394 HxHistogram reduceRangeVal(double binValMin1, double binValMax1,
00395 double binValMin2=0, double binValMax2=0,
00396 double binValMin3=0, double binValMax3=0);
00397
00401 HxHistogram to1D(int dim=1);
00402
00404 private:
00405
00406 HxHistogram(const HxHistogramData*);
00407
00408 int isEqualSize(const HxHistogram&) const;
00409
00410 HxRcPtr<HxHistogramData> _data;
00411
00412 };
00413
00414 inline STD_OSTREAM&
00415 operator<<(STD_OSTREAM& os, const HxHistogram& his)
00416 {
00417 return his.put(os);
00418 }
00419
00420 inline HxString
00421 makeString(const HxHistogram& his)
00422 {
00423 return HxString("HxHistogram") + makeString(his.ident());
00424 }
00425
00426 inline double
00427 HxHistogram::get(int bin1) const
00428 {
00429 return _data ? _data->getBin(bin1) : 0;
00430 }
00431
00432 inline double
00433 HxHistogram::get(int bin1, int bin2) const
00434 {
00435 return _data ? _data->getBin(bin2 * _data->_dimSize1 + bin1) : 0;
00436 }
00437
00438 inline double
00439 HxHistogram::get(int bin1, int bin2, int bin3) const
00440 {
00441 return _data ? _data->getBin((bin3 * _data->_dimSize2 + bin2) *
00442 _data->_dimSize1 + bin1) : 0;
00443 }
00444
00445 inline void
00446 HxHistogram::incBin(int bin)
00447 {
00448 if ((bin >= 0) && (bin < _data->_dimSize1))
00449 _data->incBin(bin);
00450 }
00451
00452 inline void
00453 HxHistogram::incBin(int bin1, int bin2)
00454 {
00455 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00456 (bin2 >= 0) && (bin2 < _data->_dimSize2))
00457 _data->incBin(bin2 * _data->_dimSize1 + bin1);
00458 }
00459
00460 inline void
00461 HxHistogram::incBin(int bin1, int bin2, int bin3)
00462 {
00463 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00464 (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00465 (bin3 >= 0) && (bin3 < _data->_dimSize3))
00466 _data->incBin((bin3 * _data->_dimSize2 + bin2) *
00467 _data->_dimSize1 + bin1);
00468 }
00469
00470 inline void
00471 HxHistogram::setBin(int bin1, long val)
00472 {
00473 if ((bin1 >= 0) && (bin1 < _data->_dimSize1))
00474 _data->setBin(bin1, val);
00475 }
00476
00477 inline void
00478 HxHistogram::setBin(int bin1, int bin2, long val)
00479 {
00480 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00481 (bin2 >= 0) && (bin2 < _data->_dimSize2))
00482 _data->setBin(bin2 * _data->_dimSize1 + bin1, val);
00483 }
00484
00485 inline void
00486 HxHistogram::setBin(int bin1, int bin2, int bin3, long val)
00487 {
00488 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00489 (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00490 (bin3 >= 0) && (bin3 < _data->_dimSize3))
00491 _data->setBin((bin3 * _data->_dimSize2 + bin2) *
00492 _data->_dimSize1 + bin1, val);
00493 }
00494
00495 inline void
00496 HxHistogram::setBin(int bin1, double val)
00497 {
00498 if ((bin1 >= 0) && (bin1 < _data->_dimSize1))
00499 _data->setBin(bin1, val);
00500 }
00501
00502 inline void
00503 HxHistogram::setBin(int bin1, int bin2, double val)
00504 {
00505 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00506 (bin2 >= 0) && (bin2 < _data->_dimSize2))
00507 _data->setBin(bin2 * _data->_dimSize1 + bin1, val);
00508 }
00509
00510 inline void
00511 HxHistogram::setBin(int bin1, int bin2, int bin3, double val)
00512 {
00513 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00514 (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00515 (bin3 >= 0) && (bin3 < _data->_dimSize3))
00516 _data->setBin((bin3 * _data->_dimSize2 + bin2) *
00517 _data->_dimSize1 + bin1, val);
00518 }
00519
00520 inline void
00521 HxHistogram::insertVal(int val)
00522 {
00523 incBin((int) (((val - _data->_lowBin1) / _data->_binWidth1) + 0.5));
00524 }
00525
00526 inline void
00527 HxHistogram::insertVal(double val)
00528 {
00529 incBin((int) (((val - _data->_lowBin1) / _data->_binWidth1) + 0.5));
00530 }
00531
00532 inline void
00533 HxHistogram::insertVal(HxScalarInt val)
00534 {
00535 incBin((int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5));
00536 }
00537
00538 inline void
00539 HxHistogram::insertVal(HxScalarDouble val)
00540 {
00541 incBin((int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5));
00542 }
00543
00544 inline void
00545 HxHistogram::insertVal(HxVec2Int val)
00546 {
00547 incBin((int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5),
00548 (int) (((val.y() - _data->_lowBin2) / _data->_binWidth2) + 0.5));
00549 }
00550
00551 inline void
00552 HxHistogram::insertVal(HxVec2Double val)
00553 {
00554 incBin((int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5),
00555 (int) (((val.y() - _data->_lowBin2) / _data->_binWidth2) + 0.5));
00556 }
00557
00558 inline void
00559 HxHistogram::insertVal(HxVec3Int val)
00560 {
00561 incBin((int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5),
00562 (int) (((val.y() - _data->_lowBin2) / _data->_binWidth2) + 0.5),
00563 (int) (((val.z() - _data->_lowBin3) / _data->_binWidth3) + 0.5));
00564 }
00565
00566 inline void
00567 HxHistogram::insertVal(HxVec3Double val)
00568 {
00569 incBin((int) (((val.x() - _data->_lowBin1) / _data->_binWidth1) + 0.5),
00570 (int) (((val.y() - _data->_lowBin2) / _data->_binWidth2) + 0.5),
00571 (int) (((val.z() - _data->_lowBin3) / _data->_binWidth3) + 0.5));
00572 }
00573
00574 #endif