Toggle navigation
在线编辑器
在线代码
文本比较
jQuery下载
前端库
在线手册
登录/注册
下载代码
html
css
js
分享到微信朋友圈
X
html
css
/* Make the canvas element fill the screen. */ canvas { display: block; position: absolute; top: 0; left: 0; border: none; margin: 0; z-index: -1; }
JavaScript
//// ---- DAT.GUI CODE ---- //// let params = { horizontalVoronoiDivisions: 14, verticalVoronoiDivisions: 10, voronoiIrregularity: 0.2, numberOfInnerShapes: 40, innerShapeOffset: 2, hueStart: 5, hueEnd: 30, satStart: 5, satEnd: 35, baseBrightness: 20, brightnessMultiplier: 110, hideText: false, createNew: function(){ resetVoronoiDesign(); }, } let gui = new dat.GUI(); let voronoiFolder = gui.addFolder("Voronoi Diagram"); let sketchFolder = gui.addFolder("Pebble Overlay"); let colourFolder = gui.addFolder("Colours"); voronoiFolder.add(params, "horizontalVoronoiDivisions", 1, 20, 1).name("Horiz. Divisions").onChange(function() { resetVoronoiDesign(); }); voronoiFolder.add(params, "verticalVoronoiDivisions", 1, 20, 1).name("Vert. Divisions").onChange(function() { resetVoronoiDesign(); }); voronoiFolder.add(params, "voronoiIrregularity", 0, 0.5).name("Irregularity").onChange(function() { resetVoronoiDesign(); }); sketchFolder.add(params, "numberOfInnerShapes", 0, 100, 1).name("Inner Shapes").onChange(function() { renderVoronoiDesign(); }); sketchFolder.add(params, "innerShapeOffset", 0, 5).name("Shape Offset").onChange(function() { renderVoronoiDesign(); }); colourFolder.add(params, "hueStart", -30, 360).name("Hue Start").onChange(function() { renderVoronoiDesign(); }); colourFolder.add(params, "hueEnd", 0, 390).name("Hue End").onChange(function() { renderVoronoiDesign(); }); colourFolder.add(params, "satStart", 0, 100).name("Sat. Start").onChange(function() { renderVoronoiDesign(); }); colourFolder.add(params, "satEnd", 0, 100).name("Sat. End").onChange(function() { renderVoronoiDesign(); }); colourFolder.add(params, "baseBrightness", -100, 100).name("Bri. Start").onChange(function() { renderVoronoiDesign(); }); colourFolder.add(params, "brightnessMultiplier", -200, 200).name("Bri. Multiplier").onChange(function() { renderVoronoiDesign(); }); gui.add(params, "hideText").name("Hide Text").onChange(function() { renderVoronoiDesign(); }); gui.add(params, "createNew").name("Generate New Design"); let delaunay, voronoi, polygons, voronoiPoints, scaledVoronoiPoints, shapes; function setup(){ createCanvas(windowWidth, windowHeight); colorMode(HSB, 360, 100, 100, 1); rectMode(CENTER); textSize(22); textAlign(CENTER); textStyle(BOLD); textFont('Courier New'); resetVoronoiDesign(); } function windowResized() { resizeCanvas(windowWidth, windowHeight); renderVoronoiDesign(); } function renderVoronoiDesign(){ scaleVoronoiPoints(); createVoronoiPolygons(); createShapes(); drawShapes(); if (params.hideText == false){ drawText(); } } function resetVoronoiDesign(){ noiseSeed(frameCount); createVoronoiPoints(); renderVoronoiDesign(); } function createVoronoiPoints(){ voronoiPoints = []; //The following code is derived from this StackOverflow answer //https://stackoverflow.com/questions/3667927/do-randomly-generated-2d-points-clump-together-and-how-do-i-stop-it let randomnessFactor = params.voronoiIrregularity; for (let ySubDivisions = 0; ySubDivisions < params.verticalVoronoiDivisions; ++ySubDivisions){ for (let xSubDivisions = 0; xSubDivisions < params.horizontalVoronoiDivisions; ++xSubDivisions){ let regularity = 0.5 * (1 - randomnessFactor); let x = regularity + randomnessFactor * random(0, 1) + xSubDivisions / (params.horizontalVoronoiDivisions - 1); let y = regularity + randomnessFactor * random(0, 1) + ySubDivisions / (params.verticalVoronoiDivisions - 1); voronoiPoints.push([x - 0.5, y - 0.5]); } } } function scaleVoronoiPoints(){ scaledVoronoiPoints = []; for (let i = 0; i < voronoiPoints.length; i++){ scaledVoronoiPoints.push([voronoiPoints[i][0] * windowWidth, voronoiPoints[i][1] * windowHeight]); } } function createVoronoiPolygons(){ delaunay = d3.Delaunay.from(scaledVoronoiPoints); voronoi = delaunay.voronoi([0, 0, windowWidth, windowHeight]); polygons = voronoi.cellPolygons(); } function drawText(){ noStroke(); fill(250); rect(windowWidth / 2 - 1, windowHeight - 32.5, 212, 30) fill(0); text("VORONOI PEBBLES", windowWidth / 2, windowHeight - 26); } function createShapes(){ shapes = []; for (const cell of polygons){ //if (isEdgePolygon(cell) == false) shapes.push(new RecursiveShape(cell)); shapes[shapes.length - 1].generateInnerShapes(); // } } function isEdgePolygon(polygon){ for (const point of polygon) { if (point[0] <= 10 || point[0] >= windowWidth - 10) { return true; } if (point[1] <= 10 || point[1] >= windowHeight - 10) { return true; } } return false; } function draw(){/* if (params.animate == true){ if (frameCount % 2 == 0){ let innerShapeAngle = lerp(0, 0.1, (sin(frameCount/100) + 1) / 2); for (let i = 0; i < shapes.length; i++){ shapes[i].innerShapeRotation = innerShapeAngle; shapes[i].generateShapePoints(); shapes[i].draw(); } if (params.hideText == false){ drawText(); } } }*/ } function drawShapes(){ background(10); for (const shape of shapes){ shape.draw(); } } function pointInPolygon(point, vs) { // Taken from https://github.com/substack/point-in-polygon // Nice explainer at https://observablehq.com/@tmcw/understanding-point-in-polygon // ray-casting algorithm based on // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html let x = point[0], y = point[1]; let inside = false; for (let i = 0, j = vs.length - 1; i < vs.length; j = i++) { let xi = vs[i][0], yi = vs[i][1]; let xj = vs[j][0], yj = vs[j][1]; let intersect = ((yi > y) != (yj > y)) && (x < (xj - xi) * (y - yi) / (yj - yi) + xi); if (intersect) inside = !inside; } return inside; }; function RecursiveShape(baseShape){ this.innerShapes = [baseShape]; this.numberOfShapeSides = baseShape.length - 1; this.shapeIndex = baseShape.index; this.numberOfInnerShapes = params.numberOfInnerShapes; this.innerShapeRotation = params.innerShapeAngle; this.saturation = random(params.satStart, params.satEnd); this.hue = random(params.hueStart, params.hueEnd); this.generateInnerShapes = function() { for (let i = 0; i < this.numberOfInnerShapes; i++){ let successfullyAddedShape = this.addInnerShape(); if (successfullyAddedShape == false){ break; } } } this.addInnerShape = function(){ let outerShape = this.innerShapes[this.innerShapes.length - 1].map(x => x); let shapePoints = []; for (let j = 0; j < outerShape.length - 1; j++){ let firstPoint = outerShape[j]; let secondPoint = outerShape[j + 1]; let distanceBetween = dist(firstPoint[0], firstPoint[1], secondPoint[0], secondPoint[1]); let relativeDistance = params.innerShapeOffset / distanceBetween; if (relativeDistance > 0.5){ outerShape.splice(j + 1, 1); j--; continue; } let xPosition = lerp(firstPoint[0], secondPoint[0], relativeDistance); let yPosition = lerp(firstPoint[1], secondPoint[1], relativeDistance); shapePoints.push([xPosition, yPosition]); } if (shapePoints.length >= 3){ shapePoints.push(shapePoints[0]); this.innerShapes.push(shapePoints); return true; } else { return false; } } this.draw = function() { for (let i = 0; i < this.innerShapes.length; i++){ let fillColour = color(this.hue, this.saturation, params.baseBrightness + i * params.brightnessMultiplier / this.innerShapes.length); fill(fillColour); if (i == 0){ stroke(fillColour); } else { noStroke(); } beginShape(); for (let j = 0; j < this.innerShapes[i].length; j++){ vertex(this.innerShapes[i][j][0], this.innerShapes[i][j][1]); } endShape(); } } }
粒子
时间
文字
hover
canvas
3d
游戏
音乐
火焰
水波
轮播图
鼠标跟随
动画
css
加载动画
导航
菜单
按钮
滑块
tab
弹出层
统计图
svg
×
Close
在线代码下载提示
开通在线代码永久免费下载,需支付20jQ币
开通后,在线代码模块中所有代码可终身免费下!
您已开通在线代码永久免费下载,关闭提示框后,点下载代码可直接下载!
您已经开通过在线代码永久免费下载
对不起,您的jQ币不足!可通过发布资源 或
直接充值获取jQ币
取消
开通下载
<!doctype html> <html> <head> <meta charset="utf-8"> <title>沃罗诺伊鹅卵石-jq22.com</title> <script src="https://www.jq22.com/jquery/jquery-1.10.2.js"></script> <style>
</style> </head> <body>
<script>
</script>
</body> </html>
2012-2021 jQuery插件库版权所有
jquery插件
|
jq22工具库
|
网页技术
|
广告合作
|
在线反馈
|
版权声明
沪ICP备13043785号-1
浙公网安备 33041102000314号