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 }