2017-07-10 43 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