2010-06-04 6 views
0

Je dois créer une logique de dégradé de 4 couleurs. Un des messages m'a donné le motif pour calculer le dégradé de 4 couleurs. Cependant, j'ai des difficultés à le mettre en œuvre.4 couleurs logique de dégradé nécessaire

Je suis en mesure de calculer la couleur du point E (milieu) mais je ne sais pas comment développer le gradient de celui-ci

mon code

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 aider comment Futher le code est apprécié.

+0

Qu'essayez-vous de faire? Interpoler la couleur à travers un rectangle? NewColori est-elle la couleur des coins? – user168715

+0

Oui, je veux créer un sqaure ou un rectangle avec 4 couleurs dans 4 coins. Le pixel d'école sur l'écran devrait montrer le mélange approprié de ces quatre couleurs. Je dois le faire en utilisant SetPixel ou copier en frambuffer en utilisant memcpy. Les nouvelles couleurs sont des couleurs dans les coins. – user358791

+1

Vous avez vraiment besoin de faire cela avec le LinearGradientBrush disponible dans ''. Inutile de réinventer cette roue. –

Répondre

3

Voici le code qui calcule la couleur en (x, y) étant donné les quatre couleurs de coin.

#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

Pouvez-vous dire quels en-têtes sont nécessaires pour que cela fonctionne? – user358791

+0

, (bien que celui-ci ne soit pas nécessaire, n'hésitez pas à commenter la ligne assert), et . – user168715

+0

Merci cela fonctionne. Les gars sur ce forum sont de vrais experts. Je luttais avec pour les 3 derniers jours. – user358791

Questions connexes