Skip to content

Instantly share code, notes, and snippets.

@bbars
Last active January 14, 2023 14:05
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save bbars/b8c7f78952ee438669207cd62931c8d5 to your computer and use it in GitHub Desktop.
Save bbars/b8c7f78952ee438669207cd62931c8d5 to your computer and use it in GitHub Desktop.
Deterministic kaleidoscope-like images generator depends on the seed argument (uses crc32 algorithm to generate seeded random sequence).
var generateSvgAvatar = (function () {
return function (seed, raw) {
var rands = hash320('' + seed);
var randsHex = rands.map(function (v) {
return ('00' + v.toString(16)).slice(-2);
}).join('');
rands = rands.concat(rands);
var globalRotation = 360 * rands[rands[0] % 20] / 0xff;
var particles = [];
var n = 20;
for (var i = 0; i < n; i++) {
// i = (rands[i % 20] + particles.length) % 20;
var hue = 360 * rands[i + 0] / 0xff;
var saturation = 70 + 40 * rands[i + 1] / 0xff; // ... * rands[i + 1] / 0xff;
var lightness = 90 - 40 * i / n; // 40 * rands[i + 2] / 0xff;
var vertices = 3 + rands[i + 3] % 5;
var d = [];
for (var j = 0; j < vertices; j++) {
d.push(
(d.length ? 'L' : 'M')
+ ' ' + (50 + rands[i + 4 + j*2] % 50)
+ ' ' + (33 + rands[i + 5 + j*2] % 34)
);
}
particles.push('<path d="' + d.join(' ') + '" fill="hsla(' + hue + ', ' + saturation + '%, ' + lightness + '%)"></path>');
}
var svg = [
'<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="100" height="100" preserveAspectRatio="xMidYMid slice" viewBox="0 0 100 100">',
'<mask id="mask">',
'<path d="M 50 50 L 100 33 L 100 67 L 50 50" fill="white"></path>',
'</mask>',
'<symbol id="pattern-' + randsHex + '">',
particles.join(''),
'</symbol>',
'<g style="transform-origin:center center; transform: rotate(' + globalRotation + 'deg)">',
'<use xlink:href="#pattern-' + randsHex + '" mask="url(#mask)" class="segment" style="transform-origin:center center;transform: scaleY(+1) rotate(0deg)"></use>',
'<use xlink:href="#pattern-' + randsHex + '" mask="url(#mask)" class="segment" style="transform-origin:center center;transform: scaleY(-1) rotate(36deg);"></use>',
'<use xlink:href="#pattern-' + randsHex + '" mask="url(#mask)" class="segment" style="transform-origin:center center;transform: scaleY(1) rotate(72deg);"></use>',
'<use xlink:href="#pattern-' + randsHex + '" mask="url(#mask)" class="segment" style="transform-origin:center center;transform: scaleY(-1) rotate(108deg);"></use>',
'<use xlink:href="#pattern-' + randsHex + '" mask="url(#mask)" class="segment" style="transform-origin:center center;transform: scaleY(1) rotate(144deg);"></use>',
'<use xlink:href="#pattern-' + randsHex + '" mask="url(#mask)" class="segment" style="transform-origin:center center;transform: scaleY(-1) rotate(180deg);"></use>',
'<use xlink:href="#pattern-' + randsHex + '" mask="url(#mask)" class="segment" style="transform-origin:center center;transform: scaleY(1) rotate(216deg);"></use>',
'<use xlink:href="#pattern-' + randsHex + '" mask="url(#mask)" class="segment" style="transform-origin:center center;transform: scaleY(-1) rotate(252deg);"></use>',
'<use xlink:href="#pattern-' + randsHex + '" mask="url(#mask)" class="segment" style="transform-origin:center center;transform: scaleY(1) rotate(288deg);"></use>',
'<use xlink:href="#pattern-' + randsHex + '" mask="url(#mask)" class="segment" style="transform-origin:center center;transform: scaleY(-1) rotate(324deg);"></use>',
'</g>',
'</svg>',
].join('');
return raw ? svg : 'data:image/svg+xml;base64,' + btoa(svg);
};
function hash320(str) {
var strCrc32 = crc32(str);
var crcTable = getCrcTable();
return new Array(20).fill(0).map(function (_, i) {
return Math.abs(crcTable[Math.abs(i ^ strCrc32) % crcTable.length] ^ strCrc32) % 0xff;
});
}
function getCrcTable() {
if (getCrcTable.cache) {
return getCrcTable.cache;
}
var c;
var crcTable = [];
for(var n = 0; n < 256; n++) {
c = n;
for(var k = 0; k < 8; k++)
c = ((c & 1) ? (0xedb88320 ^ (c >>> 1)) : (c >>> 1));
crcTable[n] = c;
}
return getCrcTable.cache = crcTable;
}
function crc32(str) {
var crcTable = getCrcTable();
var crc = 0 ^ (-1);
for (var i = 0; i < str.length; i++) {
crc = (crc >>> 8) ^ crcTable[(crc ^ str.charCodeAt(i)) & 0xff];
}
return (crc ^ (-1)) >>> 0;
}
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment