Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

Range.cxx

Go to the documentation of this file.
00001 
00012 #ifdef _MSC_VER
00013 // Include max() and min() missing from MicroSoft Visual C++.
00014 #include "msdevstudio/MSconfig.h"
00015 #endif
00016 
00017 #include "Range.h"
00018 
00019 #include <algorithm>
00020 #include <iostream>
00021 
00022 #include <cassert>
00023 #include <cmath>
00024 
00025 #ifndef _MSC_VER
00026 using std::floor;
00027 #endif
00028 
00029 using std::ostream;
00030 using std::max;
00031 using std::min;
00032 using std::vector;
00033 
00034 Range::Range ( )
00035   : m_min( 0.0 ),
00036     m_max( 0.0 ),
00037     m_pos( DBL_MAX ),
00038     m_empty( true )
00039 {
00040 }
00041 
00042 Range::Range ( double x, double y, double p )
00043 {
00044 
00045   // x and y are being passed as 'nan' in some cases, leading to failure
00046   // of assertion below. I dont know why they are being passed as nan and
00047   // from where.
00048 
00049   if ( x > y ) {
00050     m_min = 0; 
00051     m_max = 0;
00052     m_pos = DBL_MAX;
00053     m_empty = true;
00054   }
00055   else{
00056     m_min = x; 
00057     m_max = y;
00058     m_pos = p;
00059     m_empty = false;
00060   }
00061 
00062   // This assertion is failing.
00063   //assert ( m_min <= m_max );
00064 
00065   //This is a dirty fix:
00066   if ( ! ( m_min <= m_max ) ){
00067     m_min = 0; 
00068     m_max = 0.1;
00069     m_pos = DBL_MAX;
00070     m_empty = true;
00071   }
00072 
00073   assert ( m_min <= m_max );
00074 
00075 }
00076 
00077 Range::
00078 Range ( const std::vector < double > & array )
00079 //   : m_min ( DBL_MAX ),
00080 //     m_max ( -DBL_MAX ),
00081 //     m_pos ( DBL_MAX )
00082 {
00083   setRange ( array.begin(), array.end () );
00084 }
00085 
00086 double
00087 Range::low() const
00088 {
00089   return m_min;
00090 }
00091 
00092 void
00093 Range::setLow ( double x )
00094 {
00095   m_min = x;
00096   assert ( m_min <= m_max );
00097 }
00098 
00099 double
00100 Range::high() const
00101 {
00102   return m_max;
00103 }
00104 
00105 void
00106 Range::setHigh ( double x )
00107 {
00108   m_max = x;
00109   assert ( m_min <= m_max );
00110 }
00111 
00112 double
00113 Range::pos() const
00114 {
00115   return m_pos;
00116 }
00117 
00118 void
00119 Range::setPos (double x)
00120 {
00121   m_pos = x;
00122   assert ( m_min <= m_max );
00123 }
00124 
00125 void 
00126 Range::setRange ( double low, double high, double pos )
00127 {
00128   m_min = low;
00129   m_max = high;
00130   m_pos = pos;
00131   assert ( m_min <= m_max );
00132 }
00133 
00134 // double
00135 // Range::length() const
00136 // {
00137 //   return (m_max - m_min);
00138 // }
00139 
00140 void
00141 Range::setLength ( double val, bool high_hold )
00142 {
00143   if( high_hold ){
00144     m_min = m_max - val;
00145   } else {
00146     m_max = m_min + val;
00147   }
00148   assert ( m_min <= m_max );
00149 }
00150 
00151 bool
00152 Range::includes ( double val ) const
00153 {
00154   return val >= m_min && val <= m_max;
00155 }
00156 
00157 bool
00158 Range::
00159 excludes ( double value ) const
00160 {
00161   return value < m_min || value > m_max;
00162 }
00163 
00164 double
00165 Range::
00166 fraction ( double value ) const
00167 {
00168   return ( value - m_min ) / ( m_max - m_min );
00169 }
00170 
00171 void Range::setEmpty ( bool yes )
00172 {
00173   m_empty = yes;
00174 }
00175 
00176 void Range::setUnion ( const Range & range )
00177 {
00178   if ( m_empty ) {
00179     m_min = range.m_min;
00180     m_max = range.m_max;
00181     m_pos = range.m_pos;
00182     m_empty = false;
00183   }
00184   else {
00185     m_min = min ( m_min, range.m_min );
00186     m_max = max ( m_max, range.m_max );
00187     m_pos = min ( m_pos, range.m_pos );
00188   }
00189 
00190   assert ( m_min <= m_max );
00191 
00192 }
00193 
00194 void Range::setIntersect ( const Range & range )
00195 {
00196   if ( m_min > range.m_max || m_max < range.m_min ) return;
00197   m_min = max ( m_min, range.m_min );
00198   m_max = min ( m_max, range.m_max );
00199   m_pos = max ( m_pos, range.m_min );
00200   
00201   assert ( m_min <= m_max );
00202 }
00203 
00204 int
00205 Range::numberOfBins ( double width ) const
00206 {
00207   assert ( m_max > m_min );
00208 
00209   return static_cast< int > ( floor ( (m_max - m_min) / width + 0.5 ) );
00210 }
00211 
00212 ostream & operator << ( ostream & o, const Range & range )
00213 {
00214   o << "range = {"
00215     << range.m_min << ", "
00216     << range.m_max << "; "
00217     << range.m_pos << "}";
00218   return o;
00219 }

Generated for HippoDraw-1.14.8.5 by doxygen 1.4.3