2010-01-28 100 views
2

我試圖生成下面的顏色漸變(顏色在一端是藍色,在另一端是紅色)。在C#中生成WaveLength顏色漸變的算法

alt text http://img.brothersoft.com/screenshots/softimage/w/wavelength-160945-1.jpeg

我按照建議put forth here。這是我的代碼:

int rMax = Color.Red.R; 
int rMin = Color.Blue.R; 
// ... and for B, G 
var colorList = new List<Color>(); 
for(int i=0; i<size; i++) 
{ 
    var rAverage = rMin + (int)((rMax - rMin) * i/size); 
    // ... and for B, G 
    colorList.Add(Color.FromArgb(rAverage, gAverage, bAverage)); 
} 

雖然結果我確實呈現逐步,順利從紅到藍轉變,但其他中間色,如黃色和綠色沒有顯示在所有。

我做錯了什麼?

回答

4

您應該使用HSL顏色空間中的顏色,而不是RGB。這使您可以平穩地將色調值從0(紅色)更改爲1(紫色)。 System.Drawing.Color結構允許從RBG轉換爲HSL(GetHue等),但不是其他方式。數學是simple though

+1

查看http://www.bobpowell.net/rgbhsb.htm .NET RGB/HSL轉換代碼 – AakashM 2010-01-28 16:07:19

+0

...這正是我所說的。 – 2010-01-28 20:13:59

1
int rMax = Color.Red.R; 
int rMin = Color.Blue.R; 
// ... and for B, G 
var colorList = new List<Color>(); 
for(int i=0; i<size; i++) 
{ 
    var rAverage = rMin + (int)((rMax - rMin) * i/size); 
    // ... and for B, G 
    colorList.Add(Color.FromArgb(rAverage, gAverage, bAverage)); 
} 

要設置rMin = 0rMax = 255。因此,你基本上設置

rAverage = 255 * i/size; 

你不必爲gAveragebAverage列出的代碼,但如果它是真正相當於你會從黑色 - >格雷>白色看到一個漸進的變遷理論,沒有其他色彩。

你想要的是在不變的亮度/飽和度下迭代不同的色調。請參閱here以獲取示例的C#類,並且使用here來解釋該等式。