2017-06-26 3 views
3

キャンバスにランダムな円を作成したいが、制限がある。すなわち、いずれの円も交差してはならない。私はこれまで、円が交差しているかどうかを確認するためのチェックを行い、そうであれば新しいものを生成します。ここに私の推論は、コードと一緒です:こっち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ループではプログラムが無期限にスタックしているように見えますが、その理由を見つけることができません。

[注記]:大きなキャンバスに小さな半径のサークルがあります。これは、サークルを埋めるための十分な画面がない場合は問題にはならないことを意味します。

ご協力いただければ幸いです!

+0

それがつかれば、おそらく無作為にサーフェスが生成され、交差していない円を追加することは不可能になります。失敗カウンターを追加するだけで、連続した円があまりにも多く生成された場合は、アルゴリズムを中止してください。 'm'の' n'サークルだけを設定でき、あなたは行くのが良いというメッセージを表示してください。 –

+0

直接的な解決策ではありませんが、別のアプローチのアイデア:キャンバスをグリッドに分割する方法は、20×20の細胞で、それぞれが*バクテリア*を収容するのに十分な大きさにして、ある確率で、*バクテリアを作る*。確率は、セルの数および「量RBC」から計算することができる。次に、* bacterium *を作成する場合は、セル内の位置*をランダム化して、セルをあまり明確にしないようにします。この方法では、ループは1つだけ必要です。私は今、アガリオのラウンドを演奏しているように感じています... – domsson

+0

@ M.Prokhorovは円がたくさんあると意味がありますが、ただ一つの円を描くだけでループの中に詰まってしまいます。 – ItsTheSebbe

答えて

0

私はあなたがwhileループの中で立ち往生しているとは思わないが、forループのカウンタを内部ループのカウンタj=0;をリセットするので、forループは終了しないだろう。

一部の印刷物では、どこが詰まっているかを確認する必要があります。また、プリントアウト(またはデバッグ)して、どの条件が期待通りでないのか、内容が何であるかを確認するのに役立ちます。

2

私はちょうど問題の解決策を見つけました。つまり、whileループでは、円のサイズを独自の位置と比較したので、距離は常に0になります。whileループではオペランド(& & i!= j)を追加しました。うまく動作するように。みんなありがとう!

+1

Persixtyと同じ回答が –

+0

@CarlosHeubergerです。私が提出をクリックすると、OPの回答がポップアップしました。注:実際に比較を行うより効率的な方法があります。このアプローチでは、AとB、BとAを比較して、基本的に努力を2倍にします。 – Persixty

2

は、私はあなたが以下のように内側のループを実行する必要があると思う:

for(int j=0;j<amountRBC;j++) { 
    if(j==i){ 
     continue; 
    } 

jが、それは、その円は自身と交差見つける再生し、jをリセットしますiに等しいとき、それは立っています。

関連する問題