inlib  1.2.0
Public Member Functions | Protected Attributes
inlib::sg::axis Class Reference

List of all members.

Public Member Functions

 axis ()
virtual ~axis ()
 axis (const axis &a_from)
axisoperator= (const axis &a_from)
bool is_log (bool a_v)
bool min_value (float a_v)
bool max_value (float a_v)
float min_value () const
float max_value () const
bool is_log () const
void adjust_axis ()

Protected Attributes

float m_min_value
float m_max_value
int m_steps
bool m_is_log

Detailed Description

Definition at line 12 of file axis.


Constructor & Destructor Documentation

inlib::sg::axis::axis ( ) [inline]

Definition at line 14 of file axis.

  :m_min_value(0)
  ,m_max_value(0)
  ,m_steps(0)
  ,m_is_log(false)
  {}
virtual inlib::sg::axis::~axis ( ) [inline, virtual]

Definition at line 20 of file axis.

{}
inlib::sg::axis::axis ( const axis a_from) [inline]

Definition at line 22 of file axis.

  :m_min_value(a_from.m_min_value)
  ,m_max_value(a_from.m_max_value)
  ,m_steps(a_from.m_steps)
  ,m_is_log(a_from.m_is_log)
  {}

Member Function Documentation

void inlib::sg::axis::adjust_axis ( ) [inline]

Definition at line 55 of file axis.

                     { //from hippodraw.
    int axis = 0;
    float step;
    float mylow, myhigh;
#define N_NICE 4
    static const float nice[N_NICE] = { 1.0,2.0,2.5,5.0 };
  
    if (m_min_value > m_max_value) {
      float low = m_min_value;
      m_min_value = m_max_value;
      m_max_value = low;  
    } else if (m_min_value == m_max_value) {
      float value = m_min_value;  
      m_min_value = value - 1;
      m_max_value = value + 1;
      return;
    }
  
    //if (m_steps <= 0) {
      axis    = 1;
      m_steps = 10;
    //}

    // Round the "bin width" to a nice number.
    // If this is being done for an axis (ie m_steps was 0 , then
    // we don't have to go > *m_max_value.
    //
    float w = (m_max_value - m_min_value)/((float)m_steps);
    float mag = ffloor(flog10(w));  
    int i = 0;
    do {
      step   = nice[i] * fpow(10.0,mag);
    
      mylow  = ffloor(m_min_value/step) * step;
      myhigh = axis==1 ? fceil(m_max_value/step) * step : 
                         mylow + step * m_steps;
    
      i++;
      if (i>=N_NICE) {
        i = 0;
        mag++;
      }
    }
    while ( ( (axis==1) && myhigh < m_max_value) || 
            ( (axis==0) && myhigh <= m_max_value) );
  
    float range = myhigh - mylow;
  
    // we now have decided on a range. Try to move 
    // m_min_value/m_max_value a little
    // to end up on a nice number.
    //
    // first check if either end is near 0.0
    if ( !m_is_log && (m_min_value >= 0.0) && 
        (( (axis==1) && (range>=m_max_value) ) || 
         ( (axis==0) && (range>m_max_value) )) ) {  
      m_min_value = 0.0;
      m_max_value = range;
      return;
    }
  
    if ( (( (axis==1) && (m_max_value<=0.0) ) || 
          ( (axis==0) && (m_max_value<0.0) )) 
         && (-range<=m_min_value)) {     
      m_max_value = 0.0;
      m_min_value = -range;
      return;
    }
 
    // try to round *m_min_value.
    // correction
    if( m_is_log && (m_min_value<=0.0)) {  
      m_min_value = 1.0;
    }
    
    i   = N_NICE-1;
    mag = myhigh != 0.0 ? fceil(flog10(ffabs(myhigh))) : 
                          fceil(flog10(ffabs(mylow)));
    
    do {
      step   = nice[i] * fpow(10.0,mag);        
      mylow  = ffloor(m_min_value/step) * step;
      myhigh = mylow + range;      
      i--;
      if (i<0) {
        i = N_NICE-1;
        mag--;
      }
    } 
    while (( m_is_log && (mylow  <= 0.0)     ) || 
           ( (axis==1)  && (myhigh < m_max_value)  ) || 
           ( (axis==0)  && (myhigh <= m_max_value) ) );
    
    m_min_value = mylow;
    m_max_value = myhigh;    
  }
bool inlib::sg::axis::is_log ( bool  a_v) [inline]

Definition at line 36 of file axis.

                       {
    if(m_is_log==a_v) return false; 
    m_is_log = a_v;
    return true;
  }
bool inlib::sg::axis::is_log ( ) const [inline]

Definition at line 53 of file axis.

{return m_is_log;}
bool inlib::sg::axis::max_value ( float  a_v) [inline]

Definition at line 46 of file axis.

                            {
    if(m_max_value==a_v) return false; 
    m_max_value = a_v;
    return true;
  }
float inlib::sg::axis::max_value ( ) const [inline]

Definition at line 52 of file axis.

{return m_max_value;}
bool inlib::sg::axis::min_value ( float  a_v) [inline]

Definition at line 41 of file axis.

                            {
    if(m_min_value==a_v) return false; 
    m_min_value = a_v;
    return true;
  }
float inlib::sg::axis::min_value ( ) const [inline]

Definition at line 51 of file axis.

{return m_min_value;}
axis& inlib::sg::axis::operator= ( const axis a_from) [inline]

Definition at line 28 of file axis.

                                     {
    m_min_value = a_from.m_min_value;
    m_max_value = a_from.m_max_value;
    m_steps = a_from.m_steps;
    m_is_log = a_from.m_is_log;
    return *this;
  }

Member Data Documentation

bool inlib::sg::axis::m_is_log [protected]

Definition at line 157 of file axis.

float inlib::sg::axis::m_max_value [protected]

Definition at line 155 of file axis.

float inlib::sg::axis::m_min_value [protected]

Definition at line 154 of file axis.

int inlib::sg::axis::m_steps [protected]

Definition at line 156 of file axis.


The documentation for this class was generated from the following file:
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines