我想用自动生成创建一个点云。我对此没有问题,我使用随机函数来创建随机坐标。
// 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);
}
,但是,我想避免点太近。我想在数组中推动所有要点,每次添加一个点,我都会将此与数组中的所有其他点进行比较,以检查它们之间的距离,但我不是表演的好主意。
您有一个想法吗?您是否有一些脚本或其他脚本来帮助我?
预先感谢
当您使用 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>
(第一个数字是您要放置的积分数,第二个是您要保持在它们之间的最小距离,而末尾出现的点是要放置所有的尝试的数量点(
这是短而缓慢的,既是使用帆布和imagedata。使用简单的打字和自己的圆形图形实现,它的速度可能更快,更长。