我有一个显示属于产品的订单的DataGrid。
我希望每个产品都有一个独特的生成SolidColorBrush。
更新
我需要这些颜色是坚实和独特的,或者至少要以独特的方式进行排序,即不应该有黑色,蓝色,绿色,因为这3种颜色可能会相互混淆。此外它应该是黑色,红色,蓝色等。
公式必须是:
Color.AreClose
,它可能很有用,我还是不知道如何实现它。答案 0 :(得分:2)
你可以创建一个基于某种种子返回颜色的函数。然后在xaml中绑定项目backcolor。种子可以是例如将采用R(RGB)并添加+10的普通字节。问题是你需要提供更多信息。就像akellehe询问颜色是否看起来不错一样,两个彼此接近的物品是否需要两种真正不同的颜色或类似的东西(例如RGB(128,128,128)和(128,128,129))。还有多少项目?
答案 1 :(得分:2)
根据色调,饱和度和值来考虑颜色可能会有所帮助。现在,您可以在Hue和Value中考虑不同的采样函数,例如,生成颜色。例如,您可以在Hue中递增,然后在不同的值处重复以获得相同颜色的较暗版本。您还可以在交替的Value位置偏移您的Hue,以获得额外的颜色变化。为了获得最佳效果,您可能希望在采样过程中交替使用“暖色”和“冷色”(有利于红色而不是青色)。
编辑:
有关Hue的技术概述,请参阅this article了解转化HSV< - > RGB。它们有点尴尬,因为HSV通常被解释为锥形,其色调被视为围绕法线轴的角度。它是这样构造的,因为一旦你达到V = 0,色调和饱和度都是未定义的(基本上,黑色是黑色;它没有色调;灰色(垂直轴)也没有色调)为了您的目的,您可以简单地使用方程式(参见“色调和色度”和“转换为RGB”部分)。
一旦你实现了HSV转换,纯色调的最简单的颜色采样就是从0到360 /(N-1)采用色调,其中N是样本数。您可以随意设置饱和度和值; S = 1和V = 1将为您提供最亮,最“丰富多彩”(饱和)的颜色。如果你有太多的点只是简单地在Hue中采样,你可以开始将它与值的变化(对于较暗的颜色)或饱和度(对于更多的去饱和,'灰色'颜色)进行组合。
答案 2 :(得分:1)
在W3C网站的工作草案中提出了粗略的color difference formula:
色差由 下列公式:(最大值(红色值) 1,红色值2) - 最小值(红色值 1,红色值2))+(最大值(绿色 值1,绿色值2) - 最小值 (绿色值1,绿色值2))+ (最大值(蓝色值1,蓝色值2) - 最小值(蓝色值1,蓝色值2))
ra [n] ge用于颜色亮度 差异是125.颜色范围 差异是500。
还有其他more complex ones,您可能需要获得最佳效果。
然后,您可以在算法中使用该函数,该算法将存储集合中的所有可能颜色,从该集合中选择一种颜色(比如黑色),并将其用作迭代排序的起点。
这既未经过优化也未经过测试,但可能有效:
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);
}
答案 3 :(得分:0)
最适合我:
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替换为所需的颜色数量。