2016-02-03 131 views
1

我试图创建一个函数,输入两个RGB颜色和百分比,然后返回基于百分比的两个之间的颜色。Lua:褪色功能

我在网上找到了Dec2Hex函数,并认为它会有用。

现在我曾尝试:

function Dec2Hex(nValue) -- http://www.indigorose.com/forums/threads/10192-Convert-Hexadecimal-to-Decimal 
    if type(nValue) == "string" then 
     nValue = String.ToNumber(nValue); 
    end 
    nHexVal = string.format("%X", nValue); -- %X returns uppercase hex, %x gives lowercase letters 
    sHexVal = nHexVal..""; 
    if nValue < 16 then 
     return "0"..tostring(sHexVal) 
    else 
     return sHexVal 
    end 
end 

function fade_RGB(colour1, colour2, percentage) 
    r1, g1, b1 = string.match(colour1, "#([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])") 
    r2, g2, b2 = string.match(colour2, "#([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])([0-9A-F][0-9A-F])") 
    r3 = (tonumber(r1, 16)/tonumber(r2, 16))*(percentage) 
    g3 = (tonumber(g1, 16)/tonumber(g2, 16))*(percentage) 
    b3 = (tonumber(b1, 16)/tonumber(b2, 16))*(percentage) 
    return "#"..Dec2Hex(r3).. Dec2Hex(g3)..Dec2Hex(b3) 
end 

我觉得我朝着正确的方向,但数学是不正确的,我无法弄清楚如何解决它。提前致谢!

+0

'tonumber(r1,16)'做了什么?自从我最后碰到Lua以来已经有一段时间了。 –

+0

将十六进制转换为十进制 –

+0

像这样? http://hawwashsoft.proboards.com/thread/109/gradient-draw-library – warspyking

回答

2

否姓名的答案几乎是正确的,但他没有根据百分比合并两种颜色。

你想要做的是对这两个值进行线性插值(尽管知道人类视觉/光线明智这不是插值颜色的工作方式,但很多图书馆都这样做,因为它很容易和适用于简单情况)。

r3 = tonumber(r1, 16)*(100-percentage)/100.0 + tonumber(r2, 16)*(percentage)/100.0 

正如你可能会注意到乘以百分比并将其除以100是一种单调乏味的行为,所以你可能希望通过它已经被划分。

1

如果我是正确的,行

r3 = (tonumber(r1, 16)/tonumber(r2, 16))*(percentage) 

应该

r3 = math.abs(tonumber(r1, 16) - tonumber(r2, 16))*(percentage/100) 

其他类似的线遵循相同的概念。

编辑:

r3 = math.min(tonumber(r1, 16), tonumber(r2, 16)) + 
    math.abs(tonumber(r1, 16) - tonumber(r2, 16)) * (percentage/100) 

应该产生红色为fade_RGB("#FF0000", #0000FF, 0)和蓝色fade_RGB("#FF0000", #0000FF, 100)

+0

'r3 = math.abs(tonumber(r1,16) - tonumber(r2,16))*(percentage/100)'它可以工作! –

+0

很酷,我会编辑答案来反映这一点。 –

+0

错误..其实它仍然不正确。我想要它,所以如果输入:fade_RGB(“#FF0000”,“#0000FF”,0),你会回红。 fade_RGB(“#FF0000”,“#0000FF”,100)应该为蓝色。而fade_RGB(“#FF0000”,“#0000FF”,50)应该是品红色或任何中间的。 –