Одним из решений является рассмотрение точки в полярных координатах.Произведите рандомизацию угла, а затем рандомизируйте расстояние от центра:
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;