function generatePoints(geom, bounds, count, precision=6, predicate='inside'){
const t0 = performance.now()
const scale = 10**precision;
const letters = 'abcdefghijklmnopqrstuvwxyz';
const bbox = bounds.map(coord => Math.round(coord*scale));
const originX = bbox[0];
const originY = bbox[1];
const width2 = bbox[2]-bbox[0];
const height2 = bbox[3]-bbox[1];
var ctx = createContext(width2, height2)
for (let i=0;i<geom.length;i++){
ctx.beginPath();
ctx.fillStyle = "rgba(255, 0, 0, 1)";
ctx.moveTo(Math.round(geom[i][0][0]*scale)-originX,Math.round(geom[i][0][1]*scale)-originY);
for (let n=1; n<geom[i].length;n++){
ctx.lineTo(Math.round(geom[i][n][0]*scale)-originX,Math.round(geom[i][n][1]*scale)-originY);
}
ctx.fill()
};
var canvasData = ctx.getImageData(0, 0, width2, height2);
var returnArray = [];
const pixels = {
check: predicate === 'outside'?
(x,y,n) => {
var index = (x + y * width2) * 4;
if (canvasData.data[index]!==255) returnArray.push({coords:[(x+originX)/scale,(y+originY)/scale], letter:letters[n%26]})
} : (x,y,n) => {
var index = (x + y * width2) * 4;
if (canvasData.data[index]===255) returnArray.push({coords:[(x+originX)/scale,(y+originY)/scale], letter:letters[n%26]})
}
}
while (returnArray.length < count){
pixels.check(Math.floor(Math.random()*width2),Math.floor(Math.random()*height2), returnArray.length)
};
console.log(`Raster method completed in ${Math.round(performance.now() - t0)}ms`)
return returnArray;
}