首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# -排序颜色列表的更好方法

C# -排序颜色列表的更好方法
EN

Stack Overflow用户
提问于 2022-06-02 03:21:23
回答 1查看 262关注 0票数 1

所以在有人把这篇文章称为复制品之前,让我解释一下。我试图找到更优化的排序算法来组织一个基于十六进制值列表的颜色列表。我目前正在根据色调对颜色进行排序。这是很好的,但当有一堆颜色,它似乎产生分配的噪音。

目前,我正试图找到C#方法来排序一个巨大的随机十六进制值列表。我引用了这个堆栈过流问题,并使用了来自站点的一些知识,并创建了下面的代码。

代码语言:javascript
复制
RichTextBox1:

#ee82ee // Violet
#008000 // Green
#ffa500 // Orange
#0000ff // Blue
#ff0000 // Red
#ffff00 // Yellow
#4b0082 // Indigo
代码语言:javascript
复制
// Create a List from each color within the richtextbox
List<Color> tiledata = new List<Color> ();
foreach (string line in richTextBox1.Lines)
{
    // Get Each Line From Richtoxbox And Convert The Hex
    tiledata.Add(System.Drawing.ColorTranslator.FromHtml(line));
}

// Sort colors based on HUE
// https://stackoverflow.com/a/62203405/8667430
var hexColorsSorted = tiledata.OrderBy(color => color.GetHue()).ThenBy(o => o.R * 3 + o.G * 2 + o.B * 1);

// Expand Each Item Of The List
foreach (var color in hexColorsSorted)
{
    // Output the data
    Console.WriteLine(ColorConverterExtensions.ToHexString(color));
}

从上面看,这显然将按正确的彩虹顺序对颜色进行排序。然而,一旦你引入更多如此相似的颜色,事情就会从上面的图像变得非常混乱。目前的排序算法主要是基于色调的排序,然后是RGB排序。我还有别的办法或者更多的方法来清理这件事吗?我唯一的要求是允许它使用List<Tuple<Color>>,例如下面这样的例子。

代码语言:javascript
复制
.OrderBy(color => color.Item3.GetHue()).ThenBy(o => o.Item3.R * 3 + o.Item3.G * 2 + o.Item3.B * 1)

贝娄是一种排序算法,这种方法似乎试图遵循,但最终失败了。如果事情看起来类似于下面的步骤排序算法,那就太好了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-02 09:46:56

Upd:我做了一个调整,以匹配色调方向,更像这个例子。

我已经从您的示例中重新创建了样式,您只需要使用下面的比较器对数组进行排序:

代码语言:javascript
复制
class ColorRampComparer : IComparer<Color>
{
    public int Compare(Color a, Color b)
    {
        var c1 = Step(a);
        var c2 = Step(b);

        return ((IComparable)c1).CompareTo(c2);
    }

    private Tuple<int, int, int> Step(Color color, int repetitions = 8)
    {
        int lum = (int)Math.Sqrt(.241 * color.R + .691 * color.G + .068 * color.B);

        float hue = 1 - Rotate(color.GetHue(), 90) / 360;
        float lightness = color.GetBrightness();

        int h2 = (int)(hue * repetitions);
        int v2 = (int)(lightness * repetitions);

        // To achieve second style uncomment this condition
        //if ((h2 % 2) == 0)
        //    v2 = repetitions - v2;
        //else
        //    lum = repetitions - lum;

        return Tuple.Create(h2, lum, v2);
    }

    private float Rotate(float angle, float degrees)
    {
        angle = (angle + degrees) % 360;
        if (angle < 0) angle += 360;
        return angle;
    }
}

接下来的结果是:

如果您取消了Step函数中的片段注释,那么它将如下所示:

若要排序数组或可枚举,请使用Sort方法:

代码语言:javascript
复制
colors.Sort(new ColorRampComparer());
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72470296

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档