キャンバスにランダムな円を作成したいが、制限がある。すなわち、いずれの円も交差してはならない。私はこれまで、円が交差しているかどうかを確認するためのチェックを行い、そうであれば新しいものを生成します。ここに私の推論は、コードと一緒です:こっちJava:交差していない円を無作為に生成する(ループ中に固執する)
for(int i=0;i<amountRBC;i++)
{
xPosRBC[i]=random.nextInt(xSize);
yPosRBC[i]=random.nextInt(ySize);
}
、私はすべてのRBC(amountRBCの合計は、デモの目的のために、してみましょうため(YSIZEによってXSIZEのキャンバス内)ランダムxとyの位置を生成します例えば5)。これらのxとyの位置は、配列xPosRBC []とyPosRBC []にそれぞれ格納されます。 xpos1-xpos2 | |)^ 2 +(| ypos1-ypos2 |その後
for(int i=0;i<amountRBC;i++)
{
for(int j=0;j<amountRBC;j++)
{
while(Math.sqrt(Math.pow(Math.abs(xPosRBC[j]-xPosRBC[i]),2)+Math.pow(Math.abs(yPosRBC[j]-yPosRBC[i]), 2))<(2*rbcRadius))
{
xPosRBC[i]=random.nextInt(xSize); //random starting position of bacterium
yPosRBC[i]=random.nextInt(ySize);
j=0;
}
}
}
私は、彼らが2未満*円の半径離れて(このSQRTを使用して((あるかどうかをすべての点を確認してください)^ 2)数式)であれば、新しい位置が生成され、for-loopの「チェック」がリセットされます(j = 0)。そこにあるすべての円に対してこのプロセスを繰り返します(i = 0からamountRBCまで)。私の推論では、これは5つの無作為に配置された円で終わるはずであり、すべてが少なくとも2 *半径だけ離れているので、交差するべきではありません。 しかし、このwhileループではプログラムが無期限にスタックしているように見えますが、その理由を見つけることができません。
[注記]:大きなキャンバスに小さな半径のサークルがあります。これは、サークルを埋めるための十分な画面がない場合は問題にはならないことを意味します。
ご協力いただければ幸いです!
それがつかれば、おそらく無作為にサーフェスが生成され、交差していない円を追加することは不可能になります。失敗カウンターを追加するだけで、連続した円があまりにも多く生成された場合は、アルゴリズムを中止してください。 'm'の' n'サークルだけを設定でき、あなたは行くのが良いというメッセージを表示してください。 –
直接的な解決策ではありませんが、別のアプローチのアイデア:キャンバスをグリッドに分割する方法は、20×20の細胞で、それぞれが*バクテリア*を収容するのに十分な大きさにして、ある確率で、*バクテリアを作る*。確率は、セルの数および「量RBC」から計算することができる。次に、* bacterium *を作成する場合は、セル内の位置*をランダム化して、セルをあまり明確にしないようにします。この方法では、ループは1つだけ必要です。私は今、アガリオのラウンドを演奏しているように感じています... – domsson
@ M.Prokhorovは円がたくさんあると意味がありますが、ただ一つの円を描くだけでループの中に詰まってしまいます。 – ItsTheSebbe