canvas妖风线条动画效果代码
代码语言:html
所属分类:动画
代码描述:canvas妖风线条动画效果代码
下面为部分代码预览,完整代码请点击下载或在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; overflow: hidden; cursor: pointer; } </style> </head> <body translate="no"> <!-- vertical mouse position controls pattern size horizontal mouse position controls animation speed --> <script > "use strict"; let canv, ctx; // canvas and context let maxx, maxy; // canvas dimensions let radius; // hexagons radius (and side length) let grid; // array of hexagons let nbx, nby; // grid size (in elements, not pixels) let orgx, orgy; let perx, pery, pergrid; let speed = 1; // pixels / ms let bg; let relY = 0.5; // to create a non linear (linear by ranges) relationship between mouse position and speed const POSSPEED = [0, 0.05, 0.5, 0.8, 0.94, 0.95, 1.0]; const VALSPEED = [0, 0, 1, 5, 100, 1000, 1000]; let nbLines, trackWidth, relTrackWidth; let lines; // for animation let messages; // 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 mPIS3 = Math.PI / 3; const m2PI = Math.PI * 2; const m2PIS3 = Math.PI * 2 / 3; 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; //------------------------------------------------------------------------ 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 lerp(p0, p1, alpha) { return { x: p0.x * (1 - alpha) + p1.x * alpha, y: p0.y * (1 - alpha) + p1.y * alpha }; } //------------------------------------------------------------------------ class Hexagon { constructor(kx, ky) { this.kx = kx; this.ky = ky; // this.rot = intAlea(6); // random orientation this.rot = pergrid[ky % pery][kx % perx]; this.exits = []; this.arcType = []; for (let k = 0; k < 6; ++k) { let v = [5, null, 0, 2, null, 3][(k - this.rot + 6) % 6]; if (v === null) this.exits[k] = null;else this.exits[k] = (v + this.rot) % 6; this.arcType[k] = ["s", null, "b", "s", null, "b"][ (k - this.rot + 6) % 6]; // small or big } // for k } // Hexagon.constructor // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - size() { // coordinates of centre this.xc = orgx + this.kx * 1.5 * radius; this.yc = orgy + this.ky * radius * rac3; if (this.kx & 1) this.yc -= radius * rac3s2; // odd columns, centre is a bit higher this.vertices = new Array(6).fill(0).map((v, k) => ({ x: this.xc + radius * mcos((k - 2) * mPI / 3), y: this.yc + radius * msin((k - 2) * mPI / 3) })); this.vertices[6] = this.vertices[0]; // makes things easier by avoiding many "% 6" in calculating other calculations this.middle = new Array(6). fill(0). map((p, k) => lerp(this.vertices[k], this.vertices[k + 1], 0.5)); this.extCenters = new Array(6).fill(0).map((v, k) => ({ x: this.xc + rac3 * radius * mcos((k - 1) * mPI / 3 - mPIS2), y: this.yc + rac3 * ra.........完整代码请登录后点击上方下载按钮下载查看
网友评论0