Исходник Пульсация цвета C++

Тема в разделе "C/C++", создана пользователем B3JlOM_}I{OTTbI, 25 сен 2018.

  1. B3JlOM_}I{OTTbI

    B3JlOM_}I{OTTbI проверенный какой-то

    Регистрация:
    16 мар 2017
    Сообщения:
    1.410
    Симпатии:
    606
    Добавляете в любое место в вашем коде

    
       static void Pulsate( float &clr , float min , float max , float pulsate_speed )
       {
           static bool state = false;
    
           if( !state )
           {
               if( clr < max )
                   clr += pulsate_speed;
               else
               {
                   clr = max; state = !state;
               };
           }
           else
           {
               if( clr > min )
                   clr -= pulsate_speed;
               else
               {
                   clr = min; state = !state;
               };
           };
       };
    
    и используете так:

     static float PlusateBlue = 255.0f;
            /*Color:: - это если пихаете в класс Color как и я */Pulsate( PlusateBlue/* переменная */, 100.f/*минимальное*/ , 255.f/*максимальное значение*/ , 1.f/*скорость*/ );
    Вот как это выглядит на примере ImGui (лок на фпс включен)

    p.s это самый простой метод пульсации, можно сделать лучше через HSB
     
    #1 B3JlOM_}I{OTTbI, 25 сен 2018
    Последнее редактирование: 25 сен 2018
    social enemy и IZDATXXX нравится это.
  2. zeel228

    zeel228 Участник

    Регистрация:
    20 июл 2018
    Сообщения:
    5
    Симпатии:
    0
    Что происходит в видео, кто объяснит?
     
  3. B3JlOM_}I{OTTbI

    B3JlOM_}I{OTTbI проверенный какой-то

    Регистрация:
    16 мар 2017
    Сообщения:
    1.410
    Симпатии:
    606
    :facepalm2::facepalm2::facepalm2::facepalm2:
    Пульсация цвета C++
    честно хз что там может происходить...
     
  4. Rinat_Namazov

    Rinat_Namazov ( ͡° ͜ʖ ͡°)
    Всефорумный модератор

    Регистрация:
    9 авг 2015
    Сообщения:
    1.134
    Симпатии:
    576
    Добавишь в конец файла, и использовать функцию выше нельзя будет, не объявив.
     
    imring нравится это.
  5. Oreshka23

    Oreshka23 Знающий

    Регистрация:
    10 май 2015
    Сообщения:
    221
    Симпатии:
    66
    С третьего раза понял, что облачко становится то фиолетовым, то синим
     
  6. B3JlOM_}I{OTTbI

    B3JlOM_}I{OTTbI проверенный какой-то

    Регистрация:
    16 мар 2017
    Сообщения:
    1.410
    Симпатии:
    606
    не фиолетовым а черным, я не указывал ни зеленый ни красный цвет, ток синий
     
  7. iAmerican

    Друг

    Регистрация:
    17 фев 2014
    Сообщения:
    574
    Симпатии:
    237
    Более точно будет сказать переливание цвета, пульсация эт другое.
     
  8. dеropleat

    dеropleat Постоянный участник

    Регистрация:
    8 мар 2017
    Сообщения:
    94
    Симпатии:
    41
    Я все понимаю что тебя это не волнует, но извини, это полнейший бред, а не код.
    Тебе достаточно допустим:
    bool mState = false;
    mState ? (mColor += fSpeed) : (mColor -= fSpeed);
    if(mColor == cMax || mColor == cMin) mState = !mState;
     
    imring нравится это.
  9. LUCHARE

    LUCHARE BH Team
    Друг

    Регистрация:
    23 май 2017
    Сообщения:
    532
    Симпатии:
    619
    в том высказывании ошибка в другом месте
     
  10. Losyash1337

    Losyash1337 Участник

    Регистрация:
    3 янв 2017
    Сообщения:
    18
    Симпатии:
    10
    А потом жалуются люди, что у них не работает ничего :)
    У float всегда погрешность будет в этом случае (и почти во всех остальных), если не можете осознать этот факт, то прошу уйти читать IEEE 754 (перевод). Кстати, реализация не самая длинная, как может показаться, вот, например, другая, более универсальная (и прожорливая):
    #include <vector>
    #include <Windows.h>
    #include <cassert>
    
    // ...
    
    struct ColorState {
        uint8_t r, g, b;
        double duration;
    
        ColorState() { }
        ColorState(uint8_t r, uint8_t g, uint8_t b, double duration)
            : r(r), g(g), b(b), duration(duration) {
            assert(duration > 0.0);
        }
    };
    
    
    class ColorController {
    public:
        ColorController(const std::vector<ColorState>& data) :
            m_data(data), m_state(0U), m_time(0.0), m_cycle(0.0) {
    
            for(const auto& x : m_data)
                m_cycle += x.duration;
        }
    
        void update(double delta) {
            m_time += delta;
    
    #define _CC_NEXT_STATE(x) (((x)+1U)%m_data.size())
    
            while(m_time >= m_data[m_state].duration) {
                m_time -= m_data[m_state].duration;
                m_state = _CC_NEXT_STATE(m_state);
            }
    
            const auto& cur = m_data[m_state];
            const auto& nxt = m_data[_CC_NEXT_STATE(m_state)];
            const double t1 = m_time, t2 = cur.duration-m_time;
    
    #undef _CC_NEXT_STATE
    
            m_r = static_cast<uint8_t>((t2*cur.r + t1*nxt.r) / cur.duration);
            m_g = static_cast<uint8_t>((t2*cur.g + t1*nxt.g) / cur.duration);
            m_b = static_cast<uint8_t>((t2*cur.b + t1*nxt.b) / cur.duration);
        }
    
        uint8_t get_r() const { return m_r; }
        uint8_t get_g() const { return m_g; }
        uint8_t get_b() const { return m_b; }
    
        COLORREF get_color() const {
            return RGB(m_r, m_g, m_b);
        }
    
    private:
        size_t m_state;
        double m_time, m_cycle;
        uint8_t m_r, m_g, m_b;
        std::vector<ColorState> m_data;
    };
    использование:
    // инициализация в отдельной функции (чтобы не засорять код в месте использования)
    ColorController create_my_cc() {
        std::vector<ColorState> data(6);
        data[0] = ColorState(255, 0, 0, 0.5);
        data[1] = ColorState(0, 0, 0, 0.3);
        data[2] = ColorState(0, 255, 0, 0.5);
        data[3] = ColorState(0, 0, 0, 0.3);
        data[4] = ColorState(0, 0, 255, 0.5);
        data[5] = ColorState(0, 0, 0, 0.3);
        return ColorController(data);
    }
    
    // инициализация на месте (производится один раз!)
    auto my_cc = create_my_cc();
    
    // использование
    my_cc.update(dt);
    COLORREF color = my_cc.get_color()
     
    social enemy и iAmerican нравится это.
  11. dеropleat

    dеropleat Постоянный участник

    Регистрация:
    8 мар 2017
    Сообщения:
    94
    Симпатии:
    41
    Дружочек, вопрос к тебе такой: почему ничего не работает? Где ты в моем коде нашел неработоспособный код? Прежде чем такие предъявы кидать, ты придерись к чему-нибудь, а не кидайся чем попало.
     
  12. B3JlOM_}I{OTTbI

    B3JlOM_}I{OTTbI проверенный какой-то

    Регистрация:
    16 мар 2017
    Сообщения:
    1.410
    Симпатии:
    606
    Кстати да, он прав, у тебя ничего не работает
     
  13. dеropleat

    dеropleat Постоянный участник

    Регистрация:
    8 мар 2017
    Сообщения:
    94
    Симпатии:
    41
    Возможно потому что вы кидаете эти строчки все в 1 функцию? Подразумевалось то, что bool mState - вне функции переменная. Естественно, если вы засунули в одну функцию, то у вас всегда будет выполняться mColor -= fSpeed.
     
  14. Losyash1337

    Losyash1337 Участник

    Регистрация:
    3 янв 2017
    Сообщения:
    18
    Симпатии:
    10
    Хорошо, теперь я вижу, что кое-кто не знает, что такое мат. часть. Объясняю, еще раз точные сравнения double, float, да хоть __float128 противопоказаны, т.к. при работе, с числами, которые нельзя представить точно в виде двоичной дроби (например 0.7, 2.19, 1e-5, M_PI и т.п.) ты сталкиваешься с такой вещью, как погрешность, которая мешает тебе сказать, что 0.3+0.6==0.9 (можешь проверить, результат неожиданный, правда?). Вывод такой: слушай оппонента, и не ссылайся на глупость окружающих, неординарный ты мой. А код можно было сделать примерно таким:
    static bool mState = false;
    mState ? (mColor += fSpeed) : (mColor -= fSpeed);
    if(mColor >= cMax) mState = false, mColor = cMax;
    if(mColor <= cMin) mState = true,  mColor = cMin;
    P.S.: именно это и написал автор топика.