There are lines... which are fluid... and form a hexagon...
A Pen by Tim Aikens on CodePen.
There are lines... which are fluid... and form a hexagon...
A Pen by Tim Aikens on CodePen.
| <canvas id="hex-canvas"></canvas> |
| /* | |
| * Inspired by: | |
| * https://www.d3lt4.com/post/83103187726/hexagonal-xi-60x80-cm | |
| * (I'm guessing that this is the original version.) | |
| */ | |
| var canvas = document.getElementById('hex-canvas'), | |
| ctx = canvas.getContext('2d'), | |
| afr, | |
| rto; | |
| function drawHex() { | |
| var cw = canvas.width = window.innerWidth, | |
| ch = canvas.height = window.innerHeight; | |
| var sq = Math.min(cw, ch), | |
| hexX = Math.floor(sq - sq/10), | |
| hexY = hexX*Math.sin(Math.PI/3), | |
| hexS = hexX/2; | |
| var lineWidth = sq < 500 ? 2 : (sq < 1000 ? 3 : 4), | |
| dashMax = 400, | |
| dashMin = 100, | |
| gapMax = 80, | |
| gapMin = 30, | |
| osMax = 14, | |
| osMin = 8, | |
| dsMax = 3, | |
| colors = [ | |
| "#F2675B", | |
| "#EBEAE8", | |
| "#518EAB", | |
| "#315084" | |
| ], | |
| lines = []; | |
| ctx.lineWidth = lineWidth; | |
| ctx.lineCap = 'round'; | |
| ctx.translate(cw/2, ch/2); | |
| ctx.rotate((Math.PI / 180) * 210); | |
| ctx.translate(-cw/2, -ch/2); | |
| if (lineWidth % 2 === 0) { | |
| ctx.translate(0.5, 0.5); | |
| } | |
| function Line(x, y, w) { | |
| this.x = Math.floor(x); | |
| this.y = Math.ceil(y); | |
| this.w = Math.floor(w); | |
| this.color = colors[Math.floor(Math.random() * colors.length)]; | |
| this.dash = [ | |
| Math.floor(Math.random()*(dashMax-dashMin)) + dashMin, | |
| Math.floor(Math.random()*(gapMax-gapMin)) + gapMin | |
| ]; | |
| var dashOff = Math.floor(Math.random()*(this.dash[0] + this.dash[1]))*10; | |
| this.sdo = Math.floor(Math.random()*dashOff)-dashOff*2; | |
| this.sdoMax = (this.dash[0] + this.dash[1])*10; | |
| this.sdoSpeed = Math.floor(Math.random()*(osMax-osMin))+osMin; | |
| this.dashSpeed = [ | |
| (Math.floor(Math.random()*dsMax*2)-dsMax)/10, | |
| (Math.floor(Math.random()*dsMax*2)-dsMax)/10 | |
| ]; | |
| } | |
| Line.prototype = { | |
| drawLine: function() { | |
| var l = this; | |
| ctx.beginPath(); | |
| ctx.strokeStyle = l.color; | |
| ctx.setLineDash(l.dash); | |
| ctx.lineDashOffset = l.sdo/10; | |
| ctx.moveTo(l.x, l.y); | |
| ctx.lineTo(l.x + l.w, l.y); | |
| ctx.stroke(); | |
| l.adjustSpeeds(); | |
| }, | |
| adjustSpeeds: function() { | |
| var l = this; | |
| if (l.dash[0] <= dashMin || l.dash[0] >= dashMax) { | |
| l.dashSpeed[0] = -l.dashSpeed[0]; | |
| } | |
| if (l.dash[1] <= gapMin || l.dash[1] >= gapMax) { | |
| l.dashSpeed[1] = -l.dashSpeed[1]; | |
| } | |
| l.dash[0] += l.dashSpeed[0]; | |
| l.dash[1] += l.dashSpeed[1]; | |
| l.sdoMax = (l.dash[0] + l.dash[1])*10; | |
| l.sdo += l.sdoSpeed; | |
| if (l.sdo >= l.sdoMax) { | |
| l.sdo %= l.sdoMax; | |
| } | |
| } | |
| }; | |
| function makeLines() { | |
| var numLines = Math.floor(hexY / (lineWidth*3)), | |
| h4 = hexS/2, | |
| lh = 3/2*lineWidth, | |
| bx = (cw - hexX)/2, | |
| by = (ch - hexY)/2, | |
| r2 = lh/(lh*numLines/2); | |
| for (var i=0;i<numLines;i++) { | |
| var dx = Math.abs(h4 - h4*i*r2), | |
| x = bx + dx, | |
| y = by + i*lineWidth*3; | |
| lines.push(new Line(x, y, hexX-2*dx)); | |
| } | |
| } | |
| makeLines(); | |
| function drawLines() { | |
| ctx.clearRect(0,0,cw,ch); | |
| for (var i=0,j=lines.length;i<j;i++) { | |
| lines[i].drawLine(); | |
| } | |
| afr = requestAnimationFrame(drawLines); | |
| } | |
| drawLines(); | |
| } | |
| drawHex(); | |
| window.addEventListener('resize', function(){ | |
| cancelAnimationFrame(afr); | |
| ctx.clearRect(0,0,window.innerWidth,window.innerHeight); | |
| clearTimeout(rto); | |
| rto = setTimeout(drawHex, 500); | |
| }); |
| html, body, canvas { | |
| height: 100%; | |
| width: 100%; | |
| padding: 0; | |
| margin: 0; | |
| } | |
| body { | |
| background-color: #444243; | |
| overflow: hidden; | |
| } |