Member 11841791 Ответов: 1

Как смешать / смешать два цвета, как настоящая краска?


Эй Codeproject,

Мне интересно, как вы смешиваете два цвета, как вы бы с краской в реальной жизни. Например, смешивание красного и синего приведет к фиолетовому. Мне это интересно, потому что я также хотел бы, чтобы непрозрачность цвета играла в качестве компонента (это означает, что если Альфа равна 255, то она будет смешиваться сильнее, чем если бы этого не было.)

Уточнить, [Это место] картина того, что я хочу быть в состоянии сделать.

public Color PaintBlendColors(Color One, Color Two)
{
   Color Col;
   /*Col = Blend?*/
   return Col;
}


с уважением,
- ЭДЗ

Что я уже пробовал:

До сих пор я пытался использовать функцию предварительной сборки в Monogame/XNA под названием Color.Лерп, но это не дает желаемого эффекта.

1 Ответов

Рейтинг:
1

Patrice T

Вы можете попробовать вычислить среднее значение 2 цветов

Col.Red= (One.Red+ Two.Red)/ 2;
...


Member 11841791

Сочетание красного и желтого, чтобы получить оранжевый, не работает таким образом. :/

0x01AA

Нет, извините, это не имеет абсолютно никакого отношения к моделированию цветового смешения красок. Сравните смешивание красок Субтрактивный цвет - Википедия, свободная энциклопедия[^] и смешивание цветов RGB, например, для экрана Аддитивный цвет - Википедия, свободная энциклопедия[^].
Ответ заслуживает 1, я не голосую...

Member 11841791

Ого, средства смешивания, кажется, имеют причудливые названия. Спасибо за разъяснение!

Member 11841791

Также это то, что .Функция Lerp делает это. Он в основном перемещает один цвет в другой цвет с заданным значением. (0.5 f) в вашем примере.

0x01AA

Я не стал подавать пример :-)

Member 11841791

Нет, ха-ха, я имел в виду парня, который написал ответ.

Member 11841791

О, круто, я наконец-то нашел что-то на странице 5000 в Google. http://stackoverflow.com/questions/1351442/is-there-an-algorithm-for-color-mixing-that-works-like-mixing-real-colors

NewColor.Р = (Цвет1.Р * Цв2.Р)/255
Новый цвет.Г = (Цвет1.Г * Цв2.Г)/255
Новый цвет.Б = (Цвет1.Б * Цв2.Б)/255

Я попробую и посмотрю, что можно придумать.

Моя нынешняя функция.

public static Color MixColorsSubtractive(цвет A, цвет B)
{
возврат новый цвет(А. Р * Б. Р / 255, А. Г * Б. Г / 255, А. Б * Б. Б / 255, (1-ый этаж / (255 * 255)) * - А. А * Б.);
}

0x01AA

Что касается ссылки Stackoverflow: я не читал ее внимательно,поэтому не могу судить. Но с этим (цитата):
"Правильный ответ-нет, потому что нет правильной рабочей модели того, как "смешение цветов в реальном мире" действительно работает. Она слишком сложна и условна и совсем не похожа на простые красно-сине-желтые вещи, которые мы изучали в школе (на самом деле для ее решения требуется вся химия и много физики и биологии)."
Я не согласен, по крайней мере, в данный момент.

Я подумаю над вашим вопросом и постараюсь ответить, но для этого нужно некоторое время ;)

Н.б.: я не совсем понимаю, в чем вы видите проблему с Альфа-смесью... есть еще какая-нибудь информация с вашей стороны?

Member 11841791

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

И я с вами согласен. Это не так уж сложно, и, как всегда говорил один отличный парень, математика есть во всем. Мысль Альфа на самом деле не является термином краски, потому что Альфа в реальном мире была бы светом - что не является субтрактивным смешиванием.

Я также закончил исправлять все существующие ошибки в моем приложении, и тогда я узнаю, насколько хорошо оно работает.

Member 11841791

Ладно, я только сейчас поняла, что имела в виду под Альфой. (Извините, когда я программирую свой английский или языковые навыки в целом просто падают до 20%.) Альфа, о которой я упоминал ранее, должна была быть, когда дело доходит до водной краски, но сейчас я был бы счастлив просто иметь обычную краску.

В коде, который я вам дал, есть проблема, и проблема в том, что когда дело доходит до полных цветов, например: (255, 0, 0) (красный) и (0, 0, 255) (синий), он должен быть фиолетовым.

Однако, поскольку эти значения равны 0, когда он делает Red. R * Blue.R он вернет 0, а значит, и черный. Я думаю, что есть уродливый способ исправить это, сделав минимум 1, в любом случае это не работает должным образом.

Patrice T

Я думаю, что это может быть решением