canvas泰森多边形动画效果
代码语言:html
所属分类:背景
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <style> html, body { width: 100%; height: 100%; overflow: hidden; } body { margin: 0; padding: 0; color: #fff; background-color: #000; } canvas { -webkit-tap-highlight-color: transparent; tap-highlight-color: transparent; -webkit-user-select: none; user-select: none; cursor: pointer; } </style> </head> <body translate="no"> <canvas></canvas> <script > // Voronoi by @neave window.requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) { setTimeout(callback, 1000 / 60); }; Array.prototype.each = function (f) { var i = this.length; while (i--) { f(this[i]); } }; function Edge() { this.data = undefined; this.next = undefined; this.rot = undefined; } Edge.prototype.splice = function (e) { var e1 = this.next.rot, e2 = e.next.rot, e3 = this.next; this.next = e.next; e.next = e3; e3 = e1.next; e1.next = e2.next; e2.next = e3; }; Edge.prototype.swap = function () { var e0 = this.oPrev(), e1 = this.sym().oPrev(); this.splice(e0); this.sym().splice(e1); this.splice(e0.lNext()); this.sym().splice(e1.lNext()); this.setOrg(e0.dest()); this.setDest(e1.dest()); }; Edge.prototype.sym = function () { return this.rot.rot; }; Edge.prototype.iRot = function () { return this.rot.rot.rot; }; Edge.prototype.org = function (v) { return this.data; }; Edge.prototype.setOrg = function (v) { this.data = v; }; Edge.prototype.dest = function () { return this.rot.rot.data; }; Edge.prototype.setDest = function (v) { this.rot.rot.data = v; }; Edge.prototype.setOrgDest = function (o, d) { this.setOrg(o); this.setDest(d); }; Edge.prototype.left = function () { return this.rot.rot.rot.data; }; Edge.prototype.setLeft = function (v) { this.rot.rot.rot.data = v; }; Edge.prototype.right = function () { return this.rot.data; }; Edge.prototype.setRight = function (v) { this.rot.data = v; }; Edge.prototype.oNext = function () { return this.next; }; Edge.prototype.rNext = function () { return this.rot.next.rot.rot.rot; }; Edge.prototype.dNext = function () { return this.rot.rot.next.rot.rot; }; Edge.prototype.lNext = function () { return this.rot.rot.rot.next.rot; }; Edge.prototype.oPrev = function () { return this.rot.next.rot; }; Edge.prototype.rPrev = function () { return this.rot.rot.next; }; Edge.prototype.dPrev = function () { return this.rot.rot.rot.next.rot.rot.rot; }; Edge.prototype.lPrev = function () { return this.next.rot.rot; }; Edge.prototype.leftVertex = function (v) { return isLeftOf(v, this.org(), this.dest()); }; Edge.prototype.rightVertex = function (v) { return isRightOf(v, this.org(), this.dest()); }; Edge.prototype.colinearVertex = function (v) { return colinear(v, this.org(), this.dest()); }; function Vertex(x, y) { this.x = x; this.y = y; this.vx = 0; this.vy = 0; this.cell = 0; this.isInfinity = false; } Vertex.prototype.equals = function (v) { return this.x === v.x && this.y === v.y; }; var get = document.querySelector.bind(document), on = document.addEventListener.bind(document), canvas, context, scale, boundary = 25, totalVertices = 80, maxSpeed = 3, vertices = [], r, g, b, ri, gi, bi, rotMap = [1, 2, 3, 0], nextMap = [0, 3, 2, 1], edge, edges = [], circumcenters = [], edgeVertices = [new Vertex(0, -5000), new Vertex(-10000, 5000), new Vertex(10000, 5000)], maxIterations = 200, followDist = 300, stirDist = 100, mouseX, mouseY, oldMouseX = 0, oldMouseY = 0; function inCircle(v0, v1, v2, v3) { var test = (v2.x - v1.x) * (v3.y - v1.y) * (v0.x * v0.x + v0.y * v0.y - v1.x * v1.x - v1.y * v1.y) + (v3.x - v1.x) * (v0.y - v1.y) * (v2.x * v2.x + v2.y * v2.y - v1.x * v1.x - v1.y * v1.y) + (v0.x - v1.x) * (v2.y - v1.y) * (v3.x * v3.x + v3.y * v3.y - v1.x * v1.x - v1.y * v1.y) - (v2.x - v1.x) * (v0.y - v1.y) * (v3.x * v3.x + v3.y * v3.y - v1.x * v1.x - v1.y * v1.y) - (v3.x - v1.x) * (v2.y - v1.y) * (v0.x * v0.x + v0.y * v0.y - v1.x * v1.x - v1.y * v1.y) - (v0.x - v1.x) * (v3.y - v1.y) * (v2.x * v2.x + v2.y * v2.y - v1.x * v1.x - v1.y * v1.y); return test >= 0; } function area(v0.........完整代码请登录后点击上方下载按钮下载查看
网友评论0