From e76e521e9e1b8ca7cb373b44ec50fb846840565c Mon Sep 17 00:00:00 2001 From: nds Date: Tue, 28 Apr 2015 13:56:19 +0300 Subject: [PATCH] A colors palette for multi-color. --- src/ModelAPI/ModelAPI_Tools.cpp | 78 +++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 9 deletions(-) diff --git a/src/ModelAPI/ModelAPI_Tools.cpp b/src/ModelAPI/ModelAPI_Tools.cpp index 3564dce7c..581471df3 100644 --- a/src/ModelAPI/ModelAPI_Tools.cpp +++ b/src/ModelAPI/ModelAPI_Tools.cpp @@ -60,23 +60,83 @@ bool findVariable(const std::string& theName, double& outValue) static std::map > myColorMap; -std::vector vectorOfValues(const int theRed, const int theGreen, const int theBlue) +void appendValues(std::vector& theRGB, const int theRed, const int theGreen, const int theBlue) { - std::vector aValues; - aValues.push_back(theRed); - aValues.push_back(theGreen); - aValues.push_back(theBlue); + theRGB.push_back(theRed); + theRGB.push_back(theGreen); + theRGB.push_back(theBlue); +} + +bool containsValues(std::map >& theColorMap, std::vector& theValues) +{ + std::map >::const_iterator anIt = theColorMap.begin(), aLast = theColorMap.end(); + bool isFound = false; + for (; anIt != aLast && !isFound; anIt++) { + std::vector aValues = anIt->second; + isFound = aValues[0] == theValues[0] && + aValues[1] == theValues[1] && + aValues[2] == theValues[2]; + } + return isFound; +} + +std::vector HSVtoRGB(int theH, int theS, int theV) +{ + std::vector aRGB; + if (theH < 0 || theH > 360 || + theS < 0 || theS > 100 || + theV < 0 || theV > 100) + return aRGB; + + int aHi = (int)theH/60; - return aValues; + double aV = theV; + double aVmin = (100 - theS)*theV/100; + + double anA = (theV - aVmin)* (theH % 60) / 60; + + double aVinc = aVmin + anA; + double aVdec = theV - anA; + + double aPercentToValue = 255./100; + aV *= aPercentToValue; + aVinc *= aPercentToValue; + aVmin *= aPercentToValue; + aVdec *= aPercentToValue; + + switch(aHi) { + case 0: appendValues(aRGB, aV, aVinc, aVmin); break; + case 1: appendValues(aRGB, aVdec, aV, aVmin); break; + case 2: appendValues(aRGB, aVmin, aV, aVinc); break; + case 3: appendValues(aRGB, aVmin, aVdec, aV); break; + case 4: appendValues(aRGB, aVinc, aVmin, aV); break; + case 5: appendValues(aRGB, aV, aVmin, aVdec); break; + default: break; + } + return aRGB; } + void fillColorMap() { if (!myColorMap.empty()) return; - myColorMap[0] = vectorOfValues(127, 51, 0); - myColorMap[1] = vectorOfValues(0, 38, 225); - myColorMap[2] = vectorOfValues(255, 0, 0); + + int i = 0; + for (int s = 100; s > 0; s = s - 50) + { + for (int v = 100; v >= 40; v = v - 20) + { + for (int h = 0; h < 359 ; h = h + 60) + { + std::vector aColor = HSVtoRGB(h, s, v); + if (containsValues(myColorMap, aColor)) + continue; + myColorMap[i] = aColor; + i++; + } + } + } } void findRandomColor(std::vector& theValues) -- 2.39.2