1. C++ / Говнокод #8870

    +1003

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    unsigned int mapGray(double color/*0.0 --- 255.0*/)
    {
        int base = static_cast<unsigned char>(color);
        if(base>=255)
            return 0xFFFFFFFF;
        else if(base<0)
            return 0x000000;
        double frac = color-base;
        unsigned char r = 0;
        unsigned char g = 0;
        unsigned char b = 0;
        if(frac<1.0/14.0) {
        } else if(frac<3.0/14.0) {
            r=1;
        } else if(frac<5.0/14.0) {
            b=1;
        } else if(frac<7.0/14.0) {
            g=1;
        } else if(frac<9.0/14.0) {
            b=1;
            r=1;
        } else if(frac<11.0/14.0) {
            g=1;
            b=1;
        } else if(frac<13.0/14.0) {
            r=1;
            g=1;
        } else {
            r=1;
            g=1;
            b=1;
        }
        return (base+r)<<16 | (base+g)<<8 | (base+b) | 0xFF000000;
    }

    Чуть больше оттенков серого.

    Запостил: Xom94ok, 19 Декабря 2011

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

    • И что такого? Пустое выражение под первым ифом? Достаточно понятный код, оптимизировать можно при необходимости, сокращать не имеет смысла... Разве что 0x000000 вместо 0xFF000000 смущает, но это для отрицательных значений аргумента (формально вне входного диапазона)
      Ответить
    • int base = static_cast<unsigned char>(color);
      Как потом base может быть больше 255 или меньше 0.
      Если это необходимый хак, то такие мется в коде оюязательно сопровождаются комментарием, который раскрывает суть хака, чтоб не ломать голову полчаса, смотря на шаманство.
      Ответить
    • А я-то думал, это у меня самый кривой генератор изображений. Это, наверное, самый нелогичный и нерациональный код, который я видел за всё время.
      Ответить
      • Напиши лучше
        Ответить
        • Я и собираюсь. Буду делать на шейдерах. Только не пойму, какую задачу выполняет приведённый (говно)код?
          Ответить
          • Написано же: чуть больше оттенков серого.
            В монохромных рендерах в областях с медленным переходом цветов могут быть видны "ступеньки", на которых цвет меняется от, например, 0x101010 до 0x111111. Только между этими двумя цветами есть ещё цвета 0x101011, 0x101110, 0x111010, 0x101111 и так далее, использовав которые, можно сделать картинку более "плавной". Где-то я эту идею подглядел, а где - уже не помню.
            Ответить
            • может эквализацию просто сделать?
              Ответить
              • Можно ещё проще и даже лучше - добавить равномерный цветной шум амплитудой в один квант.
                Ответить
          • Ну как, сделал?
            Ответить
            • Сделал такую штуку:
              https://devoln.github.io/texgen/
              Раньше там можно было сохранять результат и делиться ссылкой, но сервис, который я использовал в качестве бекенда, перестал существовать.
              Сейчас пилю новую версию, которая будет убийцей Shader Toy.
              Ответить
              • Круто!
                Ответить
              • Когда планируется запилить? К 2028 успеешь?
                Ответить
                • Надеюсь к 2021 году успеть сделать рабочую версию. Но часть запланированного функционала, такую как комментарии, историю и слайдеры возможно добавлю позже. Но это всё конечно зависит от энтузиазма, который иногда внезапно переключается на что-то другое и рушит все планы.
                  Ответить
      • Нерациональный - да. Нелогичный - нет.
        Ответить
        • Почему не нелогичный? Где логика в этих строках:

          if(base>=255)
          return 0xFFFFFFFF;
          else if(base<0)
          return 0x000000;

          Число переводится в unsigned char, поэтому оно не может быть отрицательным или больше 255.

          Остальные строки вроде больше нерациональности касаются.
          Ответить
          • Забыл тип подправить, с кем не бывает?
            Ответить
            • К тому же в конечном итоге функция переписана под аргумент от 0.0 до 1.0
              Ответить
              • Не знаю, что там в конечном итоге, но я пишу о том, что ты запостил здесь.
                Ответить
    • показать все, что скрытоvanished
      Ответить

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