如何在半径为圆内获取随机的x和y坐标?

3
我想使用rand()函数两次获取0到20000之间的随机数来获得随机的x和y坐标。虽然这样可以工作,但是它会给我一个正方形内的随机坐标。
我真正需要的是圆形内的坐标。如何将我的随机x/y限制在半径为20000的圆内?
我尝试了一些在线示例代码,但大多数都是用于计算球体并找到球体上两点之间的距离,而我不够了解如何将其应用于我只需在圆(平面)半径内选择随机坐标的用法。
非常感谢任何帮助。

你是假设一个半径为10000,中心在(10000,10000)的圆吗?20000半径与其余限制不符,除非你只从第一象限采样。 - apokryfos
是的。-20,000到20,000,圆的中心为0。 - Rachel_1988
1
可能是在一个位置周围生成随机坐标的重复问题。 - matiaslauriti
如果欧几里得距离(0,0)和(x,y)小于半径r(d = sqrt(x^2 + y^2)),则任何点(x,y)都包含在以中心点(0,0)为圆心、半径为r的圆内。可以对(x,y)进行采样,直到找到一个符合条件的点。 - apokryfos
3个回答

3
为了在半径为R的圆内生成均匀分布的随机点,您可以使用下面的方法:链接
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
是的,我错过了它...实际上在我的盲目判断中完全跳过了它。 - 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');
}

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);

1
你可以获取一个在-20000到20000之间的随机数x,并使用勾股定理得出正值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
我看不出任何一个生成的点会在圆内部。它们似乎都在周长上,甚至在那里也没有均匀分布。 - andand
@andand 当然,您是完全正确的。就像我在原始答案中提到的那样,我对于分布不确定,但除了rand()的奇怪行为之外,我想不出为什么它不应该均匀。也许有些数学问题我没有看到…… - jeroen
更新在X值的极端位置上非均匀地聚集了点,并且越靠近X=0,趋向于变得更加稀疏。这是因为虽然 rand() 是均匀的,但与给定 X 值间隔相关联的区域面积在可能的 X 值范围内并不是恒定的。这倾向于在极端位置压缩 Y 值,并在中心区域更加分散它们。 - andand
@andand 有道理,最好使用随机距离和随机角度。那我最好点赞更好的解决方案 :-) - jeroen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接