RGBColor.cpp

Go to the documentation of this file.
00001 /****************************************************************************/
00007 // A RGB-color definition
00008 /****************************************************************************/
00009 // SUMO, Simulation of Urban MObility; see http://sumo.sourceforge.net/
00010 // Copyright 2001-2010 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 "RGBColor.h"
00037 
00038 #ifdef CHECK_MEMORY_LEAKS
00039 #include <foreign/nvwa/debug_new.h>
00040 #endif // CHECK_MEMORY_LEAKS
00041 
00042 
00043 // ===========================================================================
00044 // static member definitions
00045 // ===========================================================================
00046 const std::string RGBColor::DEFAULT_COLOR_STRING = "1,1,0";
00047 const RGBColor RGBColor::DEFAULT_COLOR = RGBColor::parseColor(RGBColor::DEFAULT_COLOR_STRING);
00048 
00049 
00050 // ===========================================================================
00051 // method definitions
00052 // ===========================================================================
00053 RGBColor::RGBColor() throw()
00054         : myRed(-1), myGreen(-1), myBlue(-1) {}
00055 
00056 
00057 RGBColor::RGBColor(SUMOReal red, SUMOReal green, SUMOReal blue) throw()
00058         : myRed(red), myGreen(green), myBlue(blue) {}
00059 
00060 
00061 RGBColor::RGBColor(const RGBColor& col) throw()
00062         : myRed(col.myRed), myGreen(col.myGreen), myBlue(col.myBlue) {}
00063 
00064 
00065 RGBColor::~RGBColor() throw() {}
00066 
00067 
00068 void
00069 RGBColor::set(SUMOReal r, SUMOReal g, SUMOReal b) throw() {
00070     myRed = r;
00071     myGreen = g;
00072     myBlue = b;
00073 }
00074 
00075 
00076 
00077 std::ostream &
00078 operator<<(std::ostream &os, const RGBColor &col) {
00079     os
00080     << col.myRed << ","
00081     << col.myGreen << ","
00082     << col.myBlue;
00083     return os;
00084 }
00085 
00086 
00087 bool
00088 RGBColor::operator==(const RGBColor &c) const {
00089     return fabs(myRed-c.myRed)<0.1 && fabs(myGreen-c.myGreen)<0.1 && fabs(myBlue-c.myBlue)<0.1;
00090     //return myRed==c.myRed&&myGreen==c.myGreen&&myBlue==c.myBlue;
00091 }
00092 
00093 
00094 bool
00095 RGBColor::operator!=(const RGBColor &c) const {
00096     return fabs(myRed-c.myRed)>0.1 || fabs(myGreen-c.myGreen)>0.1 || fabs(myBlue-c.myBlue)>0.1;
00097     //return myRed!=c.myRed||myGreen!=c.myGreen||myBlue!=c.myBlue;
00098 }
00099 
00100 
00101 RGBColor
00102 RGBColor::parseColor(const std::string &coldef) throw(EmptyData, NumberFormatException) {
00103     StringTokenizer st(coldef, ",");
00104     if (st.size()<3) {
00105         throw EmptyData();
00106     }
00107     SUMOReal r = TplConvert<char>::_2SUMOReal(st.next().c_str());
00108     SUMOReal g = TplConvert<char>::_2SUMOReal(st.next().c_str());
00109     SUMOReal b = TplConvert<char>::_2SUMOReal(st.next().c_str());
00110     return RGBColor(r, g, b);
00111 }
00112 
00113 
00114 RGBColor
00115 RGBColor::parseColorReporting(const std::string &coldef, const char *objecttype, const char *objectid, bool report, bool &ok) throw() {
00116     try {
00117         return parseColor(coldef);
00118     } catch (NumberFormatException &) {
00119     } catch (EmptyData &) {
00120     }
00121     ok = false;
00122     std::ostringstream oss;
00123     oss << "Attribute 'color' in definition of ";
00124     if (objectid==0) {
00125         oss << "a ";
00126     }
00127     if (objecttype!=0) {
00128         oss << objecttype;
00129     } else {
00130         oss << "<unknown type>";
00131     }
00132     if (objectid!=0) {
00133         oss << " '" << objectid << "'";
00134     }
00135     oss << " is not a valid color.";
00136     MsgHandler::getErrorInstance()->inform(oss.str());
00137     return RGBColor();
00138 }
00139 
00140 
00141 RGBColor
00142 RGBColor::getDefaultColor() throw() {
00143     return parseColor(RGBColor::DEFAULT_COLOR_STRING);
00144 }
00145 
00146 
00147 RGBColor
00148 RGBColor::interpolate(const RGBColor &minColor, const RGBColor &maxColor, SUMOReal weight) throw() {
00149     if (weight < 0) weight = 0;
00150     if (weight > 1) weight = 1;
00151     SUMOReal r = minColor.myRed + (maxColor.myRed - minColor.myRed) * weight;
00152     SUMOReal g = minColor.myGreen + (maxColor.myGreen - minColor.myGreen) * weight;
00153     SUMOReal b = minColor.myBlue + (maxColor.myBlue - minColor.myBlue) * weight;
00154     return RGBColor(r, g, b);
00155 }
00156 
00157 
00158 RGBColor
00159 RGBColor::fromHSV(SUMOReal h, SUMOReal s, SUMOReal v) throw() {
00160     // H is given on [0, 6] or UNDEFINED. S and V are given on [0, 1].
00161     // RGB are each returned on [0, 1].
00162     //float h = HSV.H, s = HSV.S, v = HSV.V,
00163     float m, n, f;
00164     h /= 60.;
00165     int i;
00166     //if (h == UNDEFINED) RETURN_RGB(v, v, v);
00167     i = floor(h);
00168     f = h - i;
00169     if (!(i&1)) f = 1 - f;   // if i is even
00170     m = v * (1 - s);
00171     n = v * (1 - s * f);
00172     switch (i) {
00173     case 6:
00174     case 0:
00175         return RGBColor(v, n, m);
00176     case 1:
00177         return RGBColor(n, v, m);
00178     case 2:
00179         return RGBColor(m, v, n);
00180     case 3:
00181         return RGBColor(m, n, v);
00182     case 4:
00183         return RGBColor(n, m, v);
00184     case 5:
00185         return RGBColor(v, m, n);
00186     }
00187     return RGBColor(1, 1, 1);
00188 }
00189 
00190 
00191 /****************************************************************************/
00192 

Generated on Wed May 5 00:06:36 2010 for Sumo - Simulation of Urban MObility by  doxygen 1.5.6