2010-06-09 6 views
1

j'ai cet algorithme ici:algorithme pour générer un gradient radial

pc = # the point you are coloring now 
p0 = # start point 
p1 = # end point 
v = p1 - p0 
d = Length(v) 
v = Normalize(v) # or Scale(v, 1/d) 

v0 = pc - p0 

t = Dot(v0, v) 
t = Clamp(t/d, 0, 1) 

color = (start_color * t) + (end_color * (1 - t)) 

pour générer un point à gradients linéaires. Cela fonctionne très bien pour moi. Je me demandais s'il y avait un algorithme similaire pour générer des gradients radiaux. Par similaire, je veux dire celui qui résout pour la couleur au point P plutôt que de résoudre pour P à une certaine couleur (où P est la coordonnée que vous peignez).

Merci

+0

Quelle est l'entrée du dégradé radial? Un point de départ et un rayon? – user168715

+0

Oui, le point final est effectivement le rayon – jmasterx

Répondre

1

Linerise sur atan2 (dy, dx) où dx est x-centre et dy est centre-y.

cx # center x 
cy # center y 

r1 # ring is defined by two radius 
r2 # r1 < r2 

c1 # start color 
c2 # stop color 

ang # start angle 

px # currect point x,y 
py 
if(px^2 + py^2 <= r2^2 AND px^2 + py^2 >= r1^2 ) # lies in ring? 
    t= atan2(py-cy,px-cx)+ang 
    t= t+ pi # atan2 is from -pi to pi 
    if (t > 2* pi) # it might over 2pi becuse of +ang 
     t=t-2*pi 
    t=t/(2*pi) # normalise t from 0 to 1 
    color = (c1 * t) + (c2 * (1 - t)) 

Whit Problème cette algorhitm est que ang est actuellement mal et devrait être mis en rotation par pi et normalisée entre 0 et 2 pi.

+0

Comment puis-je supprimer l'alias? – jmasterx

0

Basé sur le commentaire, ce que vous voulez peut encore être considéré comme un gradient linéaire - vous avez donc une ligne du centre vers l'extérieur du cercle, et vous avez un gradient linéaire le long de cette ligne. En tant que tel, le calcul est pratiquement identique à ce que vous avez déjà eu. Edit: D'accord, apparemment, j'ai mal compris ce que vous voulez. Pour représenter un dégradé tournant autour d'un rayon, vous le linéarisez toujours - calculez la circonférence à ce rayon (2 * Pi * R), puis effectuez une interpolation linéaire le long d'une ligne de cette longueur.

+0

Eh bien, je veux comme gradient radial de Photoshop – jmasterx

+0

C'est un peu comme un gradient linéaire circulaire – jmasterx

+1

"C'est un peu comme un gradient linéaire circulaire": merci, monsieur, vous venez de faire ma journée Achevée. :) – avakar

3
//loop through vector 
//x and y px position 
int x = i%w; 
int y = i/w; 
float d = distance(center,int2(x,y)); 
//if within the grad circle 
if(d < radius) 
{ 
    //somehow set v[i] alpha to this: 
    float a = d/r; 
} 
Questions connexes