2009-04-11 4 views
1

私は多くのもののために自分のライブラリを使用していますが、最近はグラデーション機能を追加することにしましたが、また、これは私のグラデーションが終わり近くにやや離れているということです。まず、問題のコード:スニペットを使ってグラデーションを生成するためのスニペットによる奇妙な問題

gradient = function(l, g) 
{ 
var r = [], s = [], f = g.length - 1; 
for (var x = 0; x < g.length; x++) 
    g[x] = (typeof(g[x]) == 'string' ? g[x] : g[x].join(','))._replace(['#', ' ', 'rgb(', ')'], ''), 
    g[x] = (g[x].indexOf(',') != -1 
     ? g[x].split(',') 
     : g[x].chunk(2).map(function(_) 
     { 
      return _.fromBase('hex'); 
     })); 
for (var x = 0; x < f; x++) 
    s[x] = [(g[x][0] - g[x + 1][0])/(l - 1) * f, (g[x][1] - g[x + 1][2])/(l - 1) * f, (g[x][2] - g[x + 1][2])/(l - 1) * f]; 
for (var x = 0; x < l; x++) 
    r[x] = '', ([0, 1, 2]).map(function(_) 
    { 
     var c = Math.floor(x/(l/(g.length - 1))); 
     r[x] += (g[c][_] - s[c][_] * (x - (l/(g.length - 1)) * c)).toBase('hex').pad('0', 2); 
    }); 
return r; 
}; 

そして、もちろん、私の図書館:http://wimg.co.uk/HJ0X8B.js

はそこで楽しんでください!私がグラデーションスニペ​​ットで使用するカスタム関数は、_replace()、chunk()、map()、toBase()およびfromBase()です。 this demo pageで見ることができるように、すべての機能はほとんど(OperaとFirefoxでは少なくとも)動作しています。たとえば、gradient(50, ['ffffff', 'ffff00', '00ff00'])を呼び出すと、長さ50の配列が実際に作成されます。この配列には、赤から黄、そして石灰に徐々に移行する16進数のカラー値が含まれますが、最後の色は正確にはライムではありません(この場合は05ff00です)。これは、数学に多少の違いがあり、方法論ではないことを意味します。

だから、誰かが私が解決策に達するのを助けるために、それほど奇妙に美しいと感じるコードであるジャングルを歩きたいのですか?すべての援助は非常に高く評価されます。

+0

FF 3.0.8 –

+0

でデモページのリンクが機能しませんでした。「生成」をクリックしたときにデモが表示されませんでした。 –

+0

apphackerによると、あなたのコードは読めないので、ランダムな名前を付けるのではなく、意味のある変数名を使用してください。 –

答えて

2
gradient = function(l, g) 
{ 
var r = [], s = [], f = g.length - 1; 
for (var x = 0; x < g.length; x++) 
    g[x] = (typeof(g[x]) == 'string' ? g[x] : g[x].join(','))._replace(['#', ' ', 'rgb(', ')'], ''), 
    g[x] = (g[x].indexOf(',') != -1 
     ? g[x].split(',') 
     : g[x].chunk(2).map(function(_) 
     { 
      return _.fromBase('hex'); 
     })); 
for (var x = 0; x < f; x++) 
    s[x] = [(g[x][0] - g[x + 1][0])/(l - 1) * f, (g[x][1] - g[x + 1][1])/(l - 1) * f, (g[x][2] - g[x + 1][2])/(l - 1) * f]; 
for (var x = 0; x < l; x++) 
    r[x] = '', ([0, 1, 2]).map(function(_) 
    { 
     var c = Math.floor(x/(l/(g.length - 1))); 
     r[x] += (g[c][_] - s[c][_] * (x - ((l-1)/(g.length - 1)) * c)).toBase('hex').pad('0', 2); 
    }); 
return r; 
}; 

使用(L-1)の代わりに使用すると、L-1のステップではないリットル用の配列を用意しましたので、最後の計算ライン上リットルの。

あなたのコードは本当に理解しにくいですし、理解しやすいコードとスタンドアットコードを書くようにしてください。 [0、1、2] .map(sth)の代わりにループを書く。

+0

ようこそ。 – BYK

関連する問題