zoukankan      html  css  js  c++  java
  • RBG灯颜色渐变(颜色要尽可能多)程序分析

    相信很多调过RBG灯的朋友都是通过分别改变R、B、G的占空比来改变颜色的,但是不是发现了一个问题,那就是不管怎样调都很难实现几十种颜色的变化,一般只有是7种颜色的渐变。下面给朋友们分享一个可以实现几十种颜色渐变(颜色确实比原来那方法多,能不能达到这么多应该跟有关)的方法,希望对大家有启示作用。

    首先要给大家简单地说一下HSL,就是色调,饱和度和亮度,也是一种色彩空间模式,类似于RBG,只不过用HSL表示色彩更加的符合人类的视角感观,而RBG则更多用于机械上。所以,我们要实现多颜色的渐变要做的是把RBG转成HSL,然后改变H(色调)分量(S和L不用变),这时就得到了新的HSL,再把这个新HSL转换成RBG,得到新的RBG后就是我们要PWM
    简单地说,RBG->HSL->改变H(例如+0.00001)->新HSL->RBG
    下面符上网上RBG->HSL和HSL->RBGR的代码,转载 于    http://blog.csdn.net/aniven/article/details/2205851
    RGB转换成HSL:
    #include
    using std::min;
    using std::max;

    void RGB2HSL(TColor AColor, double &H,double &S,double &L)
    {
        double R,G,B,Max,Min,del_R,del_G,del_B,del_Max;
        R = GetRValue(AColor) / 255.0;  //Where RGB values = 0 ÷ 255(得到R 的值)
        G = GetGValue(AColor) / 255.0;//得到G的值
        B = GetBValue(AColor) / 255.0;//得到B的值

        Min = min(R, min(G, B));    //Min. value of RGB
        Max = max(R, max(G, B));    //Max. value of RGB
        del_Max = Max - Min;        //Delta RGB value

        L = (Max + Min) / 2.0;

        if (del_Max == 0)           //This is a gray, no chroma...
        {
            //H = 2.0/3.0;          //Windows下S值为0时,H值始终为160(2/3*240)
            H = 0;                  //HSL results = 0 ÷ 1
            S = 0;
        }
        else                        //Chromatic data...
        {
            if (L < 0.5) S = del_Max / (Max + Min);
            else         S = del_Max / (2 - Max - Min);

            del_R = (((Max - R) / 6.0) + (del_Max / 2.0)) / del_Max;
            del_G = (((Max - G) / 6.0) + (del_Max / 2.0)) / del_Max;
            del_B = (((Max - B) / 6.0) + (del_Max / 2.0)) / del_Max;

            if      (R == Max) H = del_B - del_G;
            else if (G == Max) H = (1.0 / 3.0) + del_R - del_B;
            else if (B == Max) H = (2.0 / 3.0) + del_G - del_R;

            if (H < 0)  H += 1;
            if (H > 1)  H -= 1;
        }
    }

    HSL转换为RGB:
    double Hue2RGB(double v1, double v2, double vH)
    {
        if (vH < 0) vH += 1;
        if (vH > 1) vH -= 1;
        if (6.0 * vH < 1) return v1 + (v2 - v1) * 6.0 * vH;
        if (2.0 * vH < 1) return v2;
        if (3.0 * vH < 2) return v1 + (v2 - v1) * ((2.0 / 3.0) - vH) * 6.0;
        return (v1);
    }
     

    TColor HSL2RGB(double H,double S,double L)

    {
        double R,G,B;
        double var_1, var_2;
        if (S == 0)                       //HSL values = 0 ÷ 1
        {
            R = L * 255.0;                   //RGB results = 0 ÷ 255
            G = L * 255.0;
            B = L * 255.0;
        }
        else
        {
            if (L < 0.5) var_2 = L * (1 + S);
            else         var_2 = (L + S) - (S * L);

            var_1 = 2.0 * L - var_2;

            R = 255.0 * Hue2RGB(var_1, var_2, H + (1.0 / 3.0));
            G = 255.0 * Hue2RGB(var_1, var_2, H);
            B = 255.0 * Hue2RGB(var_1, var_2, H - (1.0 / 3.0));
        }
        return TColor(RGB(R,G,B));
    }
    //--------------------------------------------------------------------------
    接下来,大家要做的是把我上面说的方法,翻译成代码就可以了。
  • 相关阅读:
    积累-T
    HTML:文件标签(四)
    HTML:文件标签(三)
    HTML:文件标签(二)
    队列:最近的请求次数 (Leetcode 933 / Leetcode 232 / 剑指09 / Leetcode 225 / Leetcode 862 )
    HTML:文件标签(一)
    HTML: 介绍 & 规范
    java.sql.SQLException: Access denied for user 'root '@'localhost' (using password: YES)
    JDBC和XML- 学习笔记
    数据库: 商城案例
  • 原文地址:https://www.cnblogs.com/panlangen/p/7588415.html
Copyright © 2011-2022 走看看