// Normal distribution let normalDist = (x, m, t) => +Math.exp(-Math.pow((m - x), 2) / (2 * Math.pow(t, 2))).toFixed(3); // Distribution data let plotData = [], mX1 = -150, mY1 = 180, mX2 = 140, mY2 = 80, mX3 = -150, mY3 = -90, tX1 = 5, tY1 = 10, tX2 = 10, tY2 = 5, tX3 = 5, tY3 = 5, circleNr = 2000, pa, g, resCoords = []; // Add circle let addCircle = (cx, cy, color) => { plotData.push({ x: cx, y: cy, c: color }); renderCircles(); } // Generation algorhithm let generateCoords = () => { let plotZone = Math.floor(d3.randomUniform(3)()), newX = d3.randomUniform(-300, 300)(), newY = d3.randomUniform(-300, 300)(), newColor; switch (plotZone) { case 0: newColor = 'red'; break; case 1: newColor = 'green'; break; case 2: newColor = 'blue'; break; default: newColor = 'black'; break; } do { newX = d3.randomUniform(-300, 300)(); switch (plotZone) { case 0: g = normalDist(newX, mX1, tX1); break; case 1: g = normalDist(newX, mX2, tX2); break; case 2: g = normalDist(newX, mX3, tX3); break; default: break; } pa = +d3.randomUniform(1)().toFixed(3); } while (g < pa); do { newY = d3.randomUniform(-300, 300)(); switch (plotZone) { case 0: g = normalDist(newY, mY1, tY1); break; case 1: g = normalDist(newY, mY2, tY2); break; case 2: g = normalDist(newY, mY3, tY3); break; default: break; } pa = +d3.randomUniform(1)().toFixed(4); } while (g < pa); //console.log(newX, newY, newColor); resCoords.push({ x: newX, y: newY, color: newColor }); addCircle(Math.floor(newX), Math.floor(newY), newColor); };