如何在戒指中获得随机点?就像两个同心圆之间的空间。我自己用代码制作圆圈所以我知道半径等。这是我正在进行的一个游戏,我将敌人与波浪间隔开,或者与场地中心隔开不同的环。我认为唯一的方法是检查点或某事的某种循环。 AS3
答案 0 :(得分:4)
除了fuzzyTew之外,另一个解决方案是创建均匀的密度分布,而不必使用循环+拒绝(对于窄环来说是昂贵的),就是使用累积分布函数的半径知识。 (环作为角度的函数均匀分布,因此您可以使用均匀的角度分布。)
内半径r 1 且外半径r 2 的环的CDF与r 2 - r 1成正比 2 (这是与r dr成比例的项的积分,它是半径为r的环的概率密度和无穷小的厚度dr)。 CDF(r = r 1 )= 0,CDF(r = r 2 )= 1,因此CDF(r)=(r 2 - r 1 2 )/(r 2 2 - r 1 < SUP> 2 )。
那又怎样?那么,现在我们只需要选择在0和1之间均匀分布的CDF值q,并反转CDF以获得半径r:
q = (r^2 - r1^2)/(r2^2 - r1^2)
r = sqrt(q*(r2^2 - r1^2) + r1^2)
所以对于一个实现(为语法错误道歉,我不熟悉w / AS3与Javascript)
var angle : Number = Math.random() * Math.PI * 2;
var q : Number = Math.random();
var radius : Number = Math.sqrt(q*(r2*r2-r1*r1) + r1*r1);
var x : Number = Math.cos( angle ) * radius;
var y : Number = Math.sin( angle ) * radius;
答案 1 :(得分:2)
一种解决方案是考虑极坐标中的点。随机化角度,然后随机化距离中心的距离:
var angle : Number = Math.random() * Math.PI * 2;
var radius : Number = Math.random() * (outerRadius - innerRadius) + innerRadius;
var x : Number = Math.cos( angle ) * radius;
var y : Number = Math.sin( angle ) * radius;
然而,上述极性溶液将为选择朝向内环的点提供增加的密度。如果你需要一个精确均匀的分布,一个解决方案是随机选择环周围方形的点,丢弃不在环中的点:
var x : Number;
var y : Number;
var radiusSquared : Number;
var outerRadiusSquared : Number = outerRadius * outerRadius;
var innerRadiusSquared : Number = innerRadius * innerRadius;
do {
x = Math.random() * outerRadius * 2 - outerRadius;
y = Math.random() * outerRadius * 2 - outerRadius;
radiusSquared = x * x + y * y;
} while ( radiusSquared > outerRadiusSquared || radiusSquared < innerRadiusSquared );
或者,可以对极性溶液进行加权以得到均匀分布。我认为这是怎么做的,但我不确定:
var angle : Number = Math.random() * Math.PI * 2;
var outerRadiusSquared : Number = outerRadius * outerRadius;
var innerRadiusSquared : Number = innerRadius * innerRadius;
var radius : Number = Math.sqrt( outerRadiusSquared + Math.random() * (innerRadiusSquared - outerRadiusSquared) )
var x : Number = Math.cos( angle ) * radius;
var y : Number = Math.sin( angle ) * radius;