• 締切済み

excelの乱数を用いて円が重ならない座標を選び出

excelの乱数を用いて円が重ならない座標を選び出す方法 2次元平面(0<x<100,0<y<100)に同じ半径rの円を重ならないように配置したいのですが、困ってます。 考えとしては 1.まず1個の円の中心座標を決める(R1(x1,y1)とする) 2.2個目の円を、1個目と重ならないよう配置できる中心座標R2(x2,y2)を乱数で決める。 ((x1-x2)^2+(y1-y2)^2>4r^2) 3.3個目の円を、1個目と2個目と重ならないように配置できる中心座標R3(x3,y3)を決める。 ((x1-x3)^2+(y1-y3)^2>4r^2かつ(x2-x3)^2+(y2-y3)^2>4r^2) これを繰り返す。 このような座標をexcelの乱数機能を用いて出すことは可能でしょうか? 皆様のお力をお貸しください。

みんなの回答

  • SI299792
  • ベストアンサー率47% (788/1646)
回答No.7

長いこと忘れていました。新しいプログラムを上げたので、確認して下さい。

  • SI299792
  • ベストアンサー率47% (788/1646)
回答No.6

>いくつか点が重なってしまいました。 私の予想では、スペックの問題で、描画が完了する前に次の処理に進んでしまうのだと思います。描画が完了するまで停止するようにプログラムを直せば解決すると思うのですが、他に原因があるかもしれません。 どのようなパラメータを入れて、どう重なったのか書いていただけますか。できれば重なった画像または実行結果をどこかにあげて下さい。 >0<x<1000,0<y<1000 画面上にに画像を描いて、重なるかどうか見ています。1000もPicel がありません。仮想画面が使えればいいのですが、やり方が判りません。 1/2にして、 500× 500に描くことになります。 ColorIndexで色を付けているので、最大個数は54です。 もっとできたほうがいいですが。

  • SI299792
  • ベストアンサー率47% (788/1646)
回答No.5

作ってみました。 半径が書いてなかったので、半径と個数を入力できるようにしました。 乱数でX座標・Y座標・半径を決めて、重ならなかったら描画し、重なったらやり直しています。 問題は、円が増えると時間がかかることと、無限ループになる可能性があることです。 失敗回数を設けました。失敗回数を100 にしておけば、100 回失敗すればもう描ける所は無いと判断し、終了します。最初からスベースを探して、そこに円を書けるようなロジックを考えれば、もっと早くたくさん書けると思うのですが。 https://box.yahoo.co.jp/guest/viewer?sid=box-l-bahport3hkq3a2qccdcvb63m3e-1001&uniqid=3bee3148-3e73-499f-b5a7-95c9aa999e82&viewtype=detail なお、OKWAVEは勝手に回答を改ざんします。上記リンクを消され、この回答が意味のないものになるかもしれません。

pareparemomo
質問者

補足

早速目当てのものを作っていただきありがとうございます。 とても感謝します。また、いくつか質問があります。 1.実際にダウンロードして実行してみたのですが、どうやらいくつか点が重なってしまいました。これはどうすれば直せるでしょう?excelの開発タブでプログラムを見たのですが、直す箇所が分かりません。 2.x,yの範囲を0<x<1000,0<y<1000にするにはどうすればよいでしょうか。 どうか、ご回答よろしくお願いします。

回答No.4

【お詫び】補足は撤回。先の回答でOK。多分・・・。

回答No.3

【補足】空チェックの考えに誤りあり。 4隅の円が囲まれていても真ん中が空いていることもある。この問題も解決する必要があります。

  • aokii
  • ベストアンサー率23% (5210/22063)
回答No.2

誤差範囲(計算ステップ幅)を規定しておいたほうがいいと思います。

回答No.1

Q、このような座標をexcelの乱数機能を用いて出すことは可能でしょうか? A、可能だと思いますよ。 1、まず、1個の円の中心座標《R1(x1,y1)》を決める。   2次元平面(0<x<100,0<y<100)内に収まるという前提。 2、1個目の中心座標を記録する。   x1,y1 3、2個目の中心座標を乱数で発生させる。 4、x1,y1と重ならないかどうかをチェックする関数をコールする。   当然に2次元平面(0<x<100,0<y<100)内に収まるかどうかのチェックが先。 5、OKであれば、x2,y2を記録する。   x1,y1;x2,y2←文字列にアペンドして記録。 6、Noであれば、更に乱数で発生させる。 7、3個目も乱数にて発生させる。 8、x1,y1;x2,y2から一個づつ座標を取り出しチェックする関数をコールする。 さて、問題は、《もう、配置する余白がない》の判定をどうするのか?まあ、一番単純なやり方は、全ての既存の円に隣接して配置できる円が存在するのかをチェックすることですね。グルーッと360度チェック座標を移動させつつ仮想円を描いて、その範囲内に既存の座標があるかないかをチェック。かなりの力技ですが、特別なアルゴリズムなど不要で誰でも書けるコードでしょう。 70の爺は、とてもじゃないが挑む気力も体力もない。若い質問者なら出来るでしょう。頑張って下さい。

関連するQ&A