00001 #ifndef HISTOGRAMDATA
00002 #define HISTOGRAMDATA
00003
00004 #include <map>
00005 #include <vector>
00006
00008
00011 class HistogramData {
00012 private:
00013 unsigned count_;
00014
00015 typedef std::map<unsigned short, unsigned> data_type;
00016 typedef data_type::const_iterator citer_type;
00017
00018 data_type data_;
00019
00020 public:
00022 HistogramData() :
00023 count_(0)
00024 {
00025 }
00026
00028 void AddData(unsigned short value)
00029 {
00030
00031 if (value) {
00032 ++count_;
00033 ++data_[value];
00034 }
00035 }
00036
00038 std::vector<float> ResampleData(unsigned slice_count) const
00039 {
00040 std::vector<float> result(slice_count, 0.0f);
00041 std::vector<float> factor(slice_count, 1.0f);
00042
00043 const float x = 65536.0f / slice_count;
00044
00045 for (citer_type i = data_.begin(); i != data_.end(); ++i) {
00046 const int slice = static_cast<int> (i->first / x);
00047 const float f = 1.0f / factor[slice];
00048 result[slice] = (1.0f - f) * result[slice] + f * i->second;
00049 factor[slice] += 1.0f;
00050 }
00051
00052 return result;
00053 }
00054 };
00055
00056 #endif