最小包含円を求めるプログラムの最適解とは?

このQ&Aのポイント
  • 最小包含円を求めるプログラムを作成していますが、数学的な厳密解ではなくあいまいな最適解を求めたいです。
  • 現在は最大距離になる2点を直径とし、その内側に点群がすべてある場合に採用しています。
  • さらに、外側に点群がある場合は3点で球を定義し、再び内側の点群がすべてあるか確認します。
回答を見る
  • ベストアンサー

最小包含円

空間上に適当に散りばめられた点群を囲む、最小の球(中心と半径)を求めるプログラムを作っています。 用途はCADですので、数学的な厳密解ではなく、トレランスを与えたあいまいな最適解を求めたいのですが、 もっとも低コストな求め方、エレガントな解法、この分野に強い方、教えて頂けないでしょうか。 今現在は、こんな感じで誤魔化しています。 (1) 最大距離になる2点を直径として、その内側に他の点群がすべてあったらそれを採用。 (2) (1)の外側に点群があったら、(1)の中心点から一番遠い点を使い、 3点による球で、再び内側に点群がすべてあるか確認。 (3) (2)の球の外側に点群があったら、再び中心から最大距離の1点と、 (2)の3点のうちの、上記の点との最近点とすりかえて、球を定義、再び全点確認。 (4) (3)を繰り返す。 とりあえず稼動確認したところ、それなりに良さそうな球が求まったのですが、いまいち納得できません。 よろしくお願いします。

  • selju
  • お礼率35% (7/20)

質問者が選んだベストアンサー

  • ベストアンサー
  • ametsuchi
  • ベストアンサー率31% (81/257)
回答No.3

3度目です。以下のSiteをご覧下さい。非常にシンプルで効果的なアルゴリムです。私の案は撤回します。 1)BoundingBoxを作る(=x,y,z最大最小値) 2)BoundingBoxに内接する球を求め、これを初期球とする。 3)全点なめ、 3a)iー点がこの球に入っていたらOK。 3b)iー点がこの球に入っていなかったら、このi-点を通り、反対側が元の球を通るように、新球を定める。(容易) だけで完成です。

参考URL:
http://www.3dspot.com/rtnews/rtnews7b.html

その他の回答 (4)

  • ametsuchi
  • ベストアンサー率31% (81/257)
回答No.5

seianさんの指摘される通り、「Boxの一番長い辺の1/2を半径とする球でいい」です。失礼しました。 書いた後、コンビニで買い物している最中に「内接」という表現が数学的に正確でないことに気が付いたのですが、「まあ、分かってくれるだろう」と妥協してしまいました。

selju
質問者

お礼

返事おそくなって申し訳ございません。 ametsuchiさん、seianさん、早速の回答ありがとうございます。 おかげさまで、誤魔化していた部分が、ようやく確かな答えとして結果がでるようになりました。 CADを経験されている方のアドバイスがあると、非常に助かります。 まだ幾つか誤魔化してCADをカスタマイズした部分があるので、また、よろしくお願いします。 ありがとうございました。

  • seian
  • ベストアンサー率50% (16/32)
回答No.4

ametsuchiさん > 2)BoundingBoxに内接する球を求め、これを初期球とする。 細かいようですがBoundingBoxは一般には直方体になるわけで、 初期球としてはこのBoxに内接する球ではなく、このBoxの中心を中心とし、 このBoxの一番長い辺の1/2を半径とする球でいいようにも思えるのですが 如何なものでしょう。

  • ametsuchi
  • ベストアンサー率31% (81/257)
回答No.2

先程の文章、「絞る」で切れてました。要は、計算時間を食わない範囲で、球の半径を「小さくする」ことも考えるべきではないかということです。 私も職業としてCADには20年程関わっていますが、生憎BoundingBoxしか使っていません。CGの世界では計算時間のかかるRayTracingで、No.1のような「BoundingSphere」が提案され、高速化に寄与しています。 下記のアルゴリズムを追うのがメンドイので、下記アルゴリズムとは別に自分なりの方針を掲げると、 1)BoundingBox作成 2)BoundingBoxに外接する、BoundingSphere作成(これが上限) 3)BoundingBoxに内接する、Sphere作成(これが下限) 4)半径だけでなく、中心も動かして、反復計算させる。(上限・下限で挟み撃ち)

  • ametsuchi
  • ベストアンサー率31% (81/257)
回答No.1

大変失礼ですが、あまりエレガントな解法とは思えません。なぜなら、 1)「最大距離になる2点」を探すというのは、1/2*n^2回に比例する比較が必要。 2)最小の球とは限らないのではないか。常に大きくしているだけ。「絞る」 下記にBoundingSphereに関するアルゴリズムがあります。中は見てません。

参考URL:
http://www.acm.org/tog/resources/RTNews/html/rtnews8b.html

関連するQ&A

  • 続 最小包含円

    たびたびすみません。 まだ、問題が発生しそうなので、もう一度お願いします。 >私も、初期球に関しては、ちょっとおかしいと感じ、 >プログラム上は、旧アルゴリズム(総当たり最長距離)で、今も動かしています。 >実のところ、最適な向き(最小)のBoxの求め方もわからなかったので、そのままにしてしまいました。 >私の場合、まずCAD上で描いて試しているのですが、 >>3b)iー点がこの球に入っていなかったら、このi-点を通り、反対側が元の球を通るように、新球を定める。(容易) >これを繰り返していくと、予定より大きな球になる場合が発生しています。 >元の球に接するように作ると、最初の2点が球の内側に入ってしまうため、1点しか通らない球で定まってしまいます。 >2点球で定まらない場合は、確実に3点球で定まるべきだと思うのですが、何か勘違いしているのでしょうか。

  • 最小包含円(補足)

    質問ではないのですが・・・・。 昨日seljuさんの質問に対して書いたことがちょっと正確でないことに 気が付いたのですが、今朝見たらもう既に締め切られた後でしたので・・・。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=88669 seljuさんの質問(に対するametsuchiさんの回答)に対して、 「初期球としてはこのBoxに内接する球ではなく、このBoxの中心を中心とし、 このBoxの一番長い辺の1/2を半径とする球でいいようにも思えるのですが・・・」 と書いたのですが、場合によってこの方法では最小にならないことに気が付きました。 (例えば、最長辺の両端の面を構成した2点が最長辺のうちの1つの辺の両端点で 他の点はすべてBoxの中心付近にある場合など) 結局、 「Boxの最長辺の両端の面を構成した(つまり両端面上にある)2点を直径とする球を 初期球とする」 に変更すればよいように思えます。この場合たまたま一方もしくは両端面上に複数の 点がのっている場合は、各面ともそのうちの任意の1点を選べばいいでしょう。 私はCADなどやっとことがない方なので、どうも3次元のことを考えるのは あまり自信が持てませんので、どなたかコメントを頂ければ幸いです。

  • 答えだけでもいいので、お願いします。

    答えだけでもいいので、お願いします。 「二重球殻の電場と電位」 外側にある半径aの球殻に総量Qの電荷が一様に分布しています。 内側に半径bの同心球殻(a>b)があり、総量-Qの電荷が一様に分布しています。 1.球殻の中心Oから距離rの点での電場Eを求めてください。 rがふたつの球殻の外側(r>a)の場合も、外側と内側の球殻の間(b<r<a)の場合も、二つの球殻の内側(r<b)の場合も求めてく ださい。 2.電場を積分して、球殻の中心Oから距離rの点での電位φを求めてください。 rがふたつの球殻の外側(r>a)の場合も、外側と内側の球殻の間(b<r<a)の場合も、二つの球殻の内側(r<b)の場合も求めて ください。 無限遠点の中心の電位を0とします。 多くてすみません。 一部でもいいのでお願いします。

  • コンデンサ内の電場の求め方

    同心球状のコンデンサをその中心を通る平面で2つに切断したものがある(半球の球殻)そこ(外側電極)に+Qの正電荷を与え、内側電極(外側球殻と同心の球)は接地してある。このときコンデンサ内(誘電率ε)の電場は?(球の中心からの距離rを用いる) というのが問題です。 考えたのは 1、ガウスの法則を用いると内側が接地してあるので電場0?? 2、内側電極は接地してあっても外の+Qに対応して-Qの電荷を持ちガウスの法則を使って電場を求められる。 3、外側電極に対してガウスの法則を用いる。これだと求められなかった・・・

  • 電磁気における殻の基本的な言葉の意味

    電磁気を勉強しています。 ごく基本的な質問なのですが、問題文中で、 ・「導体球殻」とあったら中が空洞で厚さのある球で、内径というのが空洞の中心から内側の導体に触れるまでの距離、外形が空洞の中心から外側の導体の表面までの距離。 ・「同心球殻コンデンサー」とあったら導体球があって、その回りが空洞でその後、殻のような薄い導体で覆われている、内径というのが導体球の中心から導体球の表面まで、外径というのが導体球の中心から空洞を通って薄い導体のような殻の表面までの距離。 のような理解でいいのでしょうか? 殻という表現が、あまりピンと来ずに戸惑っていたのですが…。 よろしくお願いします。

  • 真空中で半径が無視できる小さい導体球に電荷を与えたところ、球の中心から

    真空中で半径が無視できる小さい導体球に電荷を与えたところ、球の中心から距離2mの点Pの電界の大きさが20(kV/m)であった。 導体球に与えた電荷(C)と点Pの電位Vを求めよ。 解:8.9×10^(-6)[C] 40[kV] さっぱり分からないので教えてください。お願いします。

  • 同心球導体球の接地について

    同心球導体球の接地について、過去に質問されていなかったのでおねがいします。 同心球導体球において、外側の球に電荷Qを与え、内側の球を接地した場合、電界はどのようになるのでしょうか? (内側の球の半径a、外側の球の内径b、外径cです。) 回答は、 a<r<b、c<rの場合についてお願いします。

  • 基礎電磁気学の問題が分かりません

    真空中に同心である中空状の球の完全導体が2個ある。内側の球Aの内径は2a[m]外径2b[m]、外側の球Bの内径は2c[m]外径は2d[m]。内側の球Aに正の電荷Q[c]の電荷を与え負の電荷-Q[c]の電荷を与え、球間の静電容量を考える。 1中心から距離r[m]離れた点での電界E(r)を求める。 ガウスの定理を用いるために考える閉曲面の形状とその形状を考える理由を述べよ。またr<a、a<r<b、b<r<c、c<r<d、d<rの時の各電界を導け。 2内側の球と外側の球との電位差Vを導き出せ。さらに電位の高い方の球を答えよ。 3球間の静電容量をCとした時この静電容量を導き出せ。

  • 電磁気学

    半径a,b(a<b)の同心導体球殻AおよびBがある。A球殻内は誘電率ε1の誘電体でAB間は誘電率ε2の誘電体で満たされ、B球殻の外側は真空(誘電率ε0)である。球の中心に点電荷+Q1をおきBに電荷+Q2を与えたのちABを細い導線でつないだ際の 球の中心からの距離をrとして (1)A球殻内の電束密度Daおよび電界Ea (2)AB間の電束密度Dabおよび電界Eab (3)B球殻外における電束密度Dbおよび電界Eb (4)Aの電位Va それぞれの解法につきまして、ご教示賜りたく 宜しくお願い申し上げます。

  • 同心球殻状の導体から作られるコンデンサー 電場 電位差 電気容量

    半径aと半径b(a<b)の同心球殻状の導体から作られるコンデンサーを考える。 外側球殻が電荷Qを帯び、内側球殻が電荷-Qを帯びているとし、以下の問いに答えよ。 (1)外側球殻と内側球殻にはさまれた領域の電場を求めよ。 (2)外側球殻と内側球殻の電位差Vを求めよ。 (3)このコンデンサーの電気容量を求めよ。 という問題が解けません。 特に、同心球殻状の導体から作られるコンデンサーの考え方がわかりません。 どなたか解いていただけませんか。 よろしくお願いします。