Странная проблема с фрагментом кода для генерации градиентов - PullRequest
1 голос
/ 11 апреля 2009

Я использую свою собственную библиотеку для многих вещей, и недавно я решил добавить функциональность градиента, но я столкнулся с проблемой, которую, как мне кажется, я помню, тоже недавно, и это вопрос моего градиента немного не ближе к концу. Во-первых, рассматриваемый код:

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 () ... как вы сможете увидеть на этой демонстрационной странице , все в значительной степени работает (по крайней мере, в Opera и Firefox), за исключением того, что в конце градиент слегка смещен (наведите курсор на гекс) значение). Например, вызов gradient(50, ['ffffff', 'ffff00', '00ff00']) действительно создает массив длиной пятьдесят, который содержит шестнадцатеричные значения цвета, постепенно смещаясь от красного к желтому, а затем к известковому, однако последний цвет не совсем известь (в данном случае это 05ff00) ; это означает, что в математике есть что-то не так, а не в методологии.

Итак ... кто-нибудь желает пройтись по джунглям, это код, который я нахожу настолько странно красивым, чтобы помочь мне найти решение? Мы очень ценим любую помощь.

1 Ответ

2 голосов
/ 13 апреля 2009
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 в последней строке вычисления, поскольку вы подготовили массив s для шагов l-1, а не l.

Кстати, ваш код действительно сложен для понимания, попробуйте написать более понятный и стандартный код. И пишите для циклов вместо [0, 1, 2] .map (sth).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...