Случайный генератор цвета
Учитывая эту функцию, я хочу заменить цвет на случайный генератор цвета.
document.overlay = GPolyline.fromEncoded({
color: "#0000FF",
weight: 10,
points: encoded_points,
zoomFactor: 32,
levels: encoded_levels,
numLevels: 4
});
Как мне это сделать?
Ответы
Ответ 1
Используйте getRandomColor()
вместо "#0000FF"
:
function getRandomColor() {
var letters = '0123456789ABCDEF';
var color = '#';
for (var i = 0; i < 6; i++) {
color += letters[Math.floor(Math.random() * 16)];
}
return color;
}
function setRandomColor() {
$("#colorpad").css("background-color", getRandomColor());
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="colorpad" style="width:300px;height:300px;background-color:#000">
</div>
<button onclick="setRandomColor()">Random Color</button>
Ответ 2
Я сомневаюсь, что все будет быстрее или короче этого:
"#"+((1<<24)*Math.random()|0).toString(16)
Вызов!
Ответ 3
Вот еще один вопрос по этой проблеме.
Моя цель состояла в том, чтобы создать яркие и четкие цвета. Чтобы обеспечить четкость цвета, я не использую случайный генератор и выбираю "равномерно распределенные" цвета из радуги.
Это идеально подходит для создания всплывающих маркеров в Картах Google, которые имеют оптимальную "уникальность" (то есть никакие два маркера не будут иметь одинаковые цвета).
function rainbow(numOfSteps, step) {
// This function generates vibrant, "evenly spaced" colours (i.e. no clustering). This is ideal for creating easily distinguishable vibrant markers in Google Maps and other apps.
// Adam Cole, 2011-Sept-14
// HSV to RBG adapted from: http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript
var r, g, b;
var h = step / numOfSteps;
var i = ~~(h * 6);
var f = h * 6 - i;
var q = 1 - f;
switch(i % 6){
case 0: r = 1; g = f; b = 0; break;
case 1: r = q; g = 1; b = 0; break;
case 2: r = 0; g = 1; b = f; break;
case 3: r = 0; g = q; b = 1; break;
case 4: r = f; g = 0; b = 1; break;
case 5: r = 1; g = 0; b = q; break;
}
var c = "#" + ("00" + (~ ~(r * 255)).toString(16)).slice(-2) + ("00" + (~ ~(g * 255)).toString(16)).slice(-2) + ("00" + (~ ~(b * 255)).toString(16)).slice(-2);
return (c);
}
Если вы хотите увидеть, как это выглядит в действии, см. http://blog.adamcole.ca/2011/11/simple-javascript-rainbow-color.html.
Ответ 4
Кто может победить?
'#'+Math.random().toString(16).substr(-6);
Гарантируется работа все время: http://jsbin.com/OjELIfo/2/edit
На основании комментария @eterps приведенный выше код все равно может генерировать короткие строки, если шестнадцатеричное представление случайного цвета очень короткое (0.730224609375
= > 0.baf
)
Этот код должен работать во всех случаях:
function makeRandomColor(){
var c = '';
while (c.length < 7) {
c += (Math.random()).toString(16).substr(-6).substr(-1)
}
return '#'+c;
}
Ответ 5
Не требуется хэш шестнадцатеричных букв. JavaScript может сделать это сам по себе:
function get_random_color() {
function c() {
var hex = Math.floor(Math.random()*256).toString(16);
return ("0"+String(hex)).substr(-2); // pad with zero
}
return "#"+c()+c()+c();
}
Ответ 6
Случайное генерирование цвета с контролем яркости:
function getRandColor(brightness){
// Six levels of brightness from 0 to 5, 0 being the darkest
var rgb = [Math.random() * 256, Math.random() * 256, Math.random() * 256];
var mix = [brightness*51, brightness*51, brightness*51]; //51 => 255/5
var mixedrgb = [rgb[0] + mix[0], rgb[1] + mix[1], rgb[2] + mix[2]].map(function(x){ return Math.round(x/2.0)})
return "rgb(" + mixedrgb.join(",") + ")";
}
Ответ 7
Мне нравится этот: '#' + (Math.random().toString(16) + "000000").substring(2,8)
Ответ 8
'#'+Math.random().toString(16).slice(-3) // three-numbers format aka #f3c
'#'+Math.random().toString(16).slice(-6) // six-number format aka #abc123
Ответ 9
Вы также можете использовать HSL в каждом хорошем браузере (http://caniuse.com/#feat=css3-colors)
function randomHsl() {
return 'hsla(' + (Math.random() * 360) + ', 100%, 50%, 1)';
}
Это даст вам только яркие цвета, вы также можете играть с яркостью, насыщенностью и альфой.
// es6
const randomHsl = () => 'hsla(${Math.random() * 360}, 100%, 50%, 1)'
Ответ 10
Вот поворот в решении, предоставленном @Anatoliy.
Мне нужно было генерировать только светлые цвета (для фона), поэтому я пошел с тремя буквами (#AAA):
function get_random_color() {
var letters = 'ABCDE'.split('');
var color = '#';
for (var i=0; i<3; i++ ) {
color += letters[Math.floor(Math.random() * letters.length)];
}
return color;
}
Ответ 11
Статья, написанная Paul Irish о генераторе кода случайного шестнадцатеричного кода в JavaScript, абсолютно потрясающая. Использование:
'#'+Math.floor(Math.random()*16777215).toString(16);
Вот ссылка источника:
http://www.paulirish.com/2009/random-hex-color-code-snippets/
Ответ 12
Это можно легко найти с помощью Google Search:
function random_color(format)
{
var rint = Math.round(0xffffff * Math.random());
switch(format)
{
case 'hex':
return ('#0' + rint.toString(16)).replace(/^#0([0-9a-f]{6})$/i, '#$1');
break;
case 'rgb':
return 'rgb(' + (rint >> 16) + ',' + (rint >> 8 & 255) + ',' + (rint & 255) + ')';
break;
default:
return rint;
break;
}
}
Обновленная версия:
function random_color( format ){
var rint = Math.floor( 0x100000000 * Math.random());
switch( format ){
case 'hex':
return '#' + ('00000' + rint.toString(16)).slice(-6).toUpperCase();
case 'hexa':
return '#' + ('0000000' + rint.toString(16)).slice(-8).toUpperCase();
case 'rgb':
return 'rgb(' + (rint & 255) + ',' + (rint >> 8 & 255) + ',' + (rint >> 16 & 255) + ')';
case 'rgba':
return 'rgba(' + (rint & 255) + ',' + (rint >> 8 & 255) + ',' + (rint >> 16 & 255) + ',' + (rint >> 24 & 255)/255 + ')';
default:
return rint;
}
}
Ответ 13
var color = "#";
for (k = 0; k < 3; k++) {
color += ("0" + (Math.random()*256|0).toString(16)).substr(-2);
}
Разбивка того, как это работает:
Math.random()*256
получает случайное число (с плавающей запятой) от 0 до 256 (от 0 до 255 включительно)
Пример результата: 116.15200161933899
Добавление |0
удаляет все после десятичной точки.
Пример: 116.15200161933899 → 116
Использование .toString(16)
преобразует это число в шестнадцатеричное (основание 16).
Пример: 116 → 74
Другой пример: 228 → e4
Добавление "0"
заполняет его нулем. Это будет важно, когда мы получим подстроку, так как наш окончательный результат должен иметь два символа для каждого цвета.
Пример: 74 → 074
Другой пример: 8 → 08
.substr(-2)
получает только два последних символа.
Пример: 074 → 74
Другой пример: 08 → 08 (если бы мы не добавили "0"
, это произвело бы "8" вместо "08" )
Цикл for
запускает этот цикл три раза, добавляя каждый результат в строку цвета, создавая что-то вроде этого:
#7408e4
Ответ 14
Если вы такой же нуб, как я, не знающий о шестнадцатеричных и т.д., Это может быть более интуитивным.
function r() { return Math.floor(Math.random() * 255) }
var color = 'rgb(' + r() + "," + r() + "," + r() + ')';
Вам просто нужно получить строку, такую как 'rgb(255, 123, 220)'
Ответ 15
Итак, хотя все ответы здесь хороши, я хотел немного больше контролировать выход. Например, я хотел бы предотвратить появление почти белых оттенков, обеспечивая при этом яркие яркие цвета, а не размытые оттенки.
function generateColor(ranges) {
if (!ranges) {
ranges = [
[150,256],
[0, 190],
[0, 30]
];
}
var g = function() {
//select random range and remove
var range = ranges.splice(Math.floor(Math.random()*ranges.length), 1)[0];
//pick a random number from within the range
return Math.floor(Math.random() * (range[1] - range[0])) + range[0];
}
return "rgb(" + g() + "," + g() + "," + g() +")";
};
Итак, теперь я могу указать 3 произвольных диапазона для выбора значений rgb. Вы можете вызвать его без аргументов и получить свой набор по умолчанию, который обычно генерирует довольно яркий цвет с одним очевидным доминирующим оттенком, или вы можете предоставить свой собственный диапазон диапазонов.
Ответ 16
Короткий ответ с пэдом для точного размера
'#'+((1<<24)*(Math.random()+1)|0).toString(16).substr(1)
Ответ 17
Еще один случайный генератор цвета:
var randomColor;
randomColor = Math.random() * 0x1000000; // 0 < randomColor < 0x1000000 (randomColor is a float)
randomColor = Math.floor(randomColor); // 0 < randomColor <= 0xFFFFFF (randomColor is an integer)
randomColor = randomColor.toString(16); // hex representation randomColor
randomColor = ("000000" + randomColor).slice(-6); // leading zeros added
randomColor = "#" + randomColor; // # added
Ответ 18
Array.prototype.reduce
делает его очень чистым.
["r","g","b"].reduce(function(res) {
return res + ("0"+~~(Math.random()*256).toString(16)).slice(-2)
}, "#")
Требуется прокладка для старых браузеров.
Ответ 19
Вы можете использовать эту простую функцию
function getRandomColor(){
var color = "#" + (Math.random() * 0xFFFFFF << 0).toString(16);
return color;
}
Ответ 20
Высший проголосовавший комментарий верхнего ответа предполагает, что подход Мартина Анкерла лучше, чем случайные шестнадцатеричные числа, и хотя я не улучшил методологию Ankerl, я успешно перевел его на JavaScript. Я предположил, что добавлю дополнительный ответ на этот поток SO, который имеет очень большой размер, потому что у верхнего ответа есть еще один комментарий, связанный с Gist с реализацией JS логики Ankerl, и эта ссылка сломана (404). Если бы у меня была репутация, я бы просто прокомментировал созданную jsbin ссылку.
// adapted from
// http://jsfiddle.net/Mottie/xcqpF/1/light/
const rgb2hex = (rgb) => {
return (rgb && rgb.length === 3) ? "#" +
("0" + parseInt(rgb[0],10).toString(16)).slice(-2) +
("0" + parseInt(rgb[1],10).toString(16)).slice(-2) +
("0" + parseInt(rgb[2],10).toString(16)).slice(-2) : '';
}
// next two methods converted from Ruby to JS
// soured from http://martin.ankerl.com/2009/12/09/how-to-create-random-colors-programmatically/
// # HSV values in [0..1[
// # returns [r, g, b] values from 0 to 255
const hsv_to_rgb = (h, s, v) => {
const h_i = Math.floor(h*6)
const f = h*6 - h_i
const p = v * (1 - s)
const q = v * (1 - (f * s))
const t = v * (1 - (1 - f) * s)
let r, g, b
switch(h_i){
case(0):
[r, g, b] = [v, t, p]
break
case(1):
[r, g, b] = [q, v, p]
break
case(2):
[r, g, b] = [p, v, t]
break
case(3):
[r, g, b] = [p, q, v]
break
case(4):
[r, g, b] = [t, p, v]
break
case(5):
[r, g, b] = [v, p, q]
break
}
return [Math.floor(r * 256), Math.floor(g * 256), Math.floor(b * 256)]
}
// # use golden ratio
const golden_ratio_conjugate = 0.618033988749895
let h = Math.random() // # use random start value
const gen_hex = (numberOfColors) => {
const colorArray = []
while (numberOfColors > 0) {
h += golden_ratio_conjugate
h %= 1
colorArray.push(rgb2hex(hsv_to_rgb(h, 0.99, 0.99)))
numberOfColors -= 1
}
console.log(colorArray)
return colorArray
}
gen_hex(100)
https://jsbin.com/qeyevoj/edit?js,console
Ответ 21
function get_random_color() {
return "#" + (Math.round(Math.random() * 0XFFFFFF)).toString(16);
}
http://jsfiddle.net/XmqDz/1/
Ответ 22
Используйте четкие цвета.
Он генерирует палитру визуально различных цветов.
четкие цвета очень настраиваются:
- Выберите количество цветов в палитре
- Ограничьте оттенок определенным диапазоном
- Ограничьте цветность (насыщенность) до определенного диапазона
- Ограничьте легкость до определенного диапазона
- Настройка общего качества палитры
Ответ 23
версия ES6.
Случайный цвет
`#${Math.floor(Math.random() * 0x1000000).toString(16).padStart(6, 0)}`
Случайная альфа, случайный цвет.
`#${Math.floor(Math.random() * 0x100000000).toString(16).padStart(8, 0)}`
Ответ 24
Вот мои две версии для генератора случайных шестнадцатеричных кодов.
/* Slowest but shortest. */
"#000000".replace(/0/g,function(){return (~~(Math.random()*16)).toString(16);});
/* Good performance with small size. */
"#"+(function(a,b){while(a--){b+=""+(~~(Math.random()*16)).toString(16);} return b;})(6,"");
/* Remy Sharp provided one that the fastest but a little bit too long */
(function(h){return '#000000'.substr(0,7-h.length)+h})((~~(Math.random()*(1<<24))).toString(16))
Ответ 25
Почти все предыдущие короткие методы генерируют недействительные шестнадцатеричные коды (пять цифр). Я столкнулся с подобной техникой только без этой проблемы здесь:
"#"+("000"+(Math.random()*(1<<24)|0).toString(16)).substr(-6)
Test
Попробуйте это в консоли:
for(i = 0; i < 200; i++) {
console.log("#" + ("000" + (Math.random()*(1<<24)|0).toString(16)).substr(-6));
}
Ответ 26
Эта функция выходит за рамки других ответов двумя способами:
Он пытается генерировать цвета, насколько это возможно, путем нахождения который цвет из 20 попыток имеет самое дальнее эвклидово расстояние от другие в конусе ВПГ
Это позволяет вам ограничить оттенок, насыщенность или диапазон значений, но все же пытается выбрать цвета как насколько это возможно в этом диапазоне.
Это не суперэффективно, но для разумных значений (кто мог бы даже легко выбрать 100 цветов?) Это достаточно быстро.
См. JSFiddle
/**
* Generates a random palette of HSV colors. Attempts to pick colors
* that are as distinct as possible within the desired HSV range.
*
* @param {number} [options.numColors=10] - the number of colors to generate
* @param {number[]} [options.hRange=[0,1]] - the maximum range for generated hue
* @param {number[]} [options.sRange=[0,1]] - the maximum range for generated saturation
* @param {number[]} [options.vRange=[0,1]] - the maximum range for generated value
* @param {number[][]}[options.exclude=[[0,0,0],[0,0,1]]] - colors to exclude
*
* @returns {number[][]} an array of HSV colors (each HSV color
* is a [hue, saturation, value] array)
*/
function randomHSVPalette(options) {
function random(min, max) {
return min + Math.random() * (max - min);
}
function HSVtoXYZ(hsv) {
var h = hsv[0];
var s = hsv[1];
var v = hsv[2];
var angle = h * Math.PI * 2;
return [Math.sin(angle) * s * v,
Math.cos(angle) * s * v,
v];
}
function distSq(a, b) {
var dx = a[0] - b[0];
var dy = a[1] - b[1];
var dz = a[2] - b[2];
return dx * dx + dy * dy + dz * dz;
}
if (!options) {
options = {};
}
var numColors = options.numColors || 10;
var hRange = options.hRange || [0, 1];
var sRange = options.sRange || [0, 1];
var vRange = options.vRange || [0, 1];
var exclude = options.exclude || [[0, 0, 0], [0, 0, 1]];
var points = exclude.map(HSVtoXYZ);
var result = [];
while (result.length < numColors) {
var bestHSV;
var bestXYZ;
var bestDist = 0;
for (var i = 0; i < 20; i++) {
var hsv = [random(hRange[0], hRange[1]), random(sRange[0], sRange[1]), random(vRange[0], vRange[1])];
var xyz = HSVtoXYZ(hsv);
var minDist = 10;
points.forEach(function(point) {
minDist = Math.min(minDist, distSq(xyz, point));
});
if (minDist > bestDist) {
bestHSV = hsv;
bestXYZ = xyz;
bestDist = minDist;
}
}
points.push(bestXYZ);
result.push(bestHSV);
}
return result;
}
function HSVtoRGB(hsv) {
var h = hsv[0];
var s = hsv[1];
var v = hsv[2];
var i = ~~(h * 6);
var f = h * 6 - i;
var p = v * (1 - s);
var q = v * (1 - f * s);
var t = v * (1 - (1 - f) * s);
v = ~~(255 * v);
p = ~~(255 * p);
q = ~~(255 * q);
t = ~~(255 * t);
switch (i % 6) {
case 0: return [v, t, p];
case 1: return [q, v, p];
case 2: return [p, v, t];
case 3: return [p, q, v];
case 4: return [t, p, v];
case 5: return [v, p, q];
}
}
function RGBtoCSS(rgb) {
var r = rgb[0];
var g = rgb[1];
var b = rgb[2];
var rgb = (r << 16) + (g << 8) + b;
return '#' + ('000000' + rgb.toString(16)).slice(-6);
}
Ответ 27
Моя версия:
function RandomColor() {
var hex = (Math.round(Math.random()*0xffffff)).toString(16);
while (hex.length < 6) hex = "0" + hex;
return hex;
}
Ответ 28
Есть так много способов добиться этого. Вот два, что я сделал:
Генерирует шесть случайных шестнадцатеричных цифр (0-F)
function randColor() {
for (var i=0, col=''; i<6; i++) {
col += (Math.random()*16|0).toString(16);
}
return '#'+col;
}
Создает отдельные компоненты RGB (00-FF)
function randColor2() {
var r = ('0'+(Math.random()*256|0).toString(16)).slice(-2),
g = ('0'+(Math.random()*256|0).toString(16)).slice(-2),
b = ('0'+(Math.random()*256|0).toString(16)).slice(-2);
return '#' +r+g+b;
}
Ответ 29
Просто потому, что я могу, я создал нечитаемый фрагмент, который рандомизирует между шестнадцатеричными шест себе и макс...:
function a(f, s){
if(!s || !s.length > 1) return "";
var c = Math.floor(Math.random()*(parseInt("0x" + s.substr(0,2))-parseInt("0x" + f.substr(0,2))+1)+parseInt("0x" + f.substr(0,2))).toString(16);
return (Array(3 - c.length).join("0")) + c + a(f.substr(2,f.length),s.substr(2,s.length));
}
a("990099","ff00ff")
→ возможно рандомизировать → b5009e
Он делает это попарно, поэтому a("12","f2")
→ может рандомизировать → 8f
.
Но он не будет превышать 'f2'
.
var color = "#" + a("11","22") + a("33","44") + a("55","66");
Это то же самое, что:
var color = "#" + a("113355","224466")
Но медленнее.
Ответ 30
Вы можете использовать colorchain.js для генерации последовательности цветов с различными оттенками.