|  | @@ -0,0 +1,74 @@
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +console.log('hi voronoi');
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const canvas = document.getElementById('canvas'),
 | 
	
		
			
				|  |  | +    canvwidth = canvas.width,
 | 
	
		
			
				|  |  | +    canvheight = canvas.height,
 | 
	
		
			
				|  |  | +    ctx = canvas.getContext('2d');
 | 
	
		
			
				|  |  | +const minDist = 20,
 | 
	
		
			
				|  |  | +    edgeBounds = 20;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +function drawSite(x, y) {
 | 
	
		
			
				|  |  | +    ctx.save();
 | 
	
		
			
				|  |  | +    ctx.beginPath();
 | 
	
		
			
				|  |  | +    ctx.arc(x, y, 2, 0, Math.PI * 2, false);
 | 
	
		
			
				|  |  | +    ctx.closePath();
 | 
	
		
			
				|  |  | +    ctx.fillStyle = 'black';
 | 
	
		
			
				|  |  | +    ctx.fill();
 | 
	
		
			
				|  |  | +    ctx.restore();
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +function drawLine(x1, y1, x2, y2) {
 | 
	
		
			
				|  |  | +    ctx.save();
 | 
	
		
			
				|  |  | +    ctx.beginPath();
 | 
	
		
			
				|  |  | +    ctx.strokeStyle = 'black';
 | 
	
		
			
				|  |  | +    ctx.lineWidth = 1;
 | 
	
		
			
				|  |  | +    ctx.moveTo(x1, y1);
 | 
	
		
			
				|  |  | +    ctx.lineTo(x2, y2);
 | 
	
		
			
				|  |  | +    ctx.stroke();
 | 
	
		
			
				|  |  | +    ctx.restore();
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +function drawLineO(p1, p2) {
 | 
	
		
			
				|  |  | +    drawLine(p1.x, p1.y, p2.x, p2.y);
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +function distance(p1, p2) {
 | 
	
		
			
				|  |  | +    return Math.sqrt(Math.pow(p2.x - p1.x, 2) + Math.pow(p2.y - p1.y, 2));
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +function generateSites(n = 10) {
 | 
	
		
			
				|  |  | +    const sites = [],
 | 
	
		
			
				|  |  | +        safety = n * 2,
 | 
	
		
			
				|  |  | +        randMultWidth = canvwidth - (edgeBounds * 2),
 | 
	
		
			
				|  |  | +        randMultHeight = canvheight - (edgeBounds * 2),
 | 
	
		
			
				|  |  | +        origin = {x:0, y:0};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    let count = 0;
 | 
	
		
			
				|  |  | +    while( sites.length < n && count < safety ) {
 | 
	
		
			
				|  |  | +        count += 1;
 | 
	
		
			
				|  |  | +        const x = Math.floor(Math.random() * randMultWidth) + edgeBounds,
 | 
	
		
			
				|  |  | +            y = Math.floor(Math.random() * randMultHeight) + edgeBounds,
 | 
	
		
			
				|  |  | +            min = sites.reduce(function checkDist(minSoFar, existing) {
 | 
	
		
			
				|  |  | +                const d = distance(existing, {x, y});
 | 
	
		
			
				|  |  | +                if( d < minSoFar ) {
 | 
	
		
			
				|  |  | +                    return d;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +                else {
 | 
	
		
			
				|  |  | +                    return minSoFar;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +            }, canvwidth * canvheight);
 | 
	
		
			
				|  |  | +        if( min > minDist ) {
 | 
	
		
			
				|  |  | +            sites.push( {x, y} );
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    sites.sort(function (a, b) {
 | 
	
		
			
				|  |  | +        return distance(origin, a) - distance(origin, b);
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return sites;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +const sites = generateSites(15);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +sites.forEach(function renderSites(site) {
 | 
	
		
			
				|  |  | +    drawSite(site.x, site.y);
 | 
	
		
			
				|  |  | +});
 | 
	
		
			
				|  |  | +
 |