Porting d3.js voronoi layout example to p5.js using d3.js voronoi layout, but drawing in p5.js
Original d3.js code: http://bl.ocks.org/mbostock/4060366
A Pen by Sepand Ansari on CodePen.
Porting d3.js voronoi layout example to p5.js using d3.js voronoi layout, but drawing in p5.js
Original d3.js code: http://bl.ocks.org/mbostock/4060366
A Pen by Sepand Ansari on CodePen.
| // A simplefied version of http://bl.ocks.org/mbostock/4060366 (wihtout mouse interactions), ported to p5.js | |
| function setup() { | |
| var width = 960, | |
| height = 500; | |
| // randomly generate vertices | |
| var vertices = d3.range(100).map(function(d) { | |
| return [Math.random() * width, Math.random() * height]; | |
| }); | |
| // using d3.js voronoi layout to calculate voronoi polygons | |
| var voronoi = d3.geom.voronoi() | |
| .clipExtent([ | |
| [0, 0], | |
| [width, height] | |
| ]); | |
| /* | |
| ----------------------- | |
| p5.js code starts here. | |
| ----------------------- | |
| */ | |
| createCanvas(width, height); | |
| var vcolors = [ | |
| color(197,27,125), color(222,119,174), color(241,182,218), | |
| color(253,224,239), color(247,247,247), color(230,245,208), | |
| color(184,225,134), color(127,188,65), color(77,146,33) | |
| ]; | |
| // create polygons using d3.js voronoi diagram | |
| var polygons = voronoi(vertices); | |
| stroke(255); | |
| // draw polygons | |
| for(var j=0; j<polygons.length; j++) { | |
| var apolygon = polygons[j]; | |
| // pick a random color | |
| var polyColor = vcolors[j % vcolors.length]; | |
| fill(polyColor); | |
| beginShape(); | |
| for(var k=0; k<apolygon.length; k++) { | |
| var v = apolygon[k]; | |
| vertex(v[0], v[1]); | |
| } | |
| endShape(CLOSE); | |
| } | |
| // draw circles. | |
| var circles = vertices.slice(1); | |
| stroke(0); | |
| for(var i=0; i< circles.length; i++) { | |
| var center = circles[i]; | |
| push(); | |
| translate(center[0], center[1]); | |
| fill(0); | |
| ellipse(0, 0, 1.5, 1.5); | |
| pop(); | |
| } | |
| // label | |
| fill(0); | |
| noStroke(); | |
| text('p5.js canvas', 15, 15); | |
| /* | |
| ----------------------- | |
| d3.js code starts here. | |
| ----------------------- | |
| */ | |
| var svg = d3.select("body").append("svg") | |
| .attr("width", width) | |
| .attr("height", height); | |
| var path = svg.append("g").selectAll("path"); | |
| svg.selectAll("circle") | |
| .data(vertices.slice(1)) | |
| .enter().append("circle") | |
| .attr("transform", function(d) { | |
| return "translate(" + d + ")"; | |
| }) | |
| .attr("r", 1.5); | |
| path = path | |
| .data(voronoi(vertices), polygon); | |
| path.exit().remove(); | |
| path.enter().append("path") | |
| .attr("class", function(d, i) { | |
| return "q" + (i % 9) + "-9"; | |
| }) | |
| .attr("d", polygon); | |
| //path.order(); | |
| function polygon(d) { | |
| return "M" + d.join("L") + "Z"; | |
| } | |
| // label | |
| svg.append('text') | |
| .attr('x', 15) | |
| .attr('y', 15) | |
| .attr('width', 50) | |
| .attr('height', 30) | |
| .style('fill','#000') | |
| .text('d3.js svg'); | |
| /* | |
| ----------- | |
| End d3.code | |
| ----------- | |
| */ | |
| } |
| <script src="http://d3js.org/d3.v3.min.js"></script> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/0.4.5/p5.js"></script> |
| path { | |
| stroke: #fff; | |
| } | |
| circle { | |
| fill: #000; | |
| pointer-events: none; | |
| } | |
| .q0-9 { fill: rgb(197,27,125); } | |
| .q1-9 { fill: rgb(222,119,174); } | |
| .q2-9 { fill: rgb(241,182,218); } | |
| .q3-9 { fill: rgb(253,224,239); } | |
| .q4-9 { fill: rgb(247,247,247); } | |
| .q5-9 { fill: rgb(230,245,208); } | |
| .q6-9 { fill: rgb(184,225,134); } | |
| .q7-9 { fill: rgb(127,188,65); } | |
| .q8-9 { fill: rgb(77,146,33); } |