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