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
00040 #ifndef HxHistogram_h
00041 #define HxHistogram_h
00042
00043 #include <list>
00044 #include "HxRcPtr.h"
00045 #include "HxString.h"
00046 #include "HxPointInt.h"
00047 #include "HxScalarInt.h"
00048 #include "HxScalarDouble.h"
00049 #include "HxVec2Int.h"
00050 #include "HxVec2Double.h"
00051 #include "HxVec3Int.h"
00052 #include "HxVec3Double.h"
00053 #include "HxHistogramData.h"
00054 #include "HxIo.h"
00055
00067 class HxHistogram {
00068 public:
00069
00071
00074 HxHistogram();
00075
00077 HxHistogram(const HxHistogram&);
00078
00082 HxHistogram(int dimSize);
00083
00087 HxHistogram(int dimSize1, int dimSize2);
00088
00092 HxHistogram(int dimSize1, int dimSize2, int dimSize3);
00093
00098 HxHistogram(HxValueType dataType, int dimensions,
00099 int dimSize1, int dimSize2 = 0, int dimSize3 = 0);
00100
00104 HxHistogram(HxValueType dataType, int dimensions,
00105 double lowBin1, double highBin1, int nBins1,
00106 double lowBin2, double highBin2, int nBins2,
00107 double lowBin3, double highBin3, int nBins3);
00108
00110 HxHistogram(HxString filename);
00111
00112
00114
00116
00118 ~HxHistogram();
00120
00122
00124 HxHistogram& operator=(const HxHistogram&);
00125
00127 int isNull() const;
00128
00130 operator int() const;
00132
00134
00136 int ident() const;
00137
00141 HxValueType dataType() const;
00142
00144 int dimensionality() const;
00145
00149 int dimensionSize(int dim) const;
00150
00153 int nrOfBins() const;
00154
00156 double lowBin(int dim) const;
00157
00159 double highBin(int dim) const;
00160
00162 double binWidth(int dim) const;
00163
00165 double binToValue(int bin, int dimension) const;
00166
00168 int valueToBin(double value, int dimension) const;
00169
00171 double get(int bin1) const;
00172
00174 double get(int bin1, int bin2) const;
00175
00177 double get(int bin1, int bin2, int bin3) const;
00179
00181
00183 void insertValChecked(int val);
00184
00186 void insertValChecked(double val);
00187
00189 void insertValChecked(HxScalarInt val);
00190
00192 void insertValChecked(HxScalarDouble val);
00193
00195 void insertValChecked(HxVec2Int val);
00196
00198 void insertValChecked(HxVec2Double val);
00199
00201 void insertValChecked(HxVec3Int val);
00202
00204 void insertValChecked(HxVec3Double val);
00205
00210 void incBinChecked(int bin);
00211
00216 void incBinChecked(int bin1, int bin2);
00217
00222 void incBinChecked(int bin1, int bin2, int bin3);
00224
00226
00229 void insertVal(int val);
00230
00232 void insertVal(double val);
00233
00235 void insertVal(double val, double sigma);
00236
00238 void insertVal(HxScalarInt val);
00239
00241 void insertVal(HxScalarDouble val);
00242
00244 void insertVal(HxVec2Int val);
00245
00247 void insertVal(HxVec2Double val);
00248
00250 void insertVal(HxVec3Int val);
00251
00253 void insertVal(HxVec3Double val);
00254
00255
00259 void incBin(int bin);
00260
00264 void incBin(int bin1, int bin2);
00265
00269 void incBin(int bin1, int bin2, int bin3);
00270
00274 void setBin(int bin1, long val);
00275
00279 void setBin(int bin1, int bin2, long val);
00280
00284 void setBin(int bin1, int bin2, int bin3, long val);
00285
00289 void setBin(int bin1, double val);
00290
00294 void setBin(int bin1, int bin2, double val);
00295
00299 void setBin(int bin1, int bin2, int bin3, double val);
00300
00302
00304
00306 HxHistogram smooth(double sigma = 3.0);
00307
00309 std::list<HxVec2Double> modes();
00310
00312 HxHistogram normalize(double weight = 1.0);
00313
00315 double sum() const;
00316
00318 double minVal() const;
00319
00323 double minVal(int *index) const;
00324
00326 double maxVal() const;
00327
00331 double maxVal(int *index) const;
00332
00334 double intersection(const HxHistogram&) const;
00335
00337 double chiSquare(const HxHistogram&) const;
00338
00340 double chiSquareNorm(const HxHistogram&) const;
00341
00343
00345
00346 int computeIsodataThreshold(void);
00347 int computeEntropyThreshold(void);
00349
00350
00352
00354 HxHistogram convert(HxValueType dataType);
00355
00361 void getTheData(double *x, double* y);
00362
00368 void getTheData2(double *x1, double *x2, double* y);
00369
00375 void getTheData3(double *x1, double *x2, double *x3,
00376 double* y);
00377
00381 void getDataDouble(double* data);
00382
00386 void getDataInt(int* data);
00387
00392 void render3d(int* data, int dataWidth, int dataHeight,
00393 double elevation, double alpha, double threshold);
00394
00396 STD_OSTREAM& put(STD_OSTREAM&, HxString delimit = " ") const;
00397
00399 int write(HxString filename);
00400
00402
00404
00409 HxHistogram threshold(double valThreshold);
00410
00414 int countBins(double valThreshold=0.0);
00415
00420 HxHistogram reduceRange(int binMin1, int binMax1=-1,
00421 int binMin2=0, int binMax2=-1,
00422 int binMin3=0, int binMax3=-1);
00423
00430 HxHistogram reduceRangeVal(double binValMin1, double binValMax1,
00431 double binValMin2=0, double binValMax2=0,
00432 double binValMin3=0, double binValMax3=0);
00433
00437 HxHistogram to1D(int dim=1);
00438
00440 private:
00441
00442 HxHistogram(const HxHistogramData*);
00443
00444 int isEqualSize(const HxHistogram&) const;
00445
00446 HxRcPtr<HxHistogramData> _data;
00447
00448 };
00449
00450 inline STD_OSTREAM&
00451 operator<<(STD_OSTREAM& os, const HxHistogram& his)
00452 {
00453 return his.put(os);
00454 }
00455
00456 inline HxString
00457 makeString(const HxHistogram& his)
00458 {
00459 return HxString("HxHistogram") + makeString(his.ident());
00460 }
00461
00462 inline double
00463 HxHistogram::get(int bin1) const
00464 {
00465 return _data ? _data->getBin(bin1) : 0;
00466 }
00467
00468 inline double
00469 HxHistogram::get(int bin1, int bin2) const
00470 {
00471 return _data ? _data->getBin(bin2 * _data->_dimSize1 + bin1) : 0;
00472 }
00473
00474 inline double
00475 HxHistogram::get(int bin1, int bin2, int bin3) const
00476 {
00477 return _data ? _data->getBin((bin3 * _data->_dimSize2 + bin2) *
00478 _data->_dimSize1 + bin1) : 0;
00479 }
00480
00481 inline void
00482 HxHistogram::incBin(int bin)
00483 {
00484 if ((bin >= 0) && (bin < _data->_dimSize1))
00485 _data->incBin(bin);
00486 }
00487
00488 inline void
00489 HxHistogram::incBin(int bin1, int bin2)
00490 {
00491 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00492 (bin2 >= 0) && (bin2 < _data->_dimSize2))
00493 _data->incBin(bin2 * _data->_dimSize1 + bin1);
00494 }
00495
00496 inline void
00497 HxHistogram::incBin(int bin1, int bin2, int bin3)
00498 {
00499 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00500 (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00501 (bin3 >= 0) && (bin3 < _data->_dimSize3))
00502 _data->incBin((bin3 * _data->_dimSize2 + bin2) *
00503 _data->_dimSize1 + bin1);
00504 }
00505
00506 inline void
00507 HxHistogram::setBin(int bin1, long val)
00508 {
00509 if ((bin1 >= 0) && (bin1 < _data->_dimSize1))
00510 _data->setBin(bin1, val);
00511 }
00512
00513 inline void
00514 HxHistogram::setBin(int bin1, int bin2, long val)
00515 {
00516 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00517 (bin2 >= 0) && (bin2 < _data->_dimSize2))
00518 _data->setBin(bin2 * _data->_dimSize1 + bin1, val);
00519 }
00520
00521 inline void
00522 HxHistogram::setBin(int bin1, int bin2, int bin3, long val)
00523 {
00524 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00525 (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00526 (bin3 >= 0) && (bin3 < _data->_dimSize3))
00527 _data->setBin((bin3 * _data->_dimSize2 + bin2) *
00528 _data->_dimSize1 + bin1, val);
00529 }
00530
00531 inline void
00532 HxHistogram::setBin(int bin1, double val)
00533 {
00534 if ((bin1 >= 0) && (bin1 < _data->_dimSize1))
00535 _data->setBin(bin1, val);
00536 }
00537
00538 inline void
00539 HxHistogram::setBin(int bin1, int bin2, double val)
00540 {
00541 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00542 (bin2 >= 0) && (bin2 < _data->_dimSize2))
00543 _data->setBin(bin2 * _data->_dimSize1 + bin1, val);
00544 }
00545
00546 inline void
00547 HxHistogram::setBin(int bin1, int bin2, int bin3, double val)
00548 {
00549 if ((bin1 >= 0) && (bin1 < _data->_dimSize1) &&
00550 (bin2 >= 0) && (bin2 < _data->_dimSize2) &&
00551 (bin3 >= 0) && (bin3 < _data->_dimSize3))
00552 _data->setBin((bin3 * _data->_dimSize2 + bin2) *
00553 _data->_dimSize1 + bin1, val);
00554 }
00555
00556 inline void
00557 HxHistogram::insertVal(int val)
00558 {
00559 incBin((int) ((val - _data->_lowRange1) * _data->_binFac1));
00560 }
00561
00562 inline void
00563 HxHistogram::insertVal(double val)
00564 {
00565 incBin((int) ((val - _data->_lowRange1) * _data->_binFac1));
00566 }
00567
00568 inline void
00569 HxHistogram::insertVal(HxScalarInt val)
00570 {
00571 incBin((int) ((val.x() - _data->_lowRange1) * _data->_binFac1));
00572 }
00573
00574 inline void
00575 HxHistogram::insertVal(HxScalarDouble val)
00576 {
00577 incBin((int) ((val.x() - _data->_lowRange1) * _data->_binFac1));
00578 }
00579
00580 inline void
00581 HxHistogram::insertVal(HxVec2Int val)
00582 {
00583 incBin((int) ((val.x() - _data->_lowRange1) * _data->_binFac1),
00584 (int) ((val.y() - _data->_lowRange2) * _data->_binFac2));
00585 }
00586
00587 inline void
00588 HxHistogram::insertVal(HxVec2Double val)
00589 {
00590 incBin((int) ((val.x() - _data->_lowRange1) * _data->_binFac1),
00591 (int) ((val.y() - _data->_lowRange2) * _data->_binFac2));
00592 }
00593
00594 inline void
00595 HxHistogram::insertVal(HxVec3Int val)
00596 {
00597 incBin((int) ((val.x() - _data->_lowRange1) * _data->_binFac1),
00598 (int) ((val.y() - _data->_lowRange2) * _data->_binFac2),
00599 (int) ((val.z() - _data->_lowRange3) * _data->_binFac3));
00600 }
00601
00602 inline void
00603 HxHistogram::insertVal(HxVec3Double val)
00604 {
00605 incBin((int) ((val.x() - _data->_lowRange1) * _data->_binFac1),
00606 (int) ((val.y() - _data->_lowRange2) * _data->_binFac2),
00607 (int) ((val.z() - _data->_lowRange3) * _data->_binFac3));
00608 }
00609
00610 #endif