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