2017-07-10 83 views
0

說我需要三種顏色之間的線性漸變。怎樣才能生成多色停止的線性漸變?

rgb(255, 000, 000) 
rgb(255, 255, 000) 
rgb(000, 255, 000) 

如何計算跨單行線性插值與給定的長度是多少?所以像下面這樣簡單的一行。

enter image description here

如何可以創建一個函數,給定的顏色停止的列表/陣列,輸出所有從輸入內插顏色值的另一個數組?

上面的圖片對我來說是可用的,但我需要能夠在輸入長度上生成具有多個顏色停止的這些RGB數組。

,另一種選擇是基於顏色停止陣列和沿線的點返回單個顏色樣本的功能。

該函數將如下所示:sample(stops[rgb...], point, length)

我嘗試了幾次,但放棄了,因爲我不知道如何下手。我試圖把它看作是三個獨立的色帶的角度,但它仍然不完全匹配。

我知道這是一個簡單的數學大腦塊的情況,這不是一個真正的程序特定的問題,但我不知道還有什麼要問的。

P.S:任何合理理智的編程語言的答案都很好。儘管如此,不要嘗試在看起來像正則表達式的東西中給出答案。

回答

0

您應該對給定間隔的每個顏色分量進行線性插值。

讓我們有N個區間,所以N + 1個節點。節點包含範圍0..1和RGB顏色的位置。

RGBColor NodeColors[N+1] 
Double NodePositions[N+1] 

若要從開始給定距離得到的顏色,你必須確定區間數K.

如果畫線,從開始到結束,在需要的時候只是比較NodePositions條目和增量K表當期距離去。

DistNorm = Dist/Length; 

while (DistNorm > NodePositions[K]) 
    K++ 

如果你想在該行任意點,使用二進制搜索

K = BinarySearch(DistNorm, NodePositions) 

當您得到區間數,計算線性內插在該週期內

Red = NodeColors[K].Red + 
     (NodeColors[K+1].Red - NodeColors[K].Red) * 
     (DistNorm - NodePositions[K])/
     (NodePositions[K+1] - NodePositions[K]) 
same for Green, Blue