EgtGeomKernel 1.9a1 :

- aggiunte funzioni per conversione colore RGB in HSV e viceversa
- modifiche a VolZmap per gestione Flag utensile.
This commit is contained in:
Dario Sassi
2018-01-16 12:15:11 +00:00
parent fd4657d797
commit a2a63bf5c1
5 changed files with 246 additions and 185 deletions
+71
View File
@@ -13,8 +13,12 @@
//--------------------------- Include ----------------------------------------
#include "stdafx.h"
#include "/EgtDev/Include/EGkGeoConst.h"
#include "/EgtDev/Include/EGkColor.h"
#include "/EgtDev/Include/EGkAngle.h"
#include "/EgtDev/Include/EGnStringUtils.h"
#include "/EgtDev/Include/EGtNumUtils.h"
#include <algorithm>
using namespace std ;
@@ -103,3 +107,70 @@ GetSurfBackColor( Color cCol)
0.4 * fLum + 0.6 * cCol.GetBlue(),
cCol.GetAlpha()) ;
}
//----------------------------------------------------------------------------
HSV
GetHSVFromColor( const Color& cCol)
{
double dMin = std::min( std::min( cCol.GetRed(), cCol.GetGreen()), cCol.GetBlue()) ;
double dMax = std::max( std::max( cCol.GetRed(), cCol.GetGreen()), cCol.GetBlue()) ;
double dDelta = dMax - dMin ;
if ( dDelta < EPS_ZERO)
return HSV( dMax, 0, 0) ;
if ( dMax < EPS_ZERO)
return HSV( 0, 0, 0) ;
HSV hsv ;
hsv.dVal = dMax ;
hsv.dSat = dDelta / dMax ;
if ( cCol.GetRed() >= dMax) // tra giallo e magenta
hsv.dHue = ( cCol.GetGreen() - cCol.GetBlue()) / dDelta ;
else if( cCol.GetGreen() >= dMax) // tra ciano e giallo
hsv.dHue = 2.0 + ( cCol.GetBlue() - cCol.GetRed()) / dDelta ;
else // tra magenta e ciano
hsv.dHue = 4.0 + ( cCol.GetRed() - cCol.GetGreen()) / dDelta ;
// trasformo in gradi
hsv.dHue *= 60.0 ;
// porto in 0-360 deg
if ( hsv.dHue < 0.0)
hsv.dHue += 360.0 ;
return hsv;
}
//----------------------------------------------------------------------------
Color
GetColorFromHSV( const HSV& hsv)
{
// porto i valori nei limiti
double dHue = AngleNearAngle( hsv.dHue, ANG_STRAIGHT) ;
double dSat = Clamp( hsv.dSat, 0., 1.) ;
double dVal = Clamp( hsv.dVal, 0., 1.) ;
// se saturazione nulla
if ( dSat < EPS_ZERO)
return Color( dVal, dVal, dVal) ;
// calcolo
double dFraz = dHue / 60. ;
int nInd = int( dFraz) ;
double dRem = dFraz - nInd ;
double dP = dVal * ( 1.0 - dSat) ;
double dQ = dVal * ( 1.0 - ( dSat * dRem)) ;
double dT = dVal * ( 1.0 - ( dSat * (1.0 - dRem))) ;
switch ( nInd) {
case 0 :
return Color( dVal, dT, dP) ;
case 1 :
return Color( dQ, dVal, dP) ;
case 2 :
return Color( dP, dVal, dT) ;
case 3 :
return Color( dP, dQ, dVal) ;
case 4 :
return Color( dT, dP, dVal) ;
default :
return Color( dVal, dP, dQ) ;
}
}