00001 00012 #include "BinToUsrDefinedScale.h" 00013 00014 #include <cassert> 00015 00016 BinToUsrDefinedScale:: 00017 BinToUsrDefinedScale ( const char * name ) 00018 : BinToColor ( name ) 00019 { 00020 m_control_points.push_back(0.5); 00021 m_control_points.push_back(0.25); 00022 } 00023 00024 BinToUsrDefinedScale:: 00025 BinToUsrDefinedScale ( const std::string & model_name ) 00026 : BinToColor ( model_name ) 00027 { 00028 m_control_points.push_back( 0.5 ); 00029 m_control_points.push_back( 0.25 ); 00030 } 00031 00032 BinToUsrDefinedScale:: 00033 BinToUsrDefinedScale ( const BinToUsrDefinedScale & bin_to_color ) 00034 : BinToColor ( bin_to_color ) 00035 { 00036 00037 if(m_control_points.size()==0) 00038 { 00039 m_control_points.push_back(0.5); 00040 m_control_points.push_back(0.25); 00041 } 00042 } 00043 00044 BinToColor * BinToUsrDefinedScale:: clone () const 00045 { 00046 return new BinToUsrDefinedScale ( *this ); 00047 } 00048 00049 00050 void 00051 BinToUsrDefinedScale:: 00052 doubleToColor ( double value, Color & color ) const 00053 { 00054 00055 double r = 1; double g = 1; double b = 1; 00056 double dv = m_range.length (); 00057 double vmin = m_range.low (); 00058 double v = value; 00059 00060 assert(m_control_points.size()!=0); 00061 double brk_pt = m_control_points[0]; 00062 double flat = m_control_points[1]; 00063 00064 if ( brk_pt <= (1 - brk_pt)) 00065 flat = flat * ( brk_pt); 00066 else flat = flat * ( 1 - brk_pt); 00067 00068 00069 00070 if ( v < ( vmin + ( 1.25 * brk_pt - 0.5 * flat ) * dv ) ) 00071 r = 0; 00072 00073 else if( v > ( vmin + ( 1.25 * brk_pt + 0.5 * flat ) * dv ) ) 00074 r = 1; 00075 00076 else r = ( v - vmin - ( 1.25 * brk_pt - 0.5 * flat ) * dv ) / 00077 ( ( (flat+0.001) ) * dv ); 00078 00079 00080 00081 00082 if ( v < (vmin + (brk_pt - flat) * dv )) 00083 g = (v - vmin) / ( (0.001+brk_pt - flat) * dv ); 00084 00085 else if ( v > ( vmin + (brk_pt + flat) * dv )) 00086 00087 g = 1 - ( v - vmin - ( brk_pt + flat )*dv)/ 00088 ( (1.001 - brk_pt - flat) * dv ); 00089 00090 else g = 1; 00091 00092 00093 00094 00095 if ( v < (vmin + ( 0.75 * brk_pt - 0.5 * flat ) * dv ) ) 00096 b = 1; 00097 00098 else if( v > (vmin + ( 0.75 * brk_pt + 0.5 * flat ) * dv ) ) 00099 b = 0; 00100 00101 else b = 1 - ( v - vmin - ( 0.75 * brk_pt - 0.5 * flat)*dv ) / 00102 ( ( (flat + 0.001) ) * dv ); 00103 00104 00105 00106 00107 int red = static_cast < int > ( r * 255. ); 00108 int green = static_cast < int > ( g * 255. ); 00109 int blue = static_cast < int > ( b * 255. ); 00110 00111 00112 assert ( red < 256 && green < 256 && blue < 256 ); 00113 color.setColor ( red, green, blue ); 00114 } 00115 00116 bool 00117 BinToUsrDefinedScale:: 00118 hasControlPoints () const 00119 { 00120 return false; 00121 }