Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #include <cmath>
00020 #include <limits>
00021 #include <stdexcept>
00022
00023 #include <rqt_multiplot/BitOperations.h>
00024
00025 #include "rqt_multiplot/ColorOperations.h"
00026
00027 namespace rqt_multiplot {
00028
00029
00030
00031
00032
00033 float ColorOperations::intToHue(unsigned char val) {
00034 return (float)BitOperations::revertByte(val)/
00035 std::numeric_limits<unsigned char>::max();
00036 }
00037
00038 unsigned char ColorOperations::hueToInt(float hue) {
00039 return BitOperations::revertByte((unsigned int)round(hue/
00040 (2.0*M_PI)*std::numeric_limits<unsigned char>::max()));
00041 }
00042
00043 QColor ColorOperations::hsvToRgb(const QColor& hsv) {
00044 QColor rgb;
00045
00046 rgb.setAlphaF(hsv.alphaF());
00047
00048 if (hsv.blueF() > 0.0) {
00049 float hue = hsv.redF()*2.0*M_PI/(60.0*M_PI/180.0);
00050 int i = floor(hue);
00051 float f = hue-i;
00052 float p = hsv.blueF()*(1.0-hsv.greenF());
00053 float q = hsv.blueF()*(1.0-hsv.greenF()*f);
00054 float t = hsv.blueF()*(1.0-hsv.greenF()*(1.0-f));
00055
00056 switch (i) {
00057 case 0:
00058 rgb.setRedF(hsv.blueF());
00059 rgb.setGreenF(t);
00060 rgb.setBlueF(p);
00061 break;
00062 case 1:
00063 rgb.setRedF(q);
00064 rgb.setGreenF(hsv.blueF());
00065 rgb.setBlueF(p);
00066 break;
00067 case 2:
00068 rgb.setRedF(p);
00069 rgb.setGreenF(hsv.blueF());
00070 rgb.setBlueF(t);
00071 break;
00072 case 3:
00073 rgb.setRedF(p);
00074 rgb.setGreenF(q);
00075 rgb.setBlueF(hsv.blueF());
00076 break;
00077 case 4:
00078 rgb.setRedF(t);
00079 rgb.setGreenF(p);
00080 rgb.setBlueF(hsv.blueF());
00081 break;
00082 default:
00083 rgb.setRedF(hsv.blueF());
00084 rgb.setGreenF(p);
00085 rgb.setBlueF(q);
00086 break;
00087 }
00088 }
00089 else {
00090 rgb.setRedF(hsv.blueF());
00091 rgb.setGreenF(hsv.blueF());
00092 rgb.setBlueF(hsv.blueF());
00093 }
00094
00095 return rgb;
00096 }
00097
00098 QColor ColorOperations::intToRgb(unsigned char val) {
00099 QColor hsv;
00100 hsv.setRgbF(intToHue(val), 1.0, 1.0, 1.0);
00101
00102 return hsvToRgb(hsv);
00103 }
00104
00105 QColor ColorOperations::invertRgb(const QColor& rgb) {
00106 return QColor::fromRgbF(1.0-rgb.redF(), 1.0-rgb.greenF(), 1.0-rgb.blueF(),
00107 rgb.alphaF());
00108 }
00109
00110 };