Median.h
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:2k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // Median.h
  3. // Kari Pulli
  4. // 01/20/96
  5. //############################################################
  6. #ifndef _MEDIAN_H_
  7. #define _MEDIAN_H_
  8. #include <string.h>
  9. template <class T>  // use with float or double
  10. class Median {
  11. private:
  12.   T perc;
  13.   T *data;
  14.   int cnt;
  15.   int size;
  16.   int div_point;
  17.   void divide(void)
  18.     {
  19.       int left, right, inleft, inright;
  20.       T curr_med, temp;
  21.       div_point = perc*(cnt-.5);
  22.       left = 0;
  23.       right = cnt-1;
  24.       while (left < right) {
  25. curr_med = data[div_point];
  26. inleft  = left;
  27. inright = right;
  28. while (inleft <= inright) {
  29.   while (data[inleft]  < curr_med) inleft++;
  30.   while (data[inright] > curr_med) inright--;
  31.   if (inleft <= inright) {
  32.     temp = data[inleft];
  33.     data[inleft]  = data[inright];
  34.     data[inright] = temp;
  35.     inleft++;
  36.     inright--;
  37.   }
  38. }
  39. if (inright < div_point) left  = inleft;
  40. if (div_point < inleft)  right = inright;
  41.       }
  42.     }
  43. public:
  44.   Median(int p = 50, int s = 256) : perc(p/100.0), cnt(0), size(s)
  45.     { 
  46.       data = new T[size];
  47.       assert (data != NULL);
  48.     }
  49.   ~Median(void) { delete[] data; }
  50.   void set_percentage(float p)
  51.     { perc = p; }
  52.   void zap(void)
  53.     {
  54.       delete[] data;
  55.       data = new T[size = 256];
  56.       assert (data != NULL);
  57.       cnt = 0;
  58.     }
  59.   void clear()  { cnt = 0; }
  60.   void reserve(int n) 
  61.     { 
  62.       if (size < n) {
  63. T *tmp = new T[n];
  64. assert (tmp != NULL);
  65. memcpy(tmp, data, size*sizeof(T));
  66. //for (int i=0; i<size; i++) tmp[i] = data[i];
  67. delete[] data; data = tmp;
  68. size=n;
  69.       }
  70.     }
  71.   void operator +=(T f)
  72.     { 
  73.       if (cnt==size) {
  74. T *tmp = new T[2*size];
  75. assert (tmp != NULL);
  76. memcpy(tmp, data, size*sizeof(T));
  77. delete[] data; data = tmp;
  78. size*=2;
  79.       }
  80.       data[cnt++] = f;
  81.     }
  82.   T find(void)
  83.     {
  84.       divide();
  85.       return data[div_point];
  86.     }
  87.   T sum_until_median(void)
  88.     {
  89.       divide();
  90.       T sum = 0.0;
  91.       for (int i=0; i<=div_point; i++) sum += data[i];
  92.       return sum;
  93.     }
  94.   T avrg_sum_until_median(void)
  95.     {
  96.       return sum_until_median()/T(div_point);
  97.     }
  98.   T inlier_percentage(T thr)
  99.     {
  100.       int cnt = 0;
  101.       for (int i=0; i<size; i++) {
  102. if (data[i] < thr) cnt++;
  103.       }
  104.       return T(cnt)/T(size);
  105.     }
  106. };
  107. #endif