簡體   English   中英

C# - 對 colors 列表進行排序的更好方法

[英]C# - Better ways to sort a list of colors

所以在有人稱這篇文章重復之前,讓我解釋一下。 我試圖找到更優化的排序算法,以根據十六進制值列表組織 colors 列表。 我目前正在根據色調對 colors 進行排序。 這很好,但是當有一堆 colors 時,它似乎會產生一些噪音。

在此處輸入圖像描述

我目前正在嘗試找到 C# 種方法來對隨機十六進制值的巨大列表進行排序。 我參考了這個stackoverflow問題並使用了站點的一些知識並在下面創建了我的代碼。

RichTextBox1:

#ee82ee // Violet
#008000 // Green
#ffa500 // Orange
#0000ff // Blue
#ff0000 // Red
#ffff00 // Yellow
#4b0082 // Indigo
// 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));
}

從上面看,這顯然會按照正確的彩虹順序對 colors 進行排序。 然而,一旦你引入了更多如此相似的 colors,從上圖來看,事情開始變得非常混亂。 目前的排序算法只是先按HUE排序,再按RGB排序。 有沒有其他方法或更多我可以做的來清理一下? 我唯一的要求是允許它與List<Tuple<Color>>一起使用,例如下面的示例。

.OrderBy(color => color.Item3.GetHue()).ThenBy(o => o.Item3.R * 3 + o.Item3.G * 2 + o.Item3.B * 1)

Bellow 是一種排序算法,這種方法似乎嘗試並遵循但最終失敗了。 如果事情看起來類似於以下步驟排序算法,那就太好了。

在此處輸入圖像描述 或者在此處輸入圖像描述

更新:我進行了調整以更像示例中的色調方向。

我已經從你的例子中重新創建了樣式,你只需要使用這個比較器對數組進行排序:

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 function 中的片段,那么它將如下所示: 第二個例子

要對數組或可枚舉對象進行排序,請使用Sort方法:

colors.Sort(new ColorRampComparer());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM