2011-03-23 115 views
5

我使用下面的公式来获得从colorA到colorB的漂亮颜色渐变,但我不知道如何对3种颜色做同样的处理,所以渐变从colorA到colorB到colorC3种颜色之间的颜色插值

colorT = colorA * p + colorB * (1.0 - p);其中“p”是从0.0到1.0

百分比

感谢

+2

不会吧只需计算从colorA到colorB,然后colorB到colorC的渐变? – Lazarus 2011-03-23 14:26:18

回答

2

那么,对于3种颜色,你可以在同一其中p = 0.0〜2.0:

if p <= 1.0 
    colorT = colorA * p + colorB * (1.0 - p); 
else 
    colorT = colorB * (p - 1.0) + colorC * (2.0 - p); 

或缩放,所以你仍然可以使用P = 0.0〜1.0:

if p <= 0.5 
    colorT = colorA * p * 2.0 + colorB * (0.5 - p) * 2.0; 
else 
    colorT = colorB * (p - 0.5) * 2.0 + colorC * (1.0 - p) * 2.0; 
+0

使用这个formla我得到的colorB被绘制在p = 0和p = 1,所以渐变从那里到中间,从colorA到colorC的中间跳起来,有什么想法? – 2011-03-27 17:42:40

+0

通过将A更改为B并将B更改为C来修复它 – 2011-03-27 18:49:52

0

您希望能够创建3个颜色,但等于梯度?完全相同:在完成此渐变之后,请启动一个新的colorA,其中colorA是当前的colorB,colorB是新的颜色。追加的结果,就大功告成了:

colorA ---- colorB colorB ---- colorC

祝你好运!

2

为此可能构建单个表达式,但最简单的方法是使用条件使用不同表达式,具体取决于您处于范围的A-B部分还是B-C部分:

colorT = 
    p < 0.5 
    ? colorA * p * 2.0 + colorB * (1.0 - p * 2.0) 
    : colorB * (p - 0.5) * 2.0 + colorC * (1.0 - (p - 0.5) * 2.0); 
+0

是的,好像我在看到它的同时更改了它。 – schnaader 2011-03-23 17:06:10

1

一个可能的解决方案是通过贝氏曲线使用插值: http://en.wikipedia.org/wiki/B%C3%A9zier_curve 如果你看的特殊情况下二次样条曲线,可以看到3点,或在您的案件颜色之间内插公式。

colorT=(1-p*p)Color0 + 2(1-p)Color1 + (p*p)Color2 , 0<=p<=1 

这是您的线性公式的推广。

编辑:

在第二,虽然,这种方法并不能得到你的测试结果,作为中间点从未接触过。 要获得一个平滑的曲线,触及所有点(颜色),您必须使用样条线http://en.wikipedia.org/wiki/Spline_interpolation

+0

你能给出样条插值的公式吗? – 2015-10-20 17:45:44

+0

@AntonShkurenko well样条插值实际上是一组约束的解决方案族。根据您的要求,您可以查看https://en.wikipedia.org/wiki/Spline_interpolation#See_also部分。 Hermite在代码中编写起来很容易,你可以尝试着看看。 – andijcr 2015-10-21 09:00:07

2

感谢您的公式。但是,我不得不作出一些修改它,因为它没有在3种颜色之间的正确插值(有颜色上的变化跳跃)

下面是该修复:

if (p < 0.5) 
     { 
      COLORx = (COLORb * p * 2.0) + COLORa * (0.5 - p) * 2.0; 
     } 
     else 
     { 
      COLORx = COLORc * (p - 0.5) * 2.0 + COLORb * (1.0 - p) * 2.0;   
     } 
+0

这应该是被接受的答案,因为这是我发现的唯一一个真正做好这项工作的人。谢谢! – JHolub 2017-06-07 05:21:47