Как смешать два цвета RGB?

У меня есть приложение C#, в котором есть несколько местоположений, и каждое расположение имеет несколько узлов. Я пингую каждую локацию, и если она отвечает, то это ЗЕЛЕНЫЙ, оттенок ЗЕЛЕНОГО зависит от времени ответа; чем короче ответ, тем зеленее цвет.

Если ответ на пинг не получен, цвет будет КРАСНЫЙ.

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

Как я мог это сделать?

Элемент управления представляет собой TreeView.

Как насчет среднего значения RGB?

wohlstad 17.05.2024 13:47

Вы можете просто взять среднее значение каждого из значений R, G и B. Я не уверен, что было бы здорово, если бы одни были красными, а другие зелеными.

Palle Due 17.05.2024 13:47

@PalleDue, на самом деле вопрос не в том, что хорошо, а в том, чтобы привлечь внимание операторов к тому факту, что он не зеленый, и, следовательно, расширить локацию для исследования.

SPlatten 17.05.2024 13:51

Обычно при смешивании цветов удобнее работать с HSV, а не с RGB. Усреднение красного и зеленого проведет вас через желтый, что может быть полезной функцией. Возьмите редактор цветов, в котором есть ползунки для H, S и V, и поиграйте. Возможно, вы сможете придумать цвета, при которых вы сохраните S и V одинаковыми и просто перемещаете H, и все цвета, которые вы получаете при перемещении H, будут красивыми и разумными - это будет легко реализовать в коде.

canton7 17.05.2024 13:52

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

JonasH 17.05.2024 14:11

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

SPlatten 18.05.2024 16:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку у вас здесь нет ответа, вот как я это делаю в JavaScript.

Надеюсь, вам не составит большого труда перейти на C#.

// Accepts two hex colors and returns a blended RGB color.

function BlendColors(C1,C2){

var R1=parseInt(C1.substring(1,3),16), G1=parseInt(C1.substring(3,5),16), B1=parseInt(C1.substring(5,7),16);

var R2=parseInt(C2.substring(1,3),16), G2=parseInt(C2.substring(3,5),16), B2=parseInt(C2.substring(5,7),16);

return 'rgb('+Math.round((R1+R2)/2)+','+Math.round((G1+G2)/2)+','+Math.round((B1+B2)/2)+')';}

Примечание: Альфа-каналы не учитываются.

Теоретически все, что вам нужно сделать, это усреднить три отдельных компонента R/G/B.

Обновлять:

Ну что вы знаете... хороший сайт выполняет языковые преобразования!

using System;

public static string BlendColors(string C1, string C2)
{
    int R1 = Convert.ToInt32(C1.Substring(1, 2), 16);
    int G1 = Convert.ToInt32(C1.Substring(3, 2), 16);
    int B1 = Convert.ToInt32(C1.Substring(5, 2), 16);

    int R2 = Convert.ToInt32(C2.Substring(1, 2), 16);
    int G2 = Convert.ToInt32(C2.Substring(3, 2), 16);
    int B2 = Convert.ToInt32(C2.Substring(5, 2), 16);

    return $"rgb({Math.Round((R1 + R2) / 2.0)},{Math.Round((G1 + G2) / 2.0)},{Math.Round((B1 + B2) / 2.0)})";
}

Другие вопросы по теме