Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

BinToColorScaleMovingBrkPt.cxx

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

Generated for HippoDraw-1.14.8.5 by doxygen 1.4.3