00001 00012 #include "BinToKamaeScale.h" 00013 00014 #include <cmath> 00015 00016 #include <cassert> 00017 00018 BinToKamaeScale:: 00019 BinToKamaeScale ( const char * name ) 00020 : BinToColor ( name ) 00021 { 00022 } 00023 00024 BinToKamaeScale::BinToKamaeScale ( const BinToKamaeScale & bin_to_color ) 00025 : BinToColor ( bin_to_color ) 00026 { 00027 } 00028 00029 BinToColor * BinToKamaeScale:: clone () const 00030 { 00031 return new BinToKamaeScale ( *this ); 00032 } 00033 00034 void 00035 BinToKamaeScale:: 00036 doubleToColor ( double value, Color & color ) const 00037 { 00038 double dv = m_range.length (); 00039 double vmin = m_range.low (); 00040 double z = ( value - vmin ) / dv; 00041 assert ( z >= 0. && z <= 1.0 ); 00042 00043 double r = std::min ( 255., 00044 113.9 * sin ( 7.64 * pow ( z, 1.705 ) + 0.701 ) 00045 - 916.1 * pow ( ( z + 1.755), 1.862 ) 00046 + 3587.9 * z + 2563.4 ); 00047 double g = std::min ( 255., 00048 70.0 * sin ( 8.7 * pow ( z, 1.26 ) - 2.418 ) 00049 + 151.7 * pow ( z, 0.5 ) 00050 + 70.0 ); 00051 double b = std::min ( 255., 00052 194.5 * pow ( z, 2.88 ) 00053 + 99.72 * exp ( -77.24 *pow ( z - 0.742, 2 ) ) 00054 + 45.4 * pow ( z, 0.089 ) 00055 + 10.0 ); 00056 00057 int red = static_cast < int > ( r ); 00058 int green = static_cast < int > ( g ); 00059 int blue = static_cast < int > ( b ); 00060 00061 assert ( red < 256 && green < 256 && blue < 256 ); 00062 color.setColor ( red, green, blue ); 00063 }