Browse Source

added index file; added sites-populating function

Brandon Wong 7 years ago
commit
0e68db0c75
2 changed files with 87 additions and 0 deletions
  1. 13 0
      index.html
  2. 74 0
      voronoi.js

+ 13 - 0
index.html

@@ -0,0 +1,13 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Voronoi Tessellation</title>
+</head>
+<body>
+    hi
+    <canvas id="canvas" width="500" height="400" style="border:1px solid black;"></canvas>
+    <script src="voronoi.js"></script>
+</body>
+</html>
+

+ 74 - 0
voronoi.js

@@ -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);
+});
+