2012-12-01 63 views
1

我創建了當前的代碼,並在其中提供了開始和結束顏色以及步驟數。返回的是開始和結束顏色之間的顏色表格(數組)。使用「進度」值進行顏色混合

function getColorSteps(starting, ending, steps) 
    steps = tonumber(steps) or 1 

    local step = { 
     (ending[1] - starting[1])/steps, 
     (ending[2] - starting[2])/steps, 
     (ending[3] - starting[3])/steps 
    } 

    local palette = { 
     [1] = { unpack(starting) }, 
     [steps] = { unpack(ending) } 
    } 

    for i=2, steps-1 do 
     palette[i] = { 
      starting[1] + (step[1] * i), 
      starting[2] + (step[2] * i), 
      starting[3] + (step[3] * i) 
     } 
    end 

    print("#palette = " .. #palette) 
    print("steps = " .. steps) 
    for i = 1, #palette do 
     print(
      i .. 
      ". rgb(" .. 
      table.concat(palette[i], ", ") 
      .. ")" 
     ) 
    end 

    return palette 
end 

我想從步驟轉換爲「進度」。看到這個例子:

s,e = {255,255,255},{0,0,0} 

getColorSteps(s,e,0) 
> 255, 255, 255, 255 

getColorSteps(s,e,0.5) 
> 127.5, 127.5, 127.5, 127.5 

getColorSteps(s,e,1) 
> 0, 0, 0, 0 

我只是不知道如何做到這一點...

回答

2

也許利用線性插值?

function getColorSteps(s, e, interp) 
    return { 
     (e[1]-s[1]) * interp + s[1], 
     (e[2]-s[2]) * interp + s[2], 
     (e[3]-s[3]) * interp + s[3], 
     (e[4]-s[4]) * interp + s[4] 
    } 
end 

這將然而只工作如果每個對應的顏色值ie[i] > s[i]的。所以你可能需要每次使用math.max(e[0], s[0]) - math.min(e[0], s[0])或類似的東西。

而且,哦,我寧願使用ab而不是開始/結束;但它可能只是我的偏好。

+0

a/b可能比s/e好 Lua表索引從1開始,但我理解你的代碼。 – qaisjp

+0

在某些時候,B [i]肯定會少於[i]。我需要一個適當的解決方案.. – qaisjp

+0

我向你提出一個(與最小/最大)。您也可以將數據複製到其他變量,並在適當時進行交換。我不知道哪個是最快的 –