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