HSV2RGB一种灯光渐变实现算法

我们在做RGB灯光控制时,经常需要实现一种光线柔和渐变的过程.简单的都是用RGB三原色变化,但这种效果差强人意.通过HSV颜色模型则可以实现非常好的渐变效果.这里贴出主要实现代码.

#include <math.h>
#define MAX(a, b) (a > b ? a : b)
#define MIN(a, b) (a < b ? a : b)
/*  HSV2RGB:
 *  Converts from HSV colorspace to RGB values.
 *  HSV2RGB(iHSV_H / 3.0, 1, 1, &r, &g, &b);
 */
void HSV2RGB(float h, float s, float v, int *r, int *g, int *b)
{
   float f, x, y, z;
   int i;
   v *= 255.0;
   if (s == 0.0) {
      *r = *g = *b = (int)v;
   } else {
      while (h < 0)
      h += 360;
      h = fmod(h, 360) / 60.0;
      i = (int)h;
      f = h - i;
      x = v * (1.0 - s);
      y = v * (1.0 - (s * f));
      z = v * (1.0 - (s * (1.0 - f)));
      switch (i) {
         case 0: *r = v; *g = z; *b = x; break;
         case 1: *r = y; *g = v; *b = x; break;
         case 2: *r = x; *g = v; *b = z; break;
         case 3: *r = x; *g = y; *b = v; break;
         case 4: *r = z; *g = x; *b = v; break;
         case 5: *r = v; *g = x; *b = y; break;
      }
   }
}

使用方法,要主循环中加下以下代码:

		if (g_iWRGBApply == 1) {    // 渐变模式开关,计算完后,在定时器中进行调光
			g_iWRGBApply = 0;
			g_iWRGBSeed++;          // 颜色种子,0~360之间循环
			if (g_iWRGBSeed >= 360)
				g_iWRGBSeed = 0;
			 HSV2RGB(g_iWRGBSeed, 1.0, 1.0, &g_iRed, &g_iGreen, &g_iBlue);	// HSV模型转成RGB三原色
		}

功能已在STM8的量产产品上实现,效果非常不错.

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值