刺绣背景效果
代码语言:html
所属分类:背景
代码描述:刺绣背景效果
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> body { font-family: Arial, Helvetica, "Liberation Sans", FreeSans, sans-serif; background-color: #000; margin:0; padding:0; border-width:0; } </style> </head> <body translate="no"> <script > "use strict"; window.addEventListener("load", function () { const triWidthMin = 5; // length of triangle side 5..triWidthMax const triWidthMax = 20; // length of triangle side triWidthMin..50 const DHUE = 1; // integer 1-10 - hue change by step const DLUM = 1; // 0.1 - 5 - lightness change by step const GAPTRI = -0.5; // -0.5 for black thin line between triangles, +1 for no gap let canv, ctx; // canvas and context let canvbg, ctxbg; // background canvas and context let maxx, maxy; // canvas dimensions let triWidth; let triHeight; let grid; let nbx, nby; let hnbx, hnby; // number of triangles in the half of the width, height of the canvas let groups; let listReachable; // for animation let tStampRef; // time stamp ref for animation let animState; let events; let currGrp; let colorMode; let hue, dhue; let lum, dlum; // shortcuts for Math. const mrandom = Math.random; const mfloor = Math.floor; const mround = Math.round; const mceil = Math.ceil; const mabs = Math.abs; const mmin = Math.min; const mmax = Math.max; const mPI = Math.PI; const mPIS2 = Math.PI / 2; const m2PI = Math.PI * 2; const msin = Math.sin; const mcos = Math.cos; const matan2 = Math.atan2; const mhypot = Math.hypot; const msqrt = Math.sqrt; const rac3 = msqrt(3); const rac3s2 = rac3 / 2; const mPIS3 = Math.PI / 3; const sinPIS6 = 0.5; const cosPIS6 = rac3s2; const sinPIS3 = cosPIS6; const cosPIS3 = sinPIS6; //------------------------------------------------------------------------ function alea(mini, maxi) { // random number in given range if (typeof maxi == 'undefined') return mini * mrandom(); // range 0..mini return mini + mrandom() * (maxi - mini); // range mini..maxi } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function intAlea(mini, maxi) { // random integer in given range (mini..maxi - 1 or 0..mini - 1) // if (typeof maxi == 'undefined') return mfloor(mini * mrandom()); // range 0..mini - 1 return mini + mfloor(mrandom() * (maxi - mini)); // range mini .. maxi - 1 } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function removeElement(array, element) { let idx = array.indexOf(element); if (idx == -1) throw 'Bug ! indexOf -1 in removeElement'; array.splice(idx, 1); } // removeElement // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function randomElement(array) { return array[intAlea(0, array.length)]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function arrayShuffle(array) { /* randomly changes the order of items in an array only the order is modified, not the elements */ let k1, temp; for (let k = array.length - 1; k >= 1; --k) { k1 = intAlea(0, k + 1); temp = array[k]; array[k] = array[k1]; array[k1] = temp; } // for k return array; } // arrayShuffle // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - /* returns intermediate point between p0 and p1, alpha = 0 whill preturn p0, alpha = 1 will return p1 values of alpha outside [0,1] may be used to compute points outside the p0-p1 segment */ function intermediate(p0, p1, alpha) { return [(1 - alpha) * p0[0] + alpha * p1[0], (1 - alpha) * p0[1] + alpha * p1[1]]; } // function intermediate //------------------------------------------------------------------------ function rotate3(t) { let ny = t[0] - t[1] + 1 >> 1; return [ny - t[0] - t[1], ny]; } // rotate 3 //------------------------------------------------------------------------ function Triangle(kx, ky, color) { /* constructor */ this.color = color ? color : `hsl(${intAlea(360)},100%,50%)`; this.kx = kx; this.ky = ky; this.kxc = kx - hnbx; this.kyc = ky - hnby; this.setXY(kx, ky); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Triangle.prototype.setXY = function (kx, ky) { let xa, ya, vertices, deltay, upsideDown, tw; // centre of this triangle (middle of height, not gravity centre) ya = maxy / 2 + this.kyc * triHeight; xa = maxx / 2 + this.kxc * triWidth / 2; vertices = [[], [], []]; let modTriWidth = triWidth + GAPTRI; deltay = modTriWidth * msqrt(3) / 4; tw = modTriWidth / 2; this.upsideDown = !!(this.kxc + this.kyc & 1); if (this.upsideDown) deltay = -deltay; vertices[0][0] = xa; vertices[0][1] = ya - deltay; vertices[1][0] = xa + tw; vertices[1][1] = ya + deltay; vertices[2][0] = xa - tw; vertices[2][1] = ya + deltay; this.kx = kx; this.ky = ky; this.xa = xa; this.ya = ya; this.xg = xa; // gravity centre this.yg = ya + deltay / 3; this.vertices = vertices; }; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Triangle.prototype.addGrp = function (cell) { if (!this.grp) { this.grp = new Group(this); } cell.grp = this.grp; // cells really share the same group this.grp.add(cell); }; // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Triangle.prototype.drawTriangle = function (fill) { ctx.beginPath(); ctx.moveTo(this.vertices[0][0], this.vertices[0][1]); ctx.lineTo(this.vertices[1][0], this.vertices[1][1]); ctx.lineTo(this.vertices[2][0], this.vertices[2][1]); ctx.closePath(); ctx.fillStyle = fill; ctx.fill(); }; // Triangle.prototype.drawTriangle //------------------------------------------------------------------------ function Group(cell) { this.cells = new Set([cell]); this.unused = true; groups.push(this); } Group.prototype.add = function (otherCell) { this.cells.add(otherCell); // does nothing if same cell }; Group.prototype.draw = function (color) { this.cells.forE.........完整代码请登录后点击上方下载按钮下载查看
网友评论0