LoginSignup
0
1

値に応じて色を連続的に変化させたい・・・

Posted at

カラーを連続で変えたい

M5atomで温度計や電流計を作った際、値に応じてLEDの表示色を変えたいと思い、最初はレベル毎にカラーマップを作っていたのですが、連続で変えたいといった場合にどうするかを調べたところ、色相なら連続的に変えられると思い、変換プログラムを探してみました。

結果たどり着いたのがHSVからRGBへの変換プログラムです。valueの値に応じて、最大値と最小値の間を青→赤になるよう変化させるなら、以下のように色相を指定してあげるといい感じになると思います。

hsv2rgb.cpp
h = 1.-((value-min)/(max-min)/2.)-0.5;
if (h>0.5){h=0.5;}
if (h<0.) {h=0.;}

ちなみに、AtomS3で画面の色を作る際の16bitRGB版も作ってあるので、しばらくしたら一緒に載せておこうかと思います。

hsv2rgb.cpp
//================================================================================
// hsv2rgb HSV->RGB変換
//================================================================================
int hsv2rgb(float h,float s,float v){
  if (s>0){
      if (h == 1.0){h = 0.0;}
      int i = int(h*6.0);
      double f = h*6.0 - i;
      
      double w = v * (1.0 - s);
      double q = v * (1.0 - s * f);
      double t = v * (1.0 - s * (1.0 - f));
      
      h = int(h*255);
      s = int(s*255);
      v = int(v*255);
      w = int(w*255);
      q = int(q*255);
      t = int(t*255);
      
      if (i==0){ return((int)(v)*256*256+int(t/1)*256+(int)(w/1));}
      if (i==1){ return((int)(q)*256*256+int(v/1)*256+(int)(w/1));}
      if (i==2){ return((int)(w)*256*256+int(v/1)*256+(int)(t/1));}
      if (i==3){ return((int)(w)*256*256+int(q/1)*256+(int)(v/1));}
      if (i==4){ return((int)(t)*256*256+int(w/1)*256+(int)(v/1));}
      if (i==5){ return((int)(v)*256*256+int(w/1)*256+(int)(q/1));}
      return(0);
  }else{
    return((int)(v*2048/8+v*32/4+(int)(v/8)));
  }
}
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1