理論
完全飽和(13759 HSL和類似的配色方案),實際上意味着,你必須在一個完整的RGB值,一個0,一個在任何其他值。
其原因是飽和度是基於最高和最低顏色成分之間的差異,並且當它們處於極端時是最高的。實際的定義更加複雜(並涉及亮度),但足夠說一個0和另一個1的分量將給出最大飽和度。
算法1
這導致這樣做的一個比較簡單的方法。
- 生成隨機數0和1之間
隨機
- 分配這個號碼到一個FO的R,G和B的元素。
- 將零隨機分配給其餘元素之一。
- 設定的最後一個元素爲1
這會給你一個最大飽和度的顏色相對簡單。
對於實現它可能是最容易產生一個隨機數1到6爲6可能的選擇你分配0,1和隨機元素,然後使用某種類型的開關。
這是最簡單的算法,但由於選擇/分支不一定是最簡單的實現。
算法2
的建議由吉姆·米契爾基於類似的理論,但只是實現了一個稍微不同的第二種方法。
- 產生用於每個R,G和B分量
- 的隨機值查找最大分量。
- 找到最小組件。
- 將最大分量設置爲1.
- 將最小分量設置爲0。
這與將一個值設置爲1,一個設置爲0和一個設置爲隨機值的效果相同。它的優點是它不需要你使用凌亂的switch語句,但是你最終可能會產生一些混亂的循環。同樣取決於你的組件的精度(例如,如果你直接用字節),那麼如果你的中間值實際上等於你的頂部或底部(或所有三個都是相同的),那麼這可能也會被重置,這取決於你如何編碼你的算法。這將主要影響隨機性的傾斜,但這不太可能引人注意。吉姆
int[] rgb = new int[3];
rgb[0] = rnd.Next(256); // red
rgb[1] = rnd.Next(256); // green
rgb[2] = rnd.Next(256); // blue
// Console.WriteLine("{0},{1},{2}", rgb[0], rgb[1], rgb[2]);
// find max and min indexes.
int max, min;
if (rgb[0] > rgb[1])
{
max = (rgb[0] > rgb[2]) ? 0 : 2
min = (rgb[1] < rgb[2]) ? 1 : 2;
}
else
{
max = (rgb[1] > rgb[2]) ? 1 : 2;
int notmax = 1 + max % 2;
min = (rgb[0] < rgb[notmax]) ? 0 : notmax;
}
rgb[max] = 255;
rgb[min] = 0;
// Console.WriteLine("{0},{1},{2}", rgb[0], rgb[1], rgb[2]);
表達式'(int)(rand.NextDouble()* 255)'永遠不會生成值「255」。 'NextDouble'生成一個數字,使得0 <= x <1.0。如果你想產生從0到255的數值,你需要把你的數字改成256.但是,爲什麼不使用'rand.Next(256)'來完成它呢? –
很高興知道,吉姆 – abenci