00001
00012 #ifdef _MSC_VER
00013
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
00046
00047
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
00063
00064
00065
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
00080
00081
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
00135
00136
00137
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 }