• 締切済み

続 最小包含円

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

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

みんなの回答

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

nagataさんの方法で心配なのはどの程度真の中心に近づいているのかが保証できるのかということだと思います。 例えば真の中心から s 以内であると判断できるのであれば、その時の仮の中心から一番遠い点との距離を L とすれば、仮の中心からの距離が L-2s から L の間の点について調べればいいだけの話ですので s がある程度小さければその個数はたかが知れており、解析的に解くことは十分可能だと思います。 複数の点が非常に接近して存在し、それらが上記範囲に入ってしまうような場合は扱いが面倒になるかもしれませんが処理は可能だと思います。 nagataさんが心配しておられる2点間で振動するような場合は、振動が確認された時点でこの2点が最小球を構成する最遠2点か否かを判定すればいいのではないでしょうか? そうであれば終了ですし、そうでなければ、この2点の中心を仮の中心として再出発すればいいと思われます。

selju
質問者

お礼

遅くなりましたが、皆さんおはようございます。 現実プログラムの修正で、ちょっと返事が遅くなりました。申し訳ございません。 ametsuchiさんが整理してくれたように、 >B)「2,3,4点総当たり」しない効率的な方法で、厳密解が得られないか? これを探していたのですが、未だうまい方法が見つかっていません。 >C)反復手法、それも絶対収束する方法。 これを利用する方法をこれからちょっと考えてみようと思います。 当初、必ず数点が円上、球上にくるはずだから、この方法は今回はあわないと、勝手に決め込んで試していませんでした。 ある程度、収束処理をして絞り込み、最後は総当たりでトドメ。を試そうかと思います。 ちなみに、実際のプログラムで適用している今現在の処理は、2Dのみ対応に絞って、 (1) 点群から外殻を構成する点のみに絞り込み。 (2) 総当たり処理。 これで、対応しています。点の数が少ないのでまあ良いかなという運用的回避策です。 3D球への対応は、上記のとおり、これから作り込みといったところです。

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

皆さんさん、おはようございます。 ■前置き: 先ず、例によって誤りを訂正。すいません。No.11で「「解析的な解」を求める可能性は=0か」は勿論、「2,3,4点の組み合わせ」で総当たりすれば、可能です。 ■厳密解: seianさんがNo.4で正しく整理してくれたように、 1)2点で決る場合 2)3点で決る場合 3)4点で決る場合 があります。プログラム上は、勿論、 4)0点の場合---------------->球は決らない。 5)n点が1点に縮退する場合--->この点を中心とし、半径=0の球 も考慮しないといけません。実は恥ずかしながら、一般に円の場合最大3点、球の場合、最大4点だと思いながら、具体例を想定して、seljuさんの主張する3点で納得してました。 点の数が非常に少なければ、全ての2,3,4点の組み合わせを考えてもいいのでしょう。nagataさん、No.7で折角いいアイデア出したのに、No.12で 「点A、Bが交互に最も遠い点になるとしたら、球の中心は線分ABの中点を通り、線分ABを法線に持つ平面上にあるとか」 というのは、seianさんのNo.4はおろか、前スレッドのseljuさんの元々のアイデアより後退しています。この2点では駄目だから3点法を考えたものの、私やseianさんの指摘するような問題が色々出てきたのです。 ■整理: だから、私なりに整理すると、 A)「2,3,4点総当たり方式」で厳密解を求める方法で、処理効率上問題ないか? ===>多分将来リバースエンジニアリングを考えるとNG? B)「2,3,4点総当たり」しない効率的な方法で、厳密解が得られないか? ===>seianさんが模索している、もしくはしていた。おそらくseljuさんも。 C)反復手法、それも絶対収束する方法。 ===>nagataさんの案もそのうちの一つ。 A)では面白くないし、C)なら、できるだけ収束し易いエレガントな方法が望ましい。で、何とかならんものかと考えたいのですが、今日一杯は時間が取れず、若い柔軟な頭に先ずは期待しようかなと..。

  • nagata
  • ベストアンサー率33% (10/30)
回答No.12

今晩は、nagataです。結構ウケたみたいで嬉しいです。 いろいろアイデアがうかんだので聞いてください。 まず、収束に関して大きな問題に気づいたんですが平面上に2点(1、0)(ー1、0) があってpが(0、1)にあったとして、このアルゴリズムを走らすとあんまり 良い結果が得られそうにありません。やってみてください。pのy座標は確かに 減って行くのですが、永久に0になれません。これはこのアルゴリズムの本質的、 かつ致命的な欠点のように思われます。 なのでこのアルゴリズムは捨てて次のようなことを考えています。 最も遠い点に向かって繰り返し中心を動かします。で、 このアルゴリズムを走らすと最も遠い点になる点というのは幾つかの 非常に限られた点だけだと思われます。おそらくこれが最小円を決定する 上でのクリティカルな点であると思われます。 なのでこれらの点になにか強力な解析的手法を適用するというのはどうでしょう。 例えば点A、Bが交互に最も遠い点になるとしたら、球の中心は線分ABの中点を 通り、線分ABを法線に持つ平面上にあるとか、そういうことが言えないでしょうか。 ちと厳密な話は分かりませんが、そんなことを考えています。

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

「目から1/4うろこ」です。nagataさん今晩は。シロートなんて謙遜する割に鋭いですね~。これで飯食ってる私は立つ瀬がないな~。 「1/4」にさせてもらったのは、当初(=最初のスレッド)から、挟み撃ちで、 ・球の中心(=x,y,z) ・球の半径(=r) を動かして収束させられるだろう、と判断していたためです。 しかし、 1)Newton法のように次の近似をかなりよくしないと収束が遅い。 2)次ステップのために中心と半径をどう動かしたら最適か? 3)反復法でなく、言わば「解析的な解」を求める可能性は=0か、=0であることは証明できるか? というところにひっかかっていたからです。0ではなく1/4にしたのは、中心の進む方向を「現在中心から一番遠い点の方向」と明確に提案しているからです。 dをどう決めるか、聞きたいところですね。また、収束に要する反復回数も...。たただ、私みたいにNewton法的なスピードを要求するのは贅沢で、nagataさんの方法が "Simple is the best" なのかもしれません。脱帽しました。 それから、seljuさん。90°云々と言いましたが、間違っている気がします。取り消します。

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

> 移動距離 d は最も遠いものと次に遠いものとの距離の差の1/2にでもしてやれば またうそを書いてしまいました。どうもすみません。 この2点がたまたま同じような距離の所にあった場合に収束が遅くなってしまいますし、判定を誤ってしまいますね。 結構難しそうですね。 やっぱりnagataさんのおっしゃるように過去の履歴ですかね?

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

「目からうろこ」です、nagataさん!! なんだか面倒な方にばかり落ち込んでいってしまっていたようです。 BoundingBoxの中心から始めれば真の位置からそう遠くはないだろうし、移動距離 d は最も遠いものと次に遠いものとの距離の差の1/2にでもしてやれば確実に収束しそうです。 比較の対象もBoundingBoxの内接球(ametsuchiさんが最初に初期球としたもの)の内部は無視してしまってもいいのではないでしょうか? 早く試してみてください、seljuさん!!

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

> さて本題ですが、どうも先ほどの整理には問題があるようです。 > b の所で()内に書いた条件は逆で、3点球の探索は最遠2点と他の1点で行えばいいような気がします。 > (証明は出来ませんが。) 上記は誤りです。反例が直ぐに見つかってしまいました。 (大体において"()内"ではありませんでしたね。) とすると3点をどのように見つけていけばいいのでしょう。 多少は枝刈りをするにしてもseljuさんのやり方で行くしかないんでしょうかね? どうも2次元的手法をそのまま3次元で実行する部分がしっくりこないのですが・・・・。

  • nagata
  • ベストアンサー率33% (10/30)
回答No.7

始めまして。 素人ですが次のようなアルゴリズムを考えました。 ------------------------------------ 球の中心pを適当に決める。 移動距離dを適当に決める。 while(!(dが十分小さい)) { while(pが収束、振動していない){点pから最も遠い点の方向に向かって点pを距離d移動させる。} dを小さくする。 } ------------------------------------ 非常に単純で分かりやすいアルゴリズムだと思うんですが、 ひょっとしてseljuさんはもうこのアルゴリズムを試されたことがありますか? もし実験済であれば、どの程度有効なアルゴリズムだったか評価をお聞かせ願えませんか。 逆に質問してどうするんだと言う気もしますがお願いします。 ちなみに振動、収束の判定はPの移動履歴を5~6個取っておいてそれと現在のpとの距離を 求めることで判定できると思っています。

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

> 4点以上のケースが3Dだとありえるのでしょうか。 正四面体の頂点に点がある場合を考えれば明らかだと思います。 どの3点をとって3点球を作っても他の1点はこの球の中には収まりません。 点群の外側をつないだ多面体をイメージした場合、分かりやすくいえば、 2点球となるのはこの多面体が棒状で両先端が球に接する時、 3点球となるのはこの多面体が円盤状でそのヘリの部分が球に接する時のような 特殊な場合であって、一般には4点で最小球と接すると考えるのが自然だと思います。 さて本題ですが、どうも先ほどの整理には問題があるようです。 b の所で()内に書いた条件は逆で、3点球の探索は最遠2点と他の1点で行えばいいような気がします。 (証明は出来ませんが。) 一通り探査して最小球が見つからなければ c の段階に移ればいいと思います。 なお、c の4点による探索はこの4点で構成される四面体の内部にこの外接球の中心が ある場合にのみこの球が最小球の候補となります。 この条件はametsuchiさんが述べておられる平面における条件、 「三角形が鋭角三角形」= 外接円の中心が三角形の内部にある、に相当します。

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

seljuさんのやり方の問題点を見つけました。単純化のために2D問題としましょう。 P1(-1, 0) P2(1, 0) P3(0.8, 0.8) P4(-0.01, -0,95) なる4点を考えます。手順を追うと、 1) この内、最遠距離のペアはP1-P2で、距離=2.0です。これを直径とする円は原点を中心とする半径=1の円。 2) P3はこの円内に入りません。で、P1,P2,P3を通る円を求める。この円の中心は原点より上にズレ、P4はこの円内に入らない。 3) P4はP1に一番近いから、P4,P2,P3を通る円を求める。この円内にP1も入るから処理終了。 しかし、角P4P2P3は>90°であるから冗長な円である。もっと小さい円が存在する。この問題の場合、最小包含円はP1,P3,P4を通る円に他ならない。 この難点を克服するには、三角形の全ての角が:90°以内であるか吟味する必要がある。

selju
質問者

お礼

げげっ。まさにそのとおり。 これはまずいことです。これは、早速直さなければなりません。(内輪ですが。) この、角度判別を織り込むとひょっとして、うまく行くような気がしてきました。 ありがとうございます。

関連するQ&A

  • 最小包含円

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

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

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

  • 東方明珠塔(上海のテレビ塔)の料金が良くわかりません

    上海旅行に行くのですが、「東方明珠塔(テレビ塔)」のちゃんとした料金がわかりません(高さによって50元or100元とありますが) テレビ塔の写真を見ると、上球(とても小さい)、中球、下球(中球と下球の大きさは同じに見えます) ・疑問点 1・下球(無料)中球(50元)上球(100元)なのか? 2・下球(50元)中球(100元)上球(登れない??) のどちらなのでしょうか? 1ならば、「中球の高さで十分と思うので50元でやめておく?(中球と上球のメートル差そんなにないように見えるから、上球行くのに+50元払うのはやめよう)」 2ならば、「下球は低い、頑張って100元だして中球まで行こう」と同行者と相談中です。 どなたか料金がわかる方教えて下さい。あと、答えられる方でいいのですが、「やはり一番高い上球まで(もし100元だとしても)登るほうが良い」のでしょうか?それとも「(もし100元だとしたら)そこまで払わなくても、中球とメートル差ないから50元でやめておく人のが多いよ」など・・・ご意見頂ければ有難いです

  • 最小二乗法による球の中心・半径のC言語による導出

    工学部の学生です。 最小二乗法による球の中心・半径のC言語による導出についてのご質問です。 ある物体の表面座標群を取得し、点iの位置(x座標、y座標、z座標)を zahyou.x[i] zahyou.y[i] zahyou.z[i] (iは0から300程度) として保存している状況です。 この座標群にC言語で最小二乗法を適用し、中心座標と球半径を導出する場合、 どのようにすればよろしいでしょうか? 座標群が歪な物体であった場合、むりやりにでも導出することは可能でしょうか? 形だけでも点iの存在する空間の中心・半径っぽいものを求められると助かります。 (たとえば、最大のx座標と最小のx座標÷2≦導出半径に収まるなど、ありえない結果は除外できるでしょうか…) 実に他力本願な質問事項で心苦しいのですが、切羽詰っております。 恥を忍んで、どうか皆様方のご助力お願いします。 参考 http://questionbox.jp.msn.com/qa2652396.html

  • 最小二乗法?

    i 個の測定点 (x[i],y[i]) を,最小二乗法などを用いて下記の式にフィッティングさせようと考えています。Visual Basic で作成した測定プログラムの中で使用したいのですが,具体的にどのようなアルゴリズムでフィッティングを行えばいいのか分かりません。 Y = A * sin(X - C)^2 + B 実測する x[i] の範囲は狭く,例えば -15°~ +15°まで 0.2°毎の計 151 プロット,といった感じです。そして定数 A,B,C の内,最も高い精度で求めたい定数は C です。測定の段階で x の範囲を狭めているのは,正確な C (通常 1°未満)を求めるためです。 この測定は x[i] にはほとんど誤差が含まれませんが y[i] には誤差があります。y[i] の含まれている誤差は試料によってまちまちなので,一概には言えません。目視ではほとんど誤差が分からない綺麗なカーブの場合,逆に目視で辛うじて下に凸の曲線が分かる程度の場合,どちらもあり得ます。 考え方だけでも構いませんので,どうかご教授下さい。よろしくお願いいたします。

  • m個の数字をn個のグループに分けるとき、

    m個の数字をn個のグループに分けるとき、 各グループの和s(i) ,(1<=i<=n) が、指定した比 r(0):r(1): ・・・ :r(n-1):r(n) ( = s(0):s(1): ・・・ :s(n-1):s(n) ) に一番近くなるようなグループ分けを導けるアルゴリズムはありますか。 例えば、{1, 3, 4, 6}を和の比が1:2に一番近くなるように2つのグループに分けると、 {1, 4}, {3, 6} となります。(もし違ってたら指摘してください) アルゴリズムでなくても、こうしたら良いんじゃないか、という考えがありましたら 教えてください。 総当たりで調べる場合はどのようにすれば、効率良く調べられるかという点もお願いします。 よろしくお願いします。

  • 電磁気学が難しく授業についていけていません(~_~

    以下の問題が分かりません… 1.真空中に半径aの導体球があり、+Qに帯電されている。この導体球を囲うように、半径b(b>a)の薄い球殻が置かれている。球殻には均一に合計-Qの電荷を帯電させた。導体球と球殻の中心は一致している。以下の問いに答えよ。 1)球殻の中心を原点とするとき、げんてんからの位置ベクトルrの点での電界を求めよ。 2)空間に蓄えられる静電エネルギーUをもとめよ。 2.断面の半径がaで長さが無限大の円柱上の物体の内部を一様に電流Iが流れている。またこの円柱状物体と中心軸が一致した長さが無限大で半径がb(b>a)の薄い円菅に一様に電流Iが円柱状物体の電流と同じ向きに流れている。このときの磁界の大きさをアンペールの法則(積分形)を適用して求めよ。 長くなってしまい、すみませんm(_ _)m 1)はなんとかできたとはおもいますが、球殻と導体球が実際どのような電界が出ているのかがイメージできません(~_~;)

  • ビリヤードのナインボールについて

    ビリヤードのナインボールについて質問させていただきます。 ナインボールでは一番最小の玉以外に最初に手玉が当たった場合ファウルとなりますが、仮に手玉、1、2という順番で並んでいて1に手玉を当てたあとその1が2に当たって2だけが落ちたとしたらこれはどうなるのですか?これがファウルでないのなら、最小の玉が弾かれた後に9に当たるように 狙って一球で勝負がつくこともあり得ますよね? 詳しい方教えてください!