2010-06-04 2 views
0

4 색 그라디언트 로직을 만들어야합니다. 게시물 중 하나가 나에게 4 색 그라디언트를 계산하는 패턴을주었습니다. 그러나 나는 그것을 구현하는 데 어려움을 겪고있다. 나는 점 E의 색상 (하나의 중간)을 계산 할 수 있어요4 색 그라데이션 로직이 필요합니다

그러나 나는

MY 코드

COLORREF NewColor = RGB(255,0,0); 
COLORREF NewColor2 = RGB(0,255,0); 
COLORREF NewColor3 = RGB(0,0,255); 
COLORREF NewColor4 = RGB(255,255,0); 
red_low = GetRValue(NewColor); 
blue_low = GetBValue(NewColor); 
green_low = GetGValue(NewColor); 
red_high = GetRValue(NewColor2); 
green_high= GetGValue(NewColor2); 
blue_high = GetBValue(NewColor2); 

red_low2 = GetRValue(NewColor3); 
blue_low2 = GetBValue(NewColor3); // divide the difference in colours by the number of steps 
green_low2 = GetGValue(NewColor3); 
red_high2 = GetRValue(NewColor4); 
green_high2 = GetGValue(NewColor4); // divide the difference in colours by the number of steps 
blue_high2 = GetBValue(NewColor4);   
double distance_a = sqrt((double)((0-W)^2+(0-H/2)^2)); 
    double distance_b = sqrt((double)((350-W/2)^2+(0-H/2)^2)); 
    double distance_c = sqrt((double)((350-W/2)^2+(100-H/2)^2)); 
    double distance_d = sqrt((double)((0-W/2)^2+(100-H/2)^2)); 
    double sum_distances = distance_a + distance_b + distance_c + distance_d; 
    double red = (red_low*distance_a + red_high*distance_b + red_low2*distance_c+ red_high2*distance_d)/sum_distances; 
    double green = (green_low*distance_a + green_high*distance_b + green_low2*distance_c+ green_high2*distance_d)/sum_distances; 
    double blue = (blue_low*distance_a + blue_high*distance_b + blue_low2*distance_c+ blue_high2*distance_d)/sum_distances; 
COLORREF Color_E= RGB(red,green,blue);  

ANE 코드를 학습과 방법에 도움이 그것이에서 그라데이션을 개발하는 방법을 모른다 고맙습니다.

+0

무엇을하려하십니까? 직사각형에 색상을 보간 하시겠습니까? NewColori가 모서리의 색상입니까? – user168715

+0

네, 네 모서리에 4 가지 색상으로 된 사각형 또는 사각형을 만들고 싶습니다. 화면의 각 픽셀에이 네 가지 색상이 적절히 혼합되어 있어야합니다. 필자는 SetPixel을 사용하거나 memcpy를 사용하여 frambuffer로 복사해야합니다. 새로운 색상은 모퉁이의 색상입니다. – user358791

+1

당신은' '에서 사용할 수있는 LinearGradientBrush를 사용하여 정말로 이것을 할 필요가 있습니다. 바퀴를 다시 발명 할 필요가 없습니다. –

답변

3

다음은 네 모서리 색상이 지정된 (x, y)에서 색상을 계산하는 코드입니다.

#include <vector> 
#include <cassert> 
#include <windows.h> 

using namespace std; 

int interpolate(int a, int b, int c, int d, double t, double s) 
{ 
    return (int)(a*(1-t)*(1-s) + b*t*(1-s) + c*(1-t)*s + d*t*s); 
} 

COLORREF interpolateColors(const vector<COLORREF> &cornercolors, int W, int H, int x, int y) 
{ 
    assert(cornercolors.size() == 4); 
    double t = ((double)x)/W; 
    double s = ((double)y)/H; 
    return RGB(interpolate(GetRValue(cornercolors[0]), GetRValue(cornercolors[1]), GetRValue(cornercolors[2]), GetRValue(cornercolors[3]), t, s), 
       interpolate(GetGValue(cornercolors[0]), GetGValue(cornercolors[1]), GetGValue(cornercolors[2]), GetGValue(cornercolors[3]), t, s), 
       interpolate(GetBValue(cornercolors[0]), GetBValue(cornercolors[1]), GetBValue(cornercolors[2]), GetBValue(cornercolors[3]), t, s)); 
} 
+0

작동하려면 어떤 헤더가 필요한지 알 수 있습니까? – user358791

+0

, (이 것은 필수는 아니지만 어설 션 행을 주석 처리 할 수 ​​있음) 및 입니다. – user168715

+0

고마워요. 이 포럼에 참석하신 분들은 진정한 전문가입니다. 나는 지난 3 일 동안 그것에 고심하고 있었다. – user358791

관련 문제