|
SUMO - Simulation of Urban MObility
|
00001 /****************************************************************************/ 00007 // A RGB-color definition 00008 /****************************************************************************/ 00009 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/ 00010 // Copyright (C) 2001-2011 DLR (http://www.dlr.de/) and contributors 00011 /****************************************************************************/ 00012 // 00013 // This program is free software; you can redistribute it and/or modify 00014 // it under the terms of the GNU General Public License as published by 00015 // the Free Software Foundation; either version 2 of the License, or 00016 // (at your option) any later version. 00017 // 00018 /****************************************************************************/ 00019 00020 00021 // =========================================================================== 00022 // included modules 00023 // =========================================================================== 00024 #ifdef _MSC_VER 00025 #include <windows_config.h> 00026 #else 00027 #include <config.h> 00028 #endif 00029 00030 #include <cmath> 00031 #include <string> 00032 #include <sstream> 00033 #include <utils/common/StringTokenizer.h> 00034 #include <utils/common/TplConvert.h> 00035 #include <utils/common/MsgHandler.h> 00036 #include <utils/common/StdDefs.h> 00037 #include "RGBColor.h" 00038 00039 #ifdef CHECK_MEMORY_LEAKS 00040 #include <foreign/nvwa/debug_new.h> 00041 #endif // CHECK_MEMORY_LEAKS 00042 00043 00044 // =========================================================================== 00045 // static member definitions 00046 // =========================================================================== 00047 const std::string RGBColor::DEFAULT_COLOR_STRING = "1,1,0"; 00048 const RGBColor RGBColor::DEFAULT_COLOR = RGBColor::parseColor(RGBColor::DEFAULT_COLOR_STRING); 00049 00050 00051 // =========================================================================== 00052 // method definitions 00053 // =========================================================================== 00054 RGBColor::RGBColor() throw() 00055 : myRed(-1), myGreen(-1), myBlue(-1) {} 00056 00057 00058 RGBColor::RGBColor(SUMOReal red, SUMOReal green, SUMOReal blue) throw() 00059 : myRed(red), myGreen(green), myBlue(blue) {} 00060 00061 00062 RGBColor::RGBColor(const RGBColor& col) throw() 00063 : myRed(col.myRed), myGreen(col.myGreen), myBlue(col.myBlue) {} 00064 00065 00066 RGBColor::~RGBColor() throw() {} 00067 00068 00069 void 00070 RGBColor::set(SUMOReal r, SUMOReal g, SUMOReal b) throw() { 00071 myRed = r; 00072 myGreen = g; 00073 myBlue = b; 00074 } 00075 00076 00077 00078 std::ostream& 00079 operator<<(std::ostream& os, const RGBColor& col) { 00080 os 00081 << col.myRed << "," 00082 << col.myGreen << "," 00083 << col.myBlue; 00084 return os; 00085 } 00086 00087 00088 bool 00089 RGBColor::operator==(const RGBColor& c) const { 00090 return fabs(myRed-c.myRed)<0.1 && fabs(myGreen-c.myGreen)<0.1 && fabs(myBlue-c.myBlue)<0.1; 00091 //return myRed==c.myRed&&myGreen==c.myGreen&&myBlue==c.myBlue; 00092 } 00093 00094 00095 bool 00096 RGBColor::operator!=(const RGBColor& c) const { 00097 return fabs(myRed-c.myRed)>0.1 || fabs(myGreen-c.myGreen)>0.1 || fabs(myBlue-c.myBlue)>0.1; 00098 //return myRed!=c.myRed||myGreen!=c.myGreen||myBlue!=c.myBlue; 00099 } 00100 00101 00102 RGBColor 00103 RGBColor::changedBrightness(SUMOReal change) { 00104 SUMOReal red = MIN2(MAX2(myRed + change, (SUMOReal)0), (SUMOReal)1); 00105 SUMOReal blue = MIN2(MAX2(myBlue + change, (SUMOReal)0), (SUMOReal)1); 00106 SUMOReal green = MIN2(MAX2(myGreen + change, (SUMOReal)0), (SUMOReal)1); 00107 return RGBColor(red, green, blue); 00108 00109 } 00110 00111 RGBColor 00112 RGBColor::parseColor(const std::string& coldef) throw(EmptyData, NumberFormatException) { 00113 StringTokenizer st(coldef, ","); 00114 if (st.size()<3) { 00115 throw EmptyData(); 00116 } 00117 SUMOReal r = TplConvert<char>::_2SUMOReal(st.next().c_str()); 00118 SUMOReal g = TplConvert<char>::_2SUMOReal(st.next().c_str()); 00119 SUMOReal b = TplConvert<char>::_2SUMOReal(st.next().c_str()); 00120 return RGBColor(r, g, b); 00121 } 00122 00123 00124 RGBColor 00125 RGBColor::parseColorReporting( 00126 const std::string& coldef, const std::string& objecttype, 00127 const char* objectid, bool report, bool& ok) throw() { 00128 UNUSED_PARAMETER(report); 00129 try { 00130 return parseColor(coldef); 00131 } catch (NumberFormatException&) { 00132 } catch (EmptyData&) { 00133 } 00134 ok = false; 00135 std::ostringstream oss; 00136 oss << "Attribute 'color' in definition of "; 00137 if (objectid==0) { 00138 oss << "a "; 00139 } 00140 oss << objecttype; 00141 if (objectid!=0) { 00142 oss << " '" << objectid << "'"; 00143 } 00144 oss << " is not a valid color."; 00145 WRITE_ERROR(oss.str()); 00146 return RGBColor(); 00147 } 00148 00149 00150 RGBColor 00151 RGBColor::getDefaultColor() throw() { 00152 return parseColor(RGBColor::DEFAULT_COLOR_STRING); 00153 } 00154 00155 00156 RGBColor 00157 RGBColor::interpolate(const RGBColor& minColor, const RGBColor& maxColor, SUMOReal weight) throw() { 00158 if (weight < 0) { 00159 weight = 0; 00160 } 00161 if (weight > 1) { 00162 weight = 1; 00163 } 00164 SUMOReal r = minColor.myRed + (maxColor.myRed - minColor.myRed) * weight; 00165 SUMOReal g = minColor.myGreen + (maxColor.myGreen - minColor.myGreen) * weight; 00166 SUMOReal b = minColor.myBlue + (maxColor.myBlue - minColor.myBlue) * weight; 00167 return RGBColor(r, g, b); 00168 } 00169 00170 00171 RGBColor 00172 RGBColor::fromHSV(SUMOReal h, SUMOReal s, SUMOReal v) throw() { 00173 // H is given on [0, 6] or UNDEFINED. S and V are given on [0, 1]. 00174 // RGB are each returned on [0, 1]. 00175 //float h = HSV.H, s = HSV.S, v = HSV.V, 00176 float m, n, f; 00177 h /= 60.; 00178 int i; 00179 //if (h == UNDEFINED) RETURN_RGB(v, v, v); 00180 i = int(floor(h)); 00181 f = float(h - i); 00182 if (!(i&1)) { 00183 f = 1 - f; // if i is even 00184 } 00185 m = float(v * (1 - s)); 00186 n = float(v * (1 - s * f)); 00187 switch (i) { 00188 case 6: 00189 case 0: 00190 return RGBColor(v, n, m); 00191 case 1: 00192 return RGBColor(n, v, m); 00193 case 2: 00194 return RGBColor(m, v, n); 00195 case 3: 00196 return RGBColor(m, n, v); 00197 case 4: 00198 return RGBColor(n, m, v); 00199 case 5: 00200 return RGBColor(v, m, n); 00201 } 00202 return RGBColor(1, 1, 1); 00203 } 00204 00205 00206 /****************************************************************************/ 00207