BinToColorScaleMovingBrkPt.cxx

Go to the documentation of this file.
00001 
00012 #include "BinToColorScaleMovingBrkPt.h"
00013 
00014 #include <cmath>
00015 #include <cassert>
00016 
00017 using std::vector;
00018 
00019 using namespace hippodraw;
00020 
00021 BinToColorScaleMovingBrkPt::
00022 BinToColorScaleMovingBrkPt ( const char * name )
00023   : BinToColor ( name )
00024 {
00025   m_control_points.push_back(0.5);
00026   m_control_points.push_back(0.25);
00027   m_control_points.push_back(0);
00028  
00029 }
00030 
00031 BinToColorScaleMovingBrkPt::
00032 BinToColorScaleMovingBrkPt ( const std::vector < double > & sv, 
00033                              const char * model_name)
00034   : BinToColor ( model_name )
00035 {
00036   assert(sv.size()!=0);
00037   m_control_points.push_back(sv[0]);
00038   m_control_points.push_back(sv[1]);
00039   m_control_points.push_back(sv[2]);
00040 }
00041 
00042 BinToColorScaleMovingBrkPt::
00043 BinToColorScaleMovingBrkPt ( const BinToColorScaleMovingBrkPt & bin_to_color )
00044   : BinToColor ( bin_to_color )
00045 {
00046  
00047   if(m_control_points.size()==0)
00048     {
00049       m_control_points.push_back( 0.5 );
00050       m_control_points.push_back( 0.25 );
00051       m_control_points.push_back( 0 );
00052     }
00053 }
00054 
00055 BinToColor * BinToColorScaleMovingBrkPt:: clone () const
00056 {
00057   return new BinToColorScaleMovingBrkPt ( *this );
00058 }
00059 
00060 
00061 void
00062 BinToColorScaleMovingBrkPt::
00063 doubleToColor ( double value, Color & color ) const
00064 {
00065    double r = 1; double g = 1; double b = 1;   
00066    double v = value;
00067 
00068    assert(m_control_points.size()!=0);
00069    double brk_pt = m_control_points[0];
00070    double flat = m_control_points[1];
00071    double col = m_control_points[2];
00072    
00073 
00074    if ( brk_pt <= (1 - brk_pt))
00075      flat = flat * ( brk_pt);
00076    else flat = flat * ( 1 - brk_pt);
00077 
00078     if ( v < ( m_vmin + col*m_dv ) )
00079       v = v + 1.5 * m_dv;
00080 
00081     //Red
00082     if ( v < ( m_vmin + ( 1.25 * brk_pt - 0.5 * flat  + col) * m_dv ) ) 
00083       r = 0;
00084 
00085     else if ( v > ( m_vmin + ( 1.25 * brk_pt - 0.5 * flat  + col) * m_dv ) &&
00086               v < ( m_vmin + ( 1.25 * brk_pt + 0.5 * flat + col) * m_dv ) )
00087       r = ( v - m_vmin - ( 1.25 * brk_pt - 0.5 * flat + col) * m_dv ) / 
00088           ( ( (flat+0.001) ) * m_dv );
00089 
00090     else if( v > ( m_vmin + ( 1.25 * brk_pt + 0.5 * flat + col) * m_dv ) &&  
00091              v < ( m_vmin + ( 1.25 + col ) * m_dv ) ) 
00092       r = 1;  
00093 
00094     else r = 1 -  4 * ( v - m_vmin - ( 1.25 + col ) * m_dv ) / m_dv;
00095 
00096 
00097     //Green
00098     if ( v < (m_vmin + (brk_pt - flat + col) * m_dv ))
00099       g = (v - m_vmin - col*m_dv ) / ( (0.001+brk_pt - flat ) * m_dv );
00100 
00101     else if ( v > (m_vmin + (brk_pt - flat + col) * m_dv ) &&
00102               v < ( m_vmin + (brk_pt + flat + col) * m_dv ) )      
00103       g = 1;
00104 
00105     else if ( v > ( m_vmin + (brk_pt + flat + col) * m_dv ) &&
00106               v < ( m_vmin + ( 1 + col ) * m_dv ) )       
00107 
00108       g =  1 - ( v - m_vmin - ( brk_pt + flat + col )*m_dv)/
00109        ( (1.001 - brk_pt - flat ) * m_dv );
00110   
00111     else  g = 0;
00112    
00113 
00114     //Blue
00115     if ( v < (m_vmin + ( 0.75 * brk_pt -  0.5 * flat + col ) * m_dv ) ) 
00116       b = 1;
00117 
00118     else if ( v > (m_vmin + ( 0.75 * brk_pt -  0.5 * flat + col ) * m_dv ) &&
00119               v < (m_vmin + ( 0.75 * brk_pt  +  0.5 * flat  + col) * m_dv ) ) 
00120      
00121       b = 1 - ( v - m_vmin - ( 0.75 * brk_pt - 0.5 * flat + col )*m_dv ) / 
00122         ( ( (flat + 0.001) ) * m_dv );
00123  
00124     else if ( v > (m_vmin + ( 0.75 * brk_pt  +  0.5 * flat  + col) * m_dv ) && 
00125                v < ( m_vmin + ( 1 + col ) * m_dv ) ) 
00126       b = 0;  
00127 
00128     else if ( v > ( m_vmin + ( 1 + col ) * m_dv ) &&  
00129               v < ( m_vmin + ( 1.25 + col ) * m_dv ) )
00130      
00131       b = 4 * ( v - m_vmin - ( 1 + col ) * m_dv ) / m_dv ; 
00132 
00133     else b = 1;
00134 
00135    int red   = static_cast < int > ( r * 255. );
00136    int green = static_cast < int > ( g * 255. );
00137    int blue  = static_cast < int > ( b * 255. );
00138    
00139  
00140    assert ( red < 256 && green < 256 && blue < 256 );
00141    color.setColor ( red, green, blue );
00142 }
00143 
00144 bool
00145 BinToColorScaleMovingBrkPt::
00146 hasControlPoints () const
00147 {
00148   return true;
00149 }

Generated for HippoDraw Class Library by doxygen