我使用下面的公式来获得从colorA到colorB的漂亮颜色渐变,但我不知道如何对3种颜色做同样的处理,所以渐变从colorA到colorB到colorC3种颜色之间的颜色插值
colorT = colorA * p + colorB * (1.0 - p);
其中“p”是从0.0到1.0
感谢
我使用下面的公式来获得从colorA到colorB的漂亮颜色渐变,但我不知道如何对3种颜色做同样的处理,所以渐变从colorA到colorB到colorC3种颜色之间的颜色插值
colorT = colorA * p + colorB * (1.0 - p);
其中“p”是从0.0到1.0
感谢
那么,对于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;
使用这个formla我得到的colorB被绘制在p = 0和p = 1,所以渐变从那里到中间,从colorA到colorC的中间跳起来,有什么想法? – 2011-03-27 17:42:40
通过将A更改为B并将B更改为C来修复它 – 2011-03-27 18:49:52
您希望能够创建3个颜色,但等于梯度?完全相同:在完成此渐变之后,请启动一个新的colorA,其中colorA是当前的colorB,colorB是新的颜色。追加的结果,就大功告成了:
colorA ---- colorB colorB ---- colorC
祝你好运!
为此可能构建单个表达式,但最简单的方法是使用条件使用不同表达式,具体取决于您处于范围的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);
是的,好像我在看到它的同时更改了它。 – schnaader 2011-03-23 17:06:10
一个可能的解决方案是通过贝氏曲线使用插值: 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
你能给出样条插值的公式吗? – 2015-10-20 17:45:44
@AntonShkurenko well样条插值实际上是一组约束的解决方案族。根据您的要求,您可以查看https://en.wikipedia.org/wiki/Spline_interpolation#See_also部分。 Hermite在代码中编写起来很容易,你可以尝试着看看。 – andijcr 2015-10-21 09:00:07
感谢您的公式。但是,我不得不作出一些修改它,因为它没有在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;
}
这应该是被接受的答案,因为这是我发现的唯一一个真正做好这项工作的人。谢谢! – JHolub 2017-06-07 05:21:47
不会吧只需计算从colorA到colorB,然后colorB到colorC的渐变? – Lazarus 2011-03-23 14:26:18