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:
@@ -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) ;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user