Badge for d3 viSFest unconf 2017
somewhat annoying cheap eye candy
tweaked for badgetron using blockbuilder
forked from kenpenn's block: D3 badge for viSFest 2016
license: gpl-3.0 | |
width: 1050 | |
height: 1500 |
Badge for d3 viSFest unconf 2017
somewhat annoying cheap eye candy
tweaked for badgetron using blockbuilder
forked from kenpenn's block: D3 badge for viSFest 2016
<!doctype html> | |
<html> | |
<head> | |
<meta charset="utf-8"> | |
<title>viSFest 2017 badge</title> | |
<style> | |
body {margin:0;} | |
svg { background: #000; } | |
</style> | |
</head> | |
<body> | |
<div> | |
<svg width="1050px" height="1500px" viewBox="0 0 1050 1500" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"> | |
<defs> | |
<path class="star" d="M32,64 C32,46.326888 46.326888,32 64,32 C46.326888,32 32,17.673112 32,0 C32,17.673112 17.673112,32 0,32 C17.673112,32 32,46.326888 32,64 Z"></path> | |
</defs> | |
<style> | |
.star { | |
fill: #fff; | |
stroke: none; | |
} | |
.color-orbit { | |
fill: none; | |
stroke-width: 8px; | |
} | |
.star-orbit { | |
fill: none; | |
stroke: none; | |
} | |
</style> | |
<rect id="p-n-1" class="bg-cycler" x="275" y="150" width="45" height="58"></rect> | |
<rect id="p-n-0" class="bg-cycler" x="220" y="150" width="45" height="58"></rect> | |
<rect id="p-e" class="bg-cycler" x="165" y="150" width="47" height="58"></rect> | |
<rect id="p" class="bg-cycler" x="107" y="134" width="53" height="77"></rect> | |
<rect id="k-n" class="bg-cycler" x="220" y="60" width="45" height="62"></rect> | |
<rect id="k-e" class="bg-cycler" x="164" y="60" width="47" height="62"></rect> | |
<rect id="k" class="bg-cycler" x="107" y="42" width="57" height="79"></rect> | |
<ellipse id="circ-5" class="bg-cycler" cx="1001.5" cy="248.5" rx="27.5" ry="28.5"></ellipse> | |
<ellipse id="circ-4" class="bg-cycler" cx="901.5" cy="248.5" rx="27.5" ry="28.5"></ellipse> | |
<ellipse id="circ-3" class="bg-cycler" cx="801.5" cy="248.5" rx="27.5" ry="28.5"></ellipse> | |
<ellipse id="circ-2" class="bg-cycler" cx="701.5" cy="248.5" rx="27.5" ry="28.5"></ellipse> | |
<ellipse id="circ-1" class="bg-cycler" cx="601.5" cy="248.5" rx="27.5" ry="28.5"></ellipse> | |
<ellipse id="circ-0" class="bg-cycler" cx="501.5" cy="248.5" rx="27.5" ry="28.5"></ellipse> | |
<ellipse id="@-bg" class="bg-cycler" cx="131.5" cy="248.5" rx="29.5" ry="28.5"></ellipse> | |
<rect id="rect-top-11" class="bg-cycler" x="819" y="300" width="56" height="30"></rect> | |
<rect id="rect-top-10" class="bg-cycler" x="760" y="300" width="56" height="30"></rect> | |
<rect id="rect-top-9" class="bg-cycler" x="701" y="300" width="56" height="30"></rect> | |
<rect id="rect-top-8" class="bg-cycler" x="642.5" y="300" width="56" height="30"></rect> | |
<rect id="rect-top-7" class="bg-cycler" x="584" y="300" width="56" height="30"></rect> | |
<rect id="rect-top-6" class="bg-cycler" x="526" y="300" width="56" height="30"></rect> | |
<rect id="rect-top-5" class="bg-cycler" x="467.5" y="300" width="56" height="30"></rect> | |
<rect id="rect-top-4" class="bg-cycler" x="409.5" y="300" width="56" height="30"></rect> | |
<rect id="rect-top-3" class="bg-cycler" x="351.5" y="300" width="56" height="30"></rect> | |
<rect id="rect-top-2" class="bg-cycler" x="292.5" y="300" width="56" height="30"></rect> | |
<rect id="rect-top-1" class="bg-cycler" x="234" y="300" width="56" height="30"></rect> | |
<rect id="rect-top-0" class="bg-cycler" x="175" y="300" width="56" height="30"></rect> | |
<rect id="rect-bot-11" class="bg-cycler" x="819" y="1278" width="56" height="30"></rect> | |
<rect id="rect-bot-10" class="bg-cycler" x="760" y="1278" width="56" height="30"></rect> | |
<rect id="rect-bot-9" class="bg-cycler" x="701" y="1278" width="56" height="30"></rect> | |
<rect id="rect-bot-8" class="bg-cycler" x="642.5" y="1278" width="56" height="30"></rect> | |
<rect id="rect-bot-7" class="bg-cycler" x="584" y="1278" width="56" height="30"></rect> | |
<rect id="rect-bot-6" class="bg-cycler" x="526" y="1278" width="56" height="30"></rect> | |
<rect id="rect-bot-5" class="bg-cycler" x="467.5" y="1278" width="56" height="30"></rect> | |
<rect id="rect-bot-4" class="bg-cycler" x="409.5" y="1278" width="56" height="30"></rect> | |
<rect id="rect-bot-3" class="bg-cycler" x="351.5" y="1278" width="56" height="30"></rect> | |
<rect id="rect-bot-2" class="bg-cycler" x="292.5" y="1278" width="56" height="30"></rect> | |
<rect id="rect-bot-1" class="bg-cycler" x="234" y="1278" width="56" height="30"></rect> | |
<rect id="rect-bot-0" class="bg-cycler" x="175" y="1278" width="56" height="30"></rect> | |
<rect id="conf-r-paren" class="bg-cycler" x="853" y="1353" width="22" height="75"></rect> | |
<rect id="conf-7" class="bg-cycler" x="799" y="1353" width="39" height="66"></rect> | |
<rect id="conf-1" class="bg-cycler" x="752" y="1353" width="37" height="66"></rect> | |
<rect id="conf-0" class="bg-cycler" x="702" y="1353" width="39" height="66"></rect> | |
<rect id="conf-2" class="bg-cycler" x="654" y="1353" width="37" height="66"></rect> | |
<rect id="conf-l-paren" class="bg-cycler" x="616" y="1353" width="22" height="75"></rect> | |
<rect id="conf-f" class="bg-cycler" x="560" y="1353" width="35" height="66"></rect> | |
<rect id="conf-n-1" class="bg-cycler" x="502" y="1369" width="44" height="50"></rect> | |
<rect id="conf-o" class="bg-cycler" x="458" y="1369" width="44" height="50"></rect> | |
<rect id="conf-c" class="bg-cycler" x="412" y="1369" width="42" height="50"></rect> | |
<rect id="conf-n-0" class="bg-cycler" x="363" y="1370" width="44" height="49"></rect> | |
<rect id="conf-u" class="bg-cycler" x="314" y="1370" width="45" height="49"></rect> | |
<rect id="conf-dot" class="bg-cycler" x="280" y="1398" width="18" height="18"></rect> | |
<rect id="conf-3" class="bg-cycler" x="222" y="1353" width="35" height="66"></rect> | |
<rect id="conf-d" class="bg-cycler" x="172" y="1353" width="44" height="66"></rect> | |
<g id="orbital-grp"></g> | |
<g id="stars-grp"></g> | |
</svg> | |
</div> | |
<script src="https://d3js.org/d3.v4.min.js"></script> | |
<script> | |
var svg = d3.select('svg'); | |
var bgColors = ['hsl(273, 100%, 50%)', 'hsl(212, 100%, 50%)', 'hsl(127, 100%, 50%)', 'hsl(52, 100%, 50%)', 'hsl(35, 100%, 50%)', 'hsl(341, 100%, 50%)']; | |
var bgx = 0; | |
var bgLen = bgColors.length; | |
var bgCyclers = d3.selectAll('.bg-cycler'); | |
var stopCycling = false; | |
function setBgColors() { | |
bgCyclers.each(function() { | |
bgx = bgx < bgLen ? bgx : 0; | |
d3.select(this) | |
.attr('fill', bgColors[bgx]) | |
.datum({'bgx': bgx}); | |
bgx += 1; | |
}); | |
} | |
setBgColors(); | |
function cycleBgColors() { | |
if(stopCycling) { return; } | |
bgCyclers.each(function(d) { | |
var idx = d.bgx + 1 < bgLen ? d.bgx + 1 : 0; | |
d3.select(this) | |
.attr('fill', bgColors[idx]) | |
.datum({'bgx': idx}); | |
}); | |
setTimeout(cycleBgColors, cycleMS); | |
} | |
cycleBgColors(); | |
var ctr = { x: 0, y: 802}; | |
var orbitRx; | |
var orbitalGrp = d3.select('#orbital-grp'); | |
var starDef = document.querySelector('svg defs .star'); | |
setDims(); | |
function setDims () { | |
var svgDims = svg.node().getBoundingClientRect(); | |
var rectTopCR = document.querySelector('#rect-top-0').getBoundingClientRect(); | |
var rectBotCR = document.querySelector('#rect-bot-0').getBoundingClientRect(); | |
var orbitY = rectBotCR.top - rectTopCR.bottom; | |
ctr.x = svgDims.width * 0.5; | |
orbitRx = (Math.min(ctr.x, orbitY) - 128); | |
var starDims = starDef.getBoundingClientRect(); | |
} | |
var starsGrp = d3.select('#stars-grp'); | |
var orbitColors = ['hsl(0, 100%, 50%)','hsl(28, 100%, 50%)','hsl(60, 100%, 50%)','hsl(90, 100%, 50%)','hsl(120, 100%, 50%)','hsl(216, 100%, 50%)','hsl(252, 100%, 50%)','hsl(272, 100%, 50%)','hsl(288, 100%, 50%)','hsl(314, 100%, 50%)']; | |
var obx = 0; | |
var obLen = orbitColors.length; | |
var cycleMS = 200; | |
function ellipticalPath (cx, cy, rx, ry) { | |
return 'M' + (cx - rx) + ',' + cy | |
+ ' a' + rx + ',' + ry | |
+ ' 0 1,0 ' + (rx * 2) + ',0' | |
+ ' a' + rx + ',' + ry | |
+ ' 0 1,0 -' + (rx * 2) + ',0 Z' | |
} | |
function setOrbitTransform (idx) { | |
return 'translate(' + ctr.x + ', ' + ctr.y + ')' | |
+ ' rotate(' + (idx * 18) + ') ' // 10 colors, 180 / 10 | |
+ ' translate( -' + ctr.x + ', -' + ctr.y + ' )'; | |
} | |
function cycleOrbits () { | |
if(stopCycling) { return; } | |
var orbits = orbitalGrp.selectAll('.color-orbit'); | |
orbits.each(function () { | |
var orbit = d3.select(this); | |
var nextColor = orbit.datum().color - 1 < 0 ? obLen - 1 : orbit.datum().color - 1; | |
orbit | |
.attr('stroke', orbitColors[nextColor]) | |
.datum({'color': nextColor}); | |
}); | |
var starGrps = d3.selectAll('.star-grp'); | |
starGrps.each(function () { | |
var starGrp = d3.select(this); | |
var starOrbit = starGrp.select('.star-orbit'); | |
var len = starOrbit.node().getTotalLength(); | |
var stars = starGrp.selectAll('.star') | |
stars.each(function () { | |
var star = d3.select(this); | |
var step = star.datum().step + 1 < 10 ? star.datum().step + 1 : 0; | |
var pt = starOrbit.node().getPointAtLength(step * len * .1) | |
star | |
.attr('transform', 'translate(' + (pt.x - 32) + ',' + (pt.y - 32) + ')') | |
.datum({ 'step': step}); | |
}); | |
}); | |
setTimeout(cycleOrbits, cycleMS); | |
} | |
function drawOrbits () { | |
var colorOrbit, starGrp, starOrbit, star0, star1, len, cp5, pt0, pt1; | |
for (obx; obx < obLen; obx += 1) { | |
colorOrbit = orbitalGrp.append('path') | |
.attr('id', 'orbit-' + obx) | |
.attr('class', 'color-orbit') | |
.attr('stroke', orbitColors[obx]) | |
.attr('d', ellipticalPath(ctr.x, ctr.y, orbitRx, 192)) | |
.datum({'color': obx}); | |
starGrp = starsGrp.append('g') | |
.attr('class', 'star-grp'); | |
starOrbit = starGrp.append('path') | |
.attr('id', 'star-orbit-' + obx) | |
.attr('class', 'star-orbit') | |
.attr('d', ellipticalPath(ctr.x, ctr.y, orbitRx, 192)); | |
cp5 = obx + 5 < 10 ? obx + 5 : obx + 5 - 10; | |
len = starOrbit.node().getTotalLength(); | |
pt0 = starOrbit.node().getPointAtLength(len * obx * .1) | |
pt1 = starOrbit.node().getPointAtLength(len * cp5 * .1) | |
star0 = d3.select(starGrp.node().appendChild(starDef.cloneNode(true))) | |
.attr('id', 'star-' + obx + '-0' ) | |
.attr('transform', 'translate(' + (pt0.x - 32) + ',' + (pt0.y - 32) + ')') | |
.datum({ 'step': obx}); | |
star1 = d3.select(starGrp.node().appendChild(starDef.cloneNode(true))) | |
.attr('id', 'star-' + obx + '-1') | |
.attr('transform', 'translate(' + (pt1.x - 32) + ',' + (pt1.y - 32) + ')') | |
.datum({ 'step': cp5}); | |
colorOrbit.attr('transform', setOrbitTransform(obx)) | |
starGrp.attr('transform', setOrbitTransform(obx)) | |
} | |
} | |
drawOrbits(); | |
setTimeout(cycleOrbits, cycleMS); | |
</script> | |
</body> | |
</html> |