00001
00012 #ifdef _MSC_VER
00013
00014 #include "msdevstudio/MSconfig.h"
00015 #endif
00016
00017 #include "Range.h"
00018
00019 #include <algorithm>
00020
00021 #include <cassert>
00022 #include <cmath>
00023 #include <ostream>
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 using namespace hippodraw;
00035
00036 Range::Range ( )
00037 : m_min( 0.0 ),
00038 m_max( 0.0 ),
00039 m_pos( DBL_MAX ),
00040 m_empty( true )
00041 {
00042 }
00043
00044 Range::Range ( double x, double y, double p )
00045 {
00046
00047
00048
00049
00050
00051 if ( x > y ) {
00052 m_min = 0;
00053 m_max = 0;
00054 m_pos = DBL_MAX;
00055 m_empty = true;
00056 }
00057 else{
00058 m_min = x;
00059 m_max = y;
00060 m_pos = p;
00061 m_empty = false;
00062 }
00063
00064
00065
00066
00067
00068 if ( ! ( m_min <= m_max ) ){
00069 m_min = 0;
00070 m_max = 0.1;
00071 m_pos = DBL_MAX;
00072 m_empty = true;
00073 }
00074
00075 assert ( m_min <= m_max );
00076
00077 }
00078
00079 Range::
00080 Range ( const std::vector < double > & array )
00081 {
00082 setRange ( array.begin(), array.end () );
00083 }
00084
00085 double
00086 Range::low() const
00087 {
00088 return m_min;
00089 }
00090
00091 void
00092 Range::setLow ( double x )
00093 {
00094 m_min = x;
00095 assert ( m_min <= m_max );
00096 }
00097
00098 double
00099 Range::high() const
00100 {
00101 return m_max;
00102 }
00103
00104 void
00105 Range::setHigh ( double x )
00106 {
00107 m_max = x;
00108 assert ( m_min <= m_max );
00109 }
00110
00111 double
00112 Range::pos() const
00113 {
00114 return m_pos;
00115 }
00116
00117 void
00118 Range::setPos (double x)
00119 {
00120 m_pos = x;
00121 assert ( m_min <= m_max );
00122 }
00123
00124 void
00125 Range::setRange ( double low, double high, double pos )
00126 {
00127 m_min = low;
00128 m_max = high;
00129 m_pos = pos;
00130 assert ( m_min <= m_max );
00131 }
00132
00133 void
00134 Range::setLength ( double val, bool high_hold )
00135 {
00136 if( high_hold ){
00137 m_min = m_max - val;
00138 } else {
00139 m_max = m_min + val;
00140 }
00141 assert ( m_min <= m_max );
00142 }
00143
00144 bool
00145 Range::includes ( double val ) const
00146 {
00147 return val >= m_min && val <= m_max;
00148 }
00149
00150 bool
00151 Range::
00152 excludes ( double value ) const
00153 {
00154 return value < m_min || value > m_max;
00155 }
00156
00157 double
00158 Range::
00159 fraction ( double value ) const
00160 {
00161 return ( value - m_min ) / ( m_max - m_min );
00162 }
00163
00164 void Range::setEmpty ( bool yes )
00165 {
00166 m_empty = yes;
00167 }
00168
00169 void Range::setUnion ( const Range & range )
00170 {
00171 if ( m_empty ) {
00172 m_min = range.m_min;
00173 m_max = range.m_max;
00174 m_pos = range.m_pos;
00175 m_empty = false;
00176 }
00177 else {
00178 m_min = min ( m_min, range.m_min );
00179 m_max = max ( m_max, range.m_max );
00180 m_pos = min ( m_pos, range.m_pos );
00181 }
00182
00183 assert ( m_min <= m_max );
00184
00185 }
00186
00187 void Range::setIntersect ( const Range & range )
00188 {
00189 if ( m_min > range.m_max || m_max < range.m_min ) return;
00190 m_min = max ( m_min, range.m_min );
00191 m_max = min ( m_max, range.m_max );
00192 m_pos = max ( m_pos, range.m_min );
00193
00194 assert ( m_min <= m_max );
00195 }
00196
00197 int
00198 Range::numberOfBins ( double width ) const
00199 {
00200 assert ( m_max > m_min );
00201 double number = (m_max - m_min) / width;
00202
00203 #ifdef _MSC_VER
00204 return static_cast < int > ( number+0.5 );
00205 #else
00206 return static_cast < int > ( rint( number ) );
00207 #endif
00208 }