2016-06-21 9 views
2

ランダムなxとyの座標を得るために、rand()を使って0と20000の間の数値を2回取得すると思いました。これは動作しますが、正方形内からランダムな座標が与えられます。円の半径の内側でランダムなx座標とy座標を取得するにはどうすればよいですか?

本当に必要なのは、円内の座標です。ランダムx/yを半径20,000のサークル内に制限するにはどうすればよいですか?

私はいくつかのサンプルコードをオンラインで試しましたが、それらの大部分は球を計算し、球上の2点間の距離を見つけるように見えます。私はそれを自分の使い方に適用するのに十分知識がありません。円(平ら)半径内のランダムな座標。

ご協力いただければ幸いです。制服を生成する

+0

半径10000の円を中心に(10000,10000)としますか?あなたが第1四半期からのみサンプリングしない限り、半径の20000は残りの制限事項と意味をなさない。 – apokryfos

+0

-20,000〜20,000、円の中心は0 –

+1

[場所の周りにランダム座標を生成する]の可能な複製(http://stackoverflow.com/questions/7620550/generate-random-coordinates-around-a-location) – matiaslauriti

答えて

1

あなたは-20000〜20,000の間のランダムな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もちろん、円上の点のみを計算します。

$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

は、あなたがnext approachを使用することができ、半径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

+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'); 
} 

ボーナス実装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); 
どこサークル内の点を取得するために、計算 y値が最大であります
関連する問題