Создать определенный цвет для каждой строки? - PullRequest
2 голосов
/ 31 августа 2010

У меня есть DataGrid, который показывает заказы, которые принадлежат продукту.

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

Обновление

Мне нужно, чтобы эти цвета были сплошными и отличительными, или, по крайней мере, чтобы они были упорядочены, то есть не должно быть черного, синего и зеленого, так как эти 3 цвета можно спутать друг с другом. Кроме того, он должен быть черным, красным, синим и т. Д.

Формула должна быть:

  1. Сгруппировать все цвета в подгруппы основных цветов
  2. Закажите их по темноте
  3. Закажите снова способ чередования пинг-понга (темный свет, темный свет и т. Д.) С проницательной группой.
  4. Я только что заметил, что есть классная функция: Color.AreClose, это может быть полезно, я до сих пор не знаю, как это реализовать.
  5. Уверен, у вас есть еще идеи.

Похожие: Есть ли в списке .NET только 256 цветов?

Ответы [ 4 ]

2 голосов
/ 31 августа 2010

Может быть полезно рассмотреть цвета с точки зрения оттенка, насыщенности и значения. Теперь вы можете рассмотреть различные функции выборки в Hue и Value, например, для генерации ваших цветов. Например, вы можете увеличить Hue, а затем повторить с другим значением, чтобы получить более темные версии тех же цветов. Вы также можете сместить ваш оттенок в чередующихся местах значений, чтобы получить дополнительную изменчивость цвета. Для достижения наилучших результатов вы, возможно, захотите чередовать «теплые» и «холодные» цвета (предпочитайте красный вместо голубого) во время выборки.


EDIT:

Технический обзор Hue см. В этой статье для преобразований HSV <-> RGB. Они немного неловкие, так как HSV обычно интерпретируется как конус, а оттенок принимается за угол вокруг нормальной оси. Он построен таким образом, потому что, как только вы достигнете V = 0, цветовой тон и насыщенность будут неопределенными (в основном черный - это черный; у него нет оттенков; у серых цветов (вертикальная ось) также нет оттенка) уравнения (см. разделы «Оттенок и цветность» и «Преобразование в RGB»).

Как только вы осуществите преобразования HSV, простейшая цветовая выборка, которая варьируется чисто по оттенку, это просто взять оттенок от 0 до 360 / (N-1), где N - количество выборок. Вы можете установить насыщенность и значение, как вам нравится; S = 1 и V = 1 дадут вам самые яркие, самые «красочные» (насыщенные) цвета. Если у вас слишком много точек для простой выборки в оттенке, вы можете начать комбинировать это с изменениями значения (для более темных цветов) или насыщенности (для более ненасыщенных, «сероватых» цветов).

2 голосов
/ 31 августа 2010

Ну, вы можете создать функцию, которая будет возвращать цвет на основе какого-то семени. Затем просто свяжите элемент backcolor в xaml. Начальное число может быть, например, обычным байтом, который возьмет R (RGB) и добавит +10. Дело в том, что вам нужно дать больше информации. Как Акеллехе спросил, должны ли цвета выглядеть красиво, для двух близких друг другу нужны два действительно разных цвета или что-то подобное (например, RGB (128,128,128) и (128,128,129)). Также, сколько предметов может быть?

1 голос
/ 01 сентября 2010

Существует грубая формула разницы в цвете , предложенная в рабочем проекте на сайте W3C:

Разница в цвете определяется по следующей формуле: (максимум (значение красного 1,Значение красного 2) - минимум (значение красного 1, значение красного 2)) + (максимум (значение зеленого 1, значение зеленого 2) - минимум (значение зеленого 1, значение зеленого 2)) + (максимум (значение синего 1, значение синего)2) - минимум (значение синего 1, значение синего 2))

Значение ra [n] ge для разности яркости цвета равно 125. Диапазон разности цвета составляет 500.

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

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

Это не оптимизировано и не протестировано, но может работать:

static List<Color> SortColors(IEnumerable<Color> colors)
{
    var hashed = new HashSet<Color>(colors);
    var sorted = new List<Color>(hashed.Count);

    //Start with black
    var last = hashed.Single(x => x.Red == 0 && x.Green == 0 && x.Blue == 0);
    hashed.Remove(last);
    sorted.Add(last);

    while (hashed.Any())
    {
        //This could of course be optimized by doing these two steps in a single loop
        var bestDiff = hashed
            .Max(x => Difference(x, last));
        var best = hashed.First(x => Difference(x, last) == bestDiff);

        hashed.Remove(best);
        sorted.Add(best);
        last = best;
    }

    return sorted;
}

static int Difference(Color a, Color b)
{
    return Math.Abs(a.Red - b.Red)
        + Math.Abs(a.Green - b.Green)
        + Math.Abs(a.Blue - b.Blue);
}
0 голосов
/ 31 августа 2010

Лучше всего работает для меня:

Private Shared ReadOnly rndm As New Random
Public Shared ReadOnly m_ColorsList As IEnumerable(Of Color) =
  Enumerable.Range(0, 100).Select(
    Function(i) Color.FromRgb(rndm.Next(256), rndm.Next(256), rndm.Next(256)))

Замените число 100 желаемым количеством цветов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...