« タブレットのデザイン | トップページ | イラストレーターの領域を黄金比で埋める »

2014.02.25

背景を動的にグラデーションさせる。

ここ数日のコードを記事に。
グラデーションの生成はサイン波によりランダムに。
hsv-rgb変換は下記のサイトから。
RGBとHSVの相互変換

1ピクセルづつ描いているからやっぱり遅い。
OpenGLでやれば簡単なのだけどグラボが対応していないという眼も当てられない環境。
なんとかしてやる。

/*
wave_color_test
*/
////////////////////////////////////////////////////variable
int i,j,count,addR,addG,addB = 0;
int rgbA[];
int rgbB[];
int rgbC[];
int hsb[];
float centering,fA,fB,fC,lfoA,lfoB,lfoC,piCircle = 0;
color c;
////////////////////////////////////////////////////variable
////////////////////////////////////////////////////main
void setup(){
  size(450,600);
  smooth();
  colorMode(HSB,360,255,255);
  centering = height/2;
  piCircle = PI*2;
  fA = random(0.01,piCircle);
  fB = random(0.02,piCircle);
  fC = random(0.02,piCircle);
}
void draw(){
  background(360,0,255);
 
  lfoA = lfo(count,piCircle,fA,width);
  lfoB = lfo(count,piCircle,fB,width);
  lfoC = lfo(count,piCircle,fC,width);
 
  for(i=0; i<width; i++){
    for(j=0; j<height; j++){
      rgbA = hueTOrgb((int)degrees(abs(lfoA)),(int)lfo(i,255,fA,width),255);
      rgbB = hueTOrgb((int)degrees(abs(lfoB)),(int)lfo(j,255,fB,width),255);
      rgbC = hueTOrgb((int)degrees(abs(lfoC)),(int)lfo(width-i,255,fC,width),255);
 
      addR = (rgbA[0]+rgbB[0]+rgbC[0])/3;
      addG = (rgbA[1]+rgbB[1]+rgbC[1])/3;
      addB = (rgbA[2]+rgbB[2]+rgbC[2])/3;
 
      hsb = rgbTOhsb(addR,addG,addB);
      c = color(hsb[0],hsb[1],hsb[2]);
      set(i,j,c);
    }
  }
  count++;
}
////////////////////////////////////////////////////main
////////////////////////////////////////////////////funciton
float lfo(float count, float amplitude, float frequency, int distance){
  return amplitude*sin(count*frequency/distance);
}
int[] hueTOrgb(int h, int s, int v){
  float f;
  int ii,p,q,t;
  int[] rgb = new int [3];
  ii = (int)Math.floor(h/60.0)%6;
  f = (float)(h/60.0)-(float)Math.floor(h/60.0);
  p = (int)Math.round(v*(1.0 - (s/255.0)));
  q = (int)Math.round(v*(1.0 - (s/255.0)*f));
  t = (int)Math.round(v*(1.0 - (s/255.0)*(1.0-f)));
 
  switch(ii){
    case 0 : rgb[0] = v; rgb[1] = t; rgb[2] = p; break;
    case 1 : rgb[0] = q; rgb[1] = v; rgb[2] = p; break;
    case 2 : rgb[0] = p; rgb[1] = v; rgb[2] = t; break;
    case 3 : rgb[0] = p; rgb[1] = q; rgb[2] = v; break;
    case 4 : rgb[0] = t; rgb[1] = p; rgb[2] = v; break;
    case 5 : rgb[0] = v; rgb[1] = p; rgb[2] = q; break;
  }
  return rgb;
}
int[] rgbTOhsb(int red, int green, int blue){
  int[] hsv = new int [3];
  float max = Math.max(red, Math.max(green, blue));
  float min = Math.min(red, Math.min(green, blue));
 
  //h
  if(max == min){
    hsv[0] = 0;
  }else if(max == red){
    hsv[0] = (int)((60*(green - blue)/(max-min)+360)%360);
  }else if(max == green){
    hsv[0] = (int)((60*(blue - red)/(max-min))+120);
  }else if(max == blue){
    hsv[0] = (int)((60*(red - green)/(max-min))+240);
  }
  //s
  if(max == 0){
    hsv[1] = 0;
  }else{
    hsv[1] = (int)((255*((max-min)/max)));
  }
  //v
  hsv[2] = (int)(max);
  return hsv;
}
////////////////////////////////////////////////////funciton

|

« タブレットのデザイン | トップページ | イラストレーターの領域を黄金比で埋める »

processing」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/198455/59198650

この記事へのトラックバック一覧です: 背景を動的にグラデーションさせる。:

« タブレットのデザイン | トップページ | イラストレーターの領域を黄金比で埋める »