Хобрук: Ваш путь к мастерству в программировании

javascript, выберите случайный шестнадцатеричный цвет между начальным и конечным цветом

Есть ли быстрый способ сделать это?

Например, начальный цвет #EEEEEE и конечный цвет #FFFFFF дадут что-то вроде #FEFFEE.

24.04.2014

  • Будет ли работать преобразование в HSLA, затем выбор H, S, L и A между двумя диапазонами независимо, а затем преобразование обратно в шестнадцатеричный формат? 24.04.2014
  • вы можете использовать эквивалент для функции php hexdec и фактически вычислять шестнадцатеричные цвета, такие как числа: http://phpjs.org/functions/hexdec/ 24.04.2014

Ответы:


1

Конечно, шестнадцатеричный кодируется как число, но для того, чтобы он имел какой-либо смысл, вы должны сначала извлечь компоненты rgb:

function rgb(string){
    return string.match(/\w\w/g).map(function(b){ return parseInt(b,16) })
}
var rgb1 = rgb("#EEEEEE");
var rgb2 = rgb("#FFFFFF");

Затем просто возьмите промежуточное звено всех компонентов:

var rgb3 = [];
for (var i=0; i<3; i++) rgb3[i] = rgb1[i]+Math.random()*(rgb2[i]-rgb1[i])|0;

И, наконец, перестройте цвет как стандартную шестнадцатеричную строку:

var newColor = '#' + rgb3
    .map(function(n){ return n.toString(16) })
    .map(function(s){ return "00".slice(s.length)+s}).join(''); 

Обратите внимание, что для получения лучших результатов, в зависимости от вашей цели, например, если вы хотите сохранить яркость, используйте другой цветовое пространство, чем RGB (скажем, HSL или HSV), может оказаться полезным.

24.04.2014

2

d3 делает это очень хорошо, создавая цветовые шкалы:

var color = d3.scale.linear()
    .domain([-1, 0, 1])
    .range(["red", "white", "green"]);

color(-1)   // "#ff0000" red
color(-0.5) // "#ff8080" pinkish
color(0)    // "#ffffff" white
color(0.5)  // "#80c080" getting greener
color(0.7)  // "#4da64d" almost there..
color(1)    // "#008000" totally green!
24.04.2014
  • как указать это для гистограмм. У меня может быть 10 точек данных или 100 точек данных... как обращаться с этим меняющимся диапазоном данных 21.03.2017

  • 3

    Если я правильно понимаю вопрос, вы хотите, чтобы каждая цифра находилась в одном диапазоне. Вы имеете в виду каждую цифру или каждый компонент (цветовой канал). Для каждой цифры см. моя скрипка

    Ключ:

    for(var i = 0;i < 6; i++) {
        color += (Math.floor(Math.random() * (end-start+1)) + start).toString(16);
    }
    

    с началом и концом от 0 до 15

    или каждый канал:

    for(var i = 0;i < 3; i++) {
        color += (Math.floor(Math.random() * (end-start+1)) + start).toString(16);
    }
    

    с началом и концом от 0 до 255

    24.04.2014
  • Вы уверены, что он не хочет, чтобы 0xF0 был значением между 0xEE и 0xFF? Это было бы удивительно. 24.04.2014
  • не уверен, так как его вопрос задан не очень точно, но, согласно его примеру, после нескольких тестовых прогонов с (начало = 13, конец = 15) это дало мне #feefef #ffeeff #eeffff #fffeef #fffffe 24.04.2014
  • какой пример вы имеете в виду? Я не вижу никакой ссылки, размещенной спрашивающим, где-либо вокруг этого вопроса. 24.04.2014
  • Пример, который я привел в своей скрипке, генерирует эти цвета, ссылаясь на его вопрос ...#EEEEEE и конечный цвет #FFFFFF будет выглядеть как #FEFFEE. 24.04.2014
  • Я не думаю, что вы можете использовать результаты вашей интерпретации в качестве доказательства того, что эта интерпретация верна :-) 24.04.2014
  • Я проголосовал за ответ @dystroy, тем не менее я попытался ответить на вопрос в соответствии со своей интерпретацией. Извините, если я был неправ, но если люди в настоящее время дают плохое описание вопроса, ТАК новичкам трудно дать соответствующие ответы за небольшой промежуток времени. Просто стараюсь изо всех сил помочь... 24.04.2014

  • 4

    Пытаться:

    function getRandomColor(start, end){
        var min=parseInt(start.replace("#",""), 16);
        var max=parseInt(end.replace("#",""), 16);
        return "#"+Math.floor((Math.random() * (max - min) + min)).toString(16).toUpperCase();
    }    
    

    Вот скрипка, с которой можно поиграть.

    24.04.2014
  • Для каждого составителя не требуется промежуточный звен. 24.04.2014
  • Кто проголосовал за это, понятия не имеет, что делает цвет... это дает такие цвета, как #F493F1... 24.04.2014
  • Он делает то, что хотел TO: случайный цвет. Ничего больше или меньше. 25.04.2014
  • Новые материалы

    Введение в контекст React
    В этом посте мы поговорим о Context API, который был представлен в React 16, и о том, как вы можете их использовать. Что такое контекст? Глядя на определение из react docs , оно..

    Шлюз с лицензией OSS, совместимый с Apollo Federation v2, появится в WunderGraph
    Сегодня мы рады сообщить, что мы сотрудничаем с поддерживаемой YC Tailor Technologies, Inc. для внедрения Apollo Federation v2. Реализация будет лицензирована MIT (Engine) и Apache 2.0..

    Это оно
    Ну, я официально уволился с работы! На этой неделе я буду лихорадочно выполнять последние требования Думающего , чтобы я мог сосредоточиться на поиске работы. Что именно это значит?..

    7 полезных библиотек JavaScript, которые вы должны использовать в своем следующем проекте
    Усильте свою разработку JavaScript Есть поговорка «Не нужно изобретать велосипед». Библиотеки — лучший тому пример. Это поможет вам написать сложные и трудоемкие функции простым способом...

    Базовое руководство по переносу концепций обучения в глубокое обучение
    Обзор По мере того, как машинное обучение становится все более мощным и продвинутым, модели, обеспечивающие эту расширенную возможность, становятся все больше и начинают требовать огромного..

    C в C.R.U.D с использованием React-Redux
    Если вы использовали React, возможно, вы знакомы с головной болью, связанной с обратным потоком данных. Передача состояния реквизитам от родительских компонентов к дочерним компонентам может..

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