Last active
January 14, 2023 14:05
-
-
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).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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