00001 00012 #include "BinToMovingBrkPt.h" 00013 00014 #include <cassert> 00015 00016 BinToMovingBrkPt:: 00017 BinToMovingBrkPt ( const char * name ) 00018 : BinToColor ( name ) 00019 { 00020 m_control_points.push_back(0.5); 00021 m_control_points.push_back(0.5); 00022 m_control_points.push_back(0.5); 00023 } 00024 00025 BinToMovingBrkPt::BinToMovingBrkPt ( const BinToMovingBrkPt & bin_to_color ) 00026 : BinToColor ( bin_to_color ) 00027 { 00028 00029 if(m_control_points.size()==0) 00030 { 00031 m_control_points.push_back(0.5); 00032 m_control_points.push_back(0.5); 00033 m_control_points.push_back(0.5); 00034 } 00035 } 00036 00037 BinToColor * BinToMovingBrkPt:: clone () const 00038 { 00039 return new BinToMovingBrkPt ( *this ); 00040 } 00041 00042 void BinToMovingBrkPt::doubleToColor ( double value, Color & color ) const 00043 { 00044 00045 double r=1;double g = 1;double b =1; 00046 double dv = m_range.length (); 00047 double vmin = m_range.low (); 00048 double v = value; 00049 assert(m_control_points.size()!=0); 00050 00051 double brk_pt = m_control_points[0]; 00052 double flat = m_control_points[1]; 00053 00054 if ( brk_pt < (1 - brk_pt)) 00055 flat = flat * ( brk_pt); 00056 else flat = flat * ( 1 - brk_pt); 00057 00058 if ( v < (vmin + brk_pt * dv)) 00059 r = 0; 00060 else r = ( v - vmin - brk_pt*dv ) / ( ( 1.05 - brk_pt ) * dv ); 00061 00062 00063 if ( v < (vmin + (brk_pt - flat) * dv )) 00064 g = (v - vmin) / ( (0.05+brk_pt - flat) * dv ); 00065 else if ( v > ( vmin + (brk_pt + flat) * dv )) 00066 g = 1 - ( v - vmin - ( brk_pt + flat )*dv)/( (1.05 - brk_pt - flat) * dv ); 00067 else g = 1; 00068 00069 00070 if ( v < ( vmin + brk_pt *dv)) 00071 b = ( vmin + brk_pt*dv - v ) / ( (brk_pt+0.05) * dv ); 00072 else b = 0; 00073 00074 00075 int red = static_cast < int > ( r * 255. ); 00076 int green = static_cast < int > ( g * 255. ); 00077 int blue = static_cast < int > ( b * 255. ); 00078 00079 00080 assert ( red < 256 && green < 256 && blue < 256 ); 00081 color.setColor ( red, green, blue ); 00082 } 00083 00084 bool 00085 BinToMovingBrkPt:: 00086 hasControlPoints () const 00087 { 00088 return true; 00089 }