HSI 색상 공간에서 컬러 휠을 그려야합니다. 내가 얻을 수있는 색상환에는 시안 색, 노란색 및 마젠타 색이 매우 넓어서 잘못 보입니다. 내가 보았던 다른 모든 컬러 휠에는 가장 넓은 밴드를 가진 빨강, 초록, 파랑이 있습니다.왜 내 HSI 컬러 휠이 이상하게 보입니까?
이는 HSI 컬러 휠의 모양이 얼마나 있습니까? 또는 나의 수학은 틀린가? 나는 RGB에서 HSI의 모든 스 니펫을 찾아서 찾을 수 있었고, 책에서 방정식을 보았다. 방정식에는 많은 변형이 있지만 내 서클을 그릴 때 모두 동일한 결과로 이어집니다. 내가 다르게하고있는 유일한 것은 마지막에 채널을 고정하는 것입니다. 내 강도는 모든 곳에서 1.0이며, 색조는 픽셀의 각도 (조금 더 회전 됨)이며 채도는 중심까지의 거리의 크기입니다.
float r;
float g;
float b;
S = S > 1.0f ? 1.0f : S;
I = I > 1.0f ? 1.0f : I;
H = H > 1.0f ? H - 1.0 : H;
H = H * M_PI * 2.0;
H = fmod(H, M_PI * 2.0);
if(S==0.0f){
r = I;
g = I;
b = I;
} else{
if((H>=0.0) && (H<2.0*M_PI/3.0)){
b = (1.0f-S)/3.0f;
r = (1.0f + S*cosf(H)/cosf(M_PI/3.0-H))/3.0f;
g = 1.0f-r-b;
} else if((H>=2.0*M_PI/3.0) && (H<4.0*M_PI/3.0)){
H = H - 2.0f*M_PI/3.0f;
r = (1.0f-S)/3.0f;
g = (1.0f+S*cosf(H)/cosf(M_PI/3.0 - H))/3.0f;
b = 1.0f-r-g;
} else if ((H>=4.0*M_PI/3.0) && (H<2.0*M_PI)){
H= H-4.0f*M_PI/3.0f;
g = (1.0f-S)/3.0f;
b = (1.0f+S*cosf(H)/cosf(M_PI/3.0-H))/3.0f;
r = 1.0f-b-g;
}
}
if(r<0.0f)
r=0.0f;
if(g<0.0f)
g=0.0f;
if(b<0.0f)
b=0.0f;
float R = 3.0f*I*r;
float G = 3.0f*I*g;
float B = 3.0f*I*b;
if(R>1.0f)
R=1.0f;
if(G>1.0f)
G=1.0f;
if(B>1.0f)
B=1.0f;
강도를 줄였습니까? 나는 최대 강도로 원색이 최대가되고 1로 클리핑되는 것을 추측하고 있습니다. 따라서 혼합 색상이 휠을 지배합니다. – user3386109
@ user3386109는 I = 1 일 때 기본 색상이 씻겨 나가는 것에 대해 옳습니다. reddest 인 RGB 색상 (1,0,0) 만 I = 1/3에 매핑됩니다. 대신 HSV 또는 HSL을 사용할 수 있습니까? 이러한 색상 공간은보다 직관적 인 사용자 인터페이스를 만들 수 있습니다. – godel9
그건 그렇고, 나는 당신의 코드를 보면서 그것을 빨리 보지 못했다. 나는 가장 중요한 문제가 I = 1.0에 대한 모든 H 및 S 값이 유효한 (R, G, B) 세 쌍둥이로 매핑되지 않는다고 생각합니다. 나는 그것이 당신의 기능이 끝날 때 클리핑 코드가 나오는 이유라고 생각한다. – godel9