1. JavaScript / Говнокод #15613

    +156

    1. 1
    2. 2
    if (l > 0) l += (1 - l) * l;
    else if (l < 0) l *= 1 - (- l);

    Запостил: Itareo, 29 Марта 2014

    Комментарии (28) RSS

    • Но нафига?
      Ответить
      • Потому что l - Lightness, а удлинять не охота
        Ответить
    • > 1 - (- l)
      А почему не просто 1 + l?
      Ответить
      • "5"+3 = "53"
        "5" - (-3) = 2

        Где-то уже я об этом писал.
        Ответить
      • там именно "минут отрицательное значение l", не стал приводить, чтобы не путаться
        Ответить
        • А что эта формула делает?
          Ответить
          • трансформирует канал Lightness HSL цвета
            Ответить
            • Ну ок. Но как это преобразование отражается на цвете? У этой трансформации же есть какой-то прикладной смысл?

              P.S. И откуда минусы в HSL?
              Ответить
              • 0.7
                0--------------------0.35------------------0.7--------0.85-------1
                -1                   -0.5                   0         0.5        1


                Первая строка - оригинальное значение.
                Вторая строка - результат в зависимости от модификатора.
                Ответить
                • > модификатора
                  Хмм... а где тут модификатор? Я в коде вижу только l.

                  Все-таки интересно, в чем прикладной смысл этого преобразования?
                  Ответить
              • Только я затупил сильно и использовал модификатор вместо цвета, который нужно менять.

                Рабочий код выглядит так:
                if (l > 0) color[2] += (1 - color[2]) * l;
                else if (l < 0) color[2] *= 1 - (- l);


                Что уже не так круто)
                Ответить
                • Это типа brighten/darken? Меняем яркость картинки в зависимости от параметра?

                  > 0 - делаем ярче
                  < 0 - делаем темнее
                  Ответить
                • Все, разобрался. В общем это банальная линейная интерполяция. Между color[2] и 1.0 при l > 0 (что делает цвет ярче, при 0 ничего не меняется, при 1 - совсем белый) и между color[2] и 0.0 при l < 0 (что делает цвет темнее, при 0 ничег не меняется, при -1 совсем черный). Т.е. в понятном виде формула звучит как-то так:
                  if (l > 0)
                      color[2] = color[2] * (1 - l) + 1.0 * l;
                  else
                      color[2] = color[2] * (1 - (-l)) + 0.0 * (-l);
                  Ответить
                  • Да, но слова "интерполяция" я не знаю :(

                    Прикладной смысл такой.

                    Есть глобальный цвет, и в разных местах приложения используются оттенки этого цвета. Оттенки получаются путем преобразования глобального цвета.

                    А преобразование происходит путем увеличения или уменьшения каналов Saturation и Lightness с помощью модификатора.

                    Я не использую простое смещение на определенное количество в большую или в меньшую сторону, потому что разница в цветах приложения может быть до 50%, и получается ситуация, когда часть цветов уперлась в конец(>1) канала, а часть еще может меняется, и это очень не красиво.

                    Поэтому вместо смещения я использую модификатор, который увеличивает или уменьшает канал в процентах от возможного смещения от оригинала, и получается очень круто.

                    Спойлер: http://i.imgur.com/60ZesjC.png
                    Ответить
              • Который, кстати, тоже не до конца правильно работает.
                Ответить

    Добавить комментарий