00001
00012
00013 #ifdef _MSC_VER
00014 #include "msdevstudio/MSconfig.h"
00015 #endif
00016
00017 #include "BinnerAxis.h"
00018
00019 using std::vector;
00020 using std::string;
00021
00022 using namespace hippodraw;
00023
00024 int BinnerAxis::s_num_bins = 50;
00025 double BinnerAxis::s_bin_factor = 0.75;
00026
00027 BinnerAxis::BinnerAxis ( const char * name )
00028 : m_name ( name ),
00029 m_dragging ( false ),
00030 m_num_bins ( s_num_bins ),
00031 m_range( 0.0, 50.0 ),
00032 m_offset( 0.0 ),
00033 m_width ( -1.0 )
00034 {
00035 }
00036
00037 BinnerAxis::BinnerAxis ( const BinnerAxis & binner )
00038 : m_name ( binner.m_name ),
00039 m_dragging ( false ),
00040 m_num_bins( binner.m_num_bins ),
00041 m_range ( binner.m_range ),
00042 m_offset ( binner.m_offset ),
00043 m_width ( binner.m_width )
00044 {
00045 }
00046
00047 BinnerAxis::~BinnerAxis ()
00048 {
00049 }
00050
00051 const string &
00052 BinnerAxis::
00053 name () const
00054 {
00055 return m_name;
00056 }
00057
00058 bool
00059 BinnerAxis::hasEqualWidths () const
00060 {
00061 return false;
00062 }
00063
00064 double
00065 BinnerAxis::axisGetLow() const
00066 {
00067 return m_range.low();
00068 }
00069
00070 double
00071 BinnerAxis::axisGetHigh() const
00072 {
00073 return m_range.high();
00074 }
00075
00076 const Range &
00077 BinnerAxis::
00078 getRange() const
00079 {
00080 return m_range;
00081 }
00082
00083 int
00084 BinnerAxis::axisNumberOfBins () const
00085 {
00086 return m_num_bins;
00087 }
00088
00089 void
00090 BinnerAxis::setStartRange ( bool dragging ) const
00091 {
00092 if ( m_dragging == false ) {
00093 m_range_start = m_range;
00094 }
00095
00096 m_dragging = dragging;
00097 }
00098
00099 void
00100 BinnerAxis::setStartWidth ( bool dragging ) const
00101 {
00102 if ( m_dragging == false ) {
00103 m_width_start = m_width;
00104 }
00105
00106 m_dragging = dragging;
00107 }
00108
00109
00110 const vector< double > & BinnerAxis::binEdges ()
00111 {
00112
00113 if( m_bin_edges.size() == 0 )
00114 {
00115 m_bin_edges.resize( m_num_bins + 1);
00116
00117 m_bin_edges[0] = m_range.low();
00118
00119 for( int i = 0; i < m_num_bins; i ++ )
00120 m_bin_edges[i] = m_bin_edges[i-1] + axisBinWidth( i );
00121
00122 m_bin_edges[ m_num_bins + 1 ] = m_range.high();
00123 }
00124
00125 return m_bin_edges;
00126 }
00127
00128 double
00129 BinnerAxis::
00130 calcBinWidth ( int parm, bool dragging ) const
00131 {
00132 setStartWidth ( dragging );
00133
00134 double multiplier = ( 50 - parm ) / 50.0;
00135 int num_start = getNob ( m_width_start );
00136 if ( num_start == 1 ) {
00137 multiplier *= 4.0;
00138 }
00139 double num_new = num_start + num_start * multiplier;
00140
00141 num_new = std::max ( 1.0, num_new );
00142 m_num_bins = static_cast < int > ( num_new );
00143 double new_width = calcWidthParm ( m_num_bins );
00144
00145 return new_width;
00146 }
00147