一个范围内的随机数,但在Javascript中排除一些

时间:2018-02-04 16:58:26

标签: javascript coordinates intervals points

我想用自动生成创建一个点云。我对此没有任何问题,我使用随机函数来创建随机坐标。

// I used this function twice, for X coordinate and for Y coordinate
// min and max represent width and height intervals
function getRandom(min,max){
    return Math.floor(Math.random()*(max-min+1)+min);
}

但是,我想避免过分接近。我想把所有的点都推到一个数组中,每次我添加一个点我都会将这个点与我的数组中的所有其他点进行比较,以检查它们之间的距离,但我并不认为这是一个好主意。

你有想法这样做吗?你有一些脚本或其他资源来帮助我吗?

提前致谢,

1 个答案:

答案 0 :(得分:1)

当你使用Math.floor时,我会假设它们是像素,也许是体素坐标。在这种情况下,您还可以将整个矩形/砖块存储在一个数组中,只需通过在它们周围绘制一个圆盘/球体来“禁用”已选择位置的附近区域。

带帆布的样机:

function magic(){
    var cnv=document.getElementById("cnv");
    var ctx=cnv.getContext("2d");
    ctx.clearRect(0,0,cnv.width,cnv.height);
    ctx.fillStyle="#D0D0D0";
    ctx.strokeStyle="#000000";
    var numdots=parseInt(document.getElementById("numdots").value);
    var mindist=parseInt(document.getElementById("mindist").value);
    var tries=0;
    for(var i=0;i<numdots;i++){
        var retry=true;
        while(retry){
            tries++;
            var x=Math.random()*cnv.width;
            var y=Math.random()*cnv.height;
            retry=ctx.getImageData(x,y,1,1).data[0]!==0;
        }
        ctx.beginPath();
        ctx.arc(x,y,mindist-2,0,Math.PI*2);
        ctx.fill();
        ctx.beginPath();
        ctx.arc(x,y,1,0,Math.PI*2);
        ctx.stroke();
    }
    document.getElementById("log").innerHTML=tries;
}
magic();
<input type="number" id="numdots" value="100">
<input type="number" id="mindist" value="20">
<button onclick="magic()">Do</button>
<span id="log"></span><br>
<canvas id="cnv" width="300" height="300"></canvas>

(第一个数字是你想要放置的点数,第二个数字是你想要保持的最小距离,最后一个数字是你想要放置所有点数的尝试次数。分)

这个是短而慢的,因为使用canvas和imagedata。使用简单的typedarray和circle drawing的自己实现,它可以更快更长。