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
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
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
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 }