Функция Flex / Actionscript для вычисления случайной точки в круге - PullRequest
1 голос
/ 16 ноября 2010

Не уверен, что я здесь делаю неправильно, поэтому я искал, есть ли у кого-нибудь какие-либо мысли или предложения. Я пытаюсь создать функцию, которая возвращает случайную точку внутри круга. Следующий код дает мне случайные точки по краю круга. Есть мысли о том, что я здесь делаю не так? Спасибо!

private function getPointInCircle(tmpRadius:int):Point {
    var x:int;
    var y:int;

    var a:Number = Math.random() * 360;
    x = radius * Math.cos(a * (Math.PI / 180));
    y = radius * Math.sin(a * (Math.PI / 180));

    trace("x: " + x + "y: " + y);
    return new Point(x, y);
}

Ответы [ 3 ]

4 голосов
/ 16 ноября 2010

Вам нужны две степени свободы, одна - это угол, который вы имели, а другая - расстояние от центра:

var d:Number = Math.random()*radius
var a:Number = Math.random()*2*Math.PI;
x = d*Math.cos(a);
y = d*Math.sin(a);

Если ваш круг центрирован по (x0,y0), а нев (0,0) вы изменяете так:

x = x0 + d*Math.cos(a);
y = y0 + d*Math.sin(a);

Общая информация: круг - это просто граница.Если вы хотите сослаться на область, ограниченную границей, вы скажете диск .

1 голос
/ 16 ноября 2010

Попробуйте случайный угол и случайный радиус в круговой системе координат, затем преобразуйте в декартову. Кроме того, вы заметили, что ваш параметр tmpRadius и в вашей функции вы используете radius?

var a = Math.random() * 2 * Math.PI;
var r = Math.random() * radius;
var x = r * Math.cos(a);
var y = r * Math.sin(a);
0 голосов
/ 10 февраля 2011

Другие ответы дают своего рода случайную точку внутри круга, но они не распределены равномерно.Области вблизи центра будут иметь более высокую концентрацию точек на единицу площади, чем области вблизи края.

Чтобы получить равномерное распределение, вы можете:

(a) Найти случайную точку вквадрат оси вокруг круга.

x = (Math.random() * 2 - 1) * radius;
y = (Math.random() * 2 - 1) * radius;

Проверьте, действительно ли он находится в круге (x * x + y * y <= r * r).Повторяйте, пока не найдете правильную точку.

(b) Выполните небольшое математическое преобразование, чтобы получить надлежащим образом распределенные расстояние и угол.

uniform_random = P(dist < r) = (pi r^2) / (pi radius^2) = r^2 / radius^2

r = radius * sqrt(uniform_random)

var r = radius * sqrt(Math.random());
var theta = 2 * Math.PI * Math.random();
var x = r * Math.cos(theta);
var y = r * Math.sin(theta);
...