2016-02-03 48 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)應該是品紅色或任何中間的。 –