2016-06-21 2 views
2

Я решил использовать rand(), чтобы получить число между 0 и 20000 дважды, чтобы получить случайную координату x и y. Это работает, но это дает мне случайные координаты изнутри квадрата.Как получить случайную координату x и y внутри радиуса окружности?

То, что мне действительно нужно, это координаты в пределах круга. Как я могу ограничить свой случайный x/y в пределах круга, который имеет радиус 20 000?

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

Любая помощь была бы принята с благодарностью.

+0

Принимаете ли вы круг радиусом 10000 с центром в точке (10000 10000)? Радиус 20000 не имеет смысла с остальными ограничениями, если только вы не выбираете только первый квартал. – apokryfos

+0

Да. От 20 000 до 20 000 с центром окружности 0 –

+1

Возможный дубликат [Генерация случайных координат вокруг местоположения] (http://stackoverflow.com/questions/7620550/generate-random-coordinates-around-a-location) – matiaslauriti

ответ

1

Вы можете получить случайное x между -20000 и 20000 и использовать закон Пифагора, чтобы получить положительный y стоимость. Затем вы делаете случайный 0 или 1, чтобы сделать это положительное или отрицательное значение.

Пример:

$r = 20000; 
$x = rand(-$r, $r); 
$y = rand(0, 1) ? -sqrt(pow($r, 2) - pow($x, 2)) : sqrt(pow($r, 2) - pow($x, 2)); 
var_dump($x, $y); 

Я не уверен, как числа распределены точно, но это звучит о праве.

Редактировать: Спасибо @andand, конечно, это вычисляет точки только на круге. Для того, чтобы получить очки в любом месте в круге, рассчитанное y значение является максимальным:

$r = 20000; 
$x = rand(-$r, $r); 
$yMax = sqrt(pow($r, 2) - pow($x, 2)); 
$y = rand(-$yMax, $yMax); 
var_dump($x, $y); 
+1

Это прекрасно работает. Спасибо огромное! –

+1

Я не вижу, как любая из созданных точек будет внутренностью круга. Они кажутся всем по периметру и равномерно распределены даже там. – andand

+0

@andand Вы, конечно, совершенно правы. Как я уже упоминал в своем первоначальном ответе, я не уверен в распределении, но это должно быть хорошо, кроме странного поведения «rand()». Я не могу думать о какой-либо причине, почему он не должен быть однородным. Возможно, некоторые математики я не вижу ... – jeroen

3

Для создания равномерной распределенных случайных точек внутри окружности радиуса R, вы можете использовать next approach:

a = Random //range 0..1 
b = Random 
theta = b * 2 * Pi 
rr = R * Sqrt(a) 
x = rr * Cos(theta) 
y = rr * Sin(theta) 
+1

@andand Вероятно, вы пропустили 'sqrt' радиальной части. Он обеспечивает единообразие. Я добавил ссылку на страницу mathworld. – MBo

+0

Да, я пропустил это ... проскользнул прямо над ним в моей слепой спешке, чтобы судить по сути. – andand

2

Обобщенная функция возвращает случайную точку внутри круга:

/** 
* @param $radius integer 
* @return array['x', 'y'] 
*/ 
function getPoint($radius) 
{ 
    $i = mt_rand()/mt_getrandmax(); 
    $j = mt_rand()/mt_getrandmax(); 

    $w = $radius * sqrt($i); 
    $theta = (2 * pi() * $j); 
    $x = $radius + ($w * cos($theta)); 
    $y = $radius + ($w * sin($theta)); 

    return compact('x', 'y'); 
} 

реализации Bonus в GD:

$radius = 250; 

$image = imagecreatetruecolor((2 * $radius) + 1, (2 * $radius) + 1); 
$white = imagecolorallocate($image, 255, 255, 255); 
$black = imagecolorallocate($image, 0, 0, 0); 

imagefill($image, 0, 0, $white); 
imageellipse($image, $radius, $radius, $radius * 2, $radius * 2, $black); 

for ($a = 0; $a < 1000; $a++) 
{ 
    $point = getPoint($radius); 
    imagesetpixel($image, $point['x'], $point['y'], $black); 
} 

// Output the image. 
header("Content-type: image/png"); 
imagepng($image); 
Смежные вопросы