Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Алгоритмы > двухмерное цветового поле |
Автор: _Y_ 12.8.2012, 18:55 |
Имеем прямоугольное поле. Четыре угла соответствуют четырем цветам. Переход цветов плавный. Как посчитать цвета промежуточных пикселей? Вот, вроде, такая схема http://forum.vingrad.ru/index.php?showtopic=149140&view=findpost&p=1119106. Но я, что-то не нашел как в CMYK смешать четыре цвета. Спасибо. |
Автор: Pavia 13.8.2012, 05:33 |
Можно делать по разному. Как билинейную интерполяцию. http://en.wikipedia.org/wiki/Bilinear_interpolation Или обратную средне взвешенное расстояние. http://en.wikipedia.org/wiki/Inverse_distance_weighting У билинейной есть тонкости. |
Автор: Pavia 13.8.2012, 07:48 |
CMYK используется для моделирования смешивания цветов красок. А RGB для смешивания цветов как на мониторе. |
Автор: ksnk 13.8.2012, 09:33 |
_Y_, Вероятно, лучше пользоваться HSL - три независимых числовых параметра вместо 4-х, кроме того, что именно HSL обычно используется при манипуляциях с цветом. Вот одно из решений, для того, чтобы понять его принцип - для каждой части "цвета" (для определенности возьмем H) строится 4 точки пространства, соответствующие координатам X,Y,H. Вообразим себе китайскую циновку - комплект тонких палочек, провязанных друг с другом, и "приложим" край циновки к одной паре точек, а другой - к противоположной и сильно его растянем, без провисаний. Циновка, вероятно, перекрутится и , местами, растянется ![]() Как вычислить значение H на одной из планок циновки? Достаточно вычислить значения H на концах и изменить, пропорционльно расстоянию от конца "планки". Как вычислить значения H на концах планок? Все концы планок располагаются на одной прямой и значения H изменяется равномерно. Значения Р в углах - известны. Выводить точные формулы мне не очень интересно ![]() |
Автор: _Y_ 13.8.2012, 21:47 |
Папа, а с кем это ты разговариваешь? ЗЫ: Спасибо. Есть с чего начать думать ![]() |
Автор: Earnest 14.8.2012, 09:28 |
Ну, возможно, имелось в виду, что RGB пространство нелинейное и расстояние между цветами там считать некорректно (соответственно, и перетекание). Т.е. некорректно с точки зрения перцепции, а если это не важно, то пофиг. А если важно, то лучше тогда использовать LAB или производные - там расстояние линейно почти. А интерполировать цвета, согласна, проще всего билинейной интерполяцией. Или проективным преобразованием. |
Автор: baldina 14.8.2012, 10:12 |
это еще почему? при расчете яркости компоненты складываются с разными коэффициентами, но зависимость остается линейной |
Автор: Pavia 14.8.2012, 18:19 |
Пространство RGB изначально было линейным и таким и остаётся. |
Автор: _Y_ 15.8.2012, 23:31 | ||
Подумал я над вашими ответами. Получилось, что от многой мудрости много печали. Взял и сделал вот так - линейнее некуда: Разобрал угловые цвета на RGB компоненты. Потом для каждого объекта (в идеале - пикселя) линейно смешивал каждую компоненту по такой схеме
![]() Как видите, выглядит достойно. Что мне еще нужно? Спасибо, что подсказали - навели на мысли. ЗЫ: Все это сделано вот этим грязноватым Java кодом. Если запустите, нажимайте на угловые кнопки - откроются диалоги выбора цвета.
|
Автор: Earnest 16.8.2012, 09:00 |
Я же написала, относительно восприятия человеческого. Т.е. одинаковая разность цветов в разных углах пространства воспринимается по-разному. А формула "субъективной" цветовой разницы многоэтажная. А вот пространства типа LAB специально строились для обеспечения большей равномерности цветовой разницы. |
Автор: maxim1000 16.8.2012, 10:15 | ||
что и является билинейной интерполяцией... |
Автор: _Y_ 17.8.2012, 19:27 |
Спасибо. Очень люблю умные названия. К сожалению, сам я их почти сразу забываю ![]() |
Автор: maxim1000 18.8.2012, 08:27 | ||
да просто её посоветовали в первом же ответе, можно было бы время сэкономить |
Автор: _Y_ 18.8.2012, 09:56 |
Спасибо. Но этот проект не критичный по времени у меня. Что-то среднее между хобби и самообразованием. |