AS3 Получить случайную точку в ринге - PullRequest
0 голосов
/ 09 января 2011

Как я могу получить случайную точку внутри кольца? Мол, пространство между двумя концентрическими кругами. Я сам делаю круги в коде, чтобы знать радиус и т. Д. Это игра, над которой я работаю, когда я разносю врагов волнами или разными кольцами, разнесенными от центра поля. Я думал, что единственный способ - это какой-то цикл, который проверяет точки или что-то в этом роде. AS3

Ответы [ 2 ]

4 голосов
/ 09 января 2011

Другое решение, помимо fuzzyTew для создания равномерного распределения плотности без необходимости петли + отбраковки (что дорого для узких колец), заключается в использовании знаний о кумулятивной функции распределения по радиусу.(Кольца равномерно распределены как функция угла, поэтому вы можете просто использовать равномерное распределение угла.)

CDF для кольца с внутренним радиусом r 1 и внешним радиусом r 2 пропорционально 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 2 ).

И что?Что ж, теперь нам просто нужно выбрать значение q CDF, равномерно распределенное между 0 и 1, и инвертировать CDF, чтобы получить радиус r:

q = (r^2 - r1^2)/(r2^2 - r1^2)
r = sqrt(q*(r2^2 - r1^2) + r1^2)

Итак, для реализации (извинения за синтаксические ошибки, я 'я не знаком с 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;
2 голосов
/ 09 января 2011

Одним из решений является рассмотрение точки в полярных координатах.Произведите рандомизацию угла, а затем рандомизируйте расстояние от центра:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...