たびたびすみません。
まだ、問題が発生しそうなので、もう一度お願いします。

>私も、初期球に関しては、ちょっとおかしいと感じ、
>プログラム上は、旧アルゴリズム(総当たり最長距離)で、今も動かしています。
>実のところ、最適な向き(最小)のBoxの求め方もわからなかったので、そのままにしてしまいました。


>私の場合、まずCAD上で描いて試しているのですが、

>>3b)iー点がこの球に入っていなかったら、このi-点を通り、反対側が元の球を通るように、新球を定める。(容易)

>これを繰り返していくと、予定より大きな球になる場合が発生しています。
>元の球に接するように作ると、最初の2点が球の内側に入ってしまうため、1点しか通らない球で定まってしまいます。
>2点球で定まらない場合は、確実に3点球で定まるべきだと思うのですが、何か勘違いしているのでしょうか。

A 回答 (14件中1~10件)

nagataさんの方法で心配なのはどの程度真の中心に近づいているのかが保証できるのかということだと思います。


例えば真の中心から s 以内であると判断できるのであれば、その時の仮の中心から一番遠い点との距離を L とすれば、仮の中心からの距離が L-2s から L の間の点について調べればいいだけの話ですので s がある程度小さければその個数はたかが知れており、解析的に解くことは十分可能だと思います。
複数の点が非常に接近して存在し、それらが上記範囲に入ってしまうような場合は扱いが面倒になるかもしれませんが処理は可能だと思います。

nagataさんが心配しておられる2点間で振動するような場合は、振動が確認された時点でこの2点が最小球を構成する最遠2点か否かを判定すればいいのではないでしょうか?
そうであれば終了ですし、そうでなければ、この2点の中心を仮の中心として再出発すればいいと思われます。
    • good
    • 0
この回答へのお礼

遅くなりましたが、皆さんおはようございます。
現実プログラムの修正で、ちょっと返事が遅くなりました。申し訳ございません。

ametsuchiさんが整理してくれたように、
>B)「2,3,4点総当たり」しない効率的な方法で、厳密解が得られないか?
これを探していたのですが、未だうまい方法が見つかっていません。
>C)反復手法、それも絶対収束する方法。
これを利用する方法をこれからちょっと考えてみようと思います。
当初、必ず数点が円上、球上にくるはずだから、この方法は今回はあわないと、勝手に決め込んで試していませんでした。
ある程度、収束処理をして絞り込み、最後は総当たりでトドメ。を試そうかと思います。

ちなみに、実際のプログラムで適用している今現在の処理は、2Dのみ対応に絞って、
(1) 点群から外殻を構成する点のみに絞り込み。
(2) 総当たり処理。
これで、対応しています。点の数が少ないのでまあ良いかなという運用的回避策です。
3D球への対応は、上記のとおり、これから作り込みといったところです。

お礼日時:2001/06/15 13:40

皆さんさん、おはようございます。



■前置き:

先ず、例によって誤りを訂正。すいません。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)なら、できるだけ収束し易いエレガントな方法が望ましい。で、何とかならんものかと考えたいのですが、今日一杯は時間が取れず、若い柔軟な頭に先ずは期待しようかなと..。
    • good
    • 0

今晩は、nagataです。

結構ウケたみたいで嬉しいです。
いろいろアイデアがうかんだので聞いてください。

まず、収束に関して大きな問題に気づいたんですが平面上に2点(1、0)(ー1、0)
があってpが(0、1)にあったとして、このアルゴリズムを走らすとあんまり
良い結果が得られそうにありません。やってみてください。pのy座標は確かに
減って行くのですが、永久に0になれません。これはこのアルゴリズムの本質的、
かつ致命的な欠点のように思われます。

なのでこのアルゴリズムは捨てて次のようなことを考えています。

最も遠い点に向かって繰り返し中心を動かします。で、
このアルゴリズムを走らすと最も遠い点になる点というのは幾つかの
非常に限られた点だけだと思われます。おそらくこれが最小円を決定する
上でのクリティカルな点であると思われます。
なのでこれらの点になにか強力な解析的手法を適用するというのはどうでしょう。

例えば点A、Bが交互に最も遠い点になるとしたら、球の中心は線分ABの中点を
通り、線分ABを法線に持つ平面上にあるとか、そういうことが言えないでしょうか。
ちと厳密な話は分かりませんが、そんなことを考えています。
    • good
    • 0

「目から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°云々と言いましたが、間違っている気がします。取り消します。
    • good
    • 0

> 移動距離 d は最も遠いものと次に遠いものとの距離の差の1/2にでもしてやれば



またうそを書いてしまいました。どうもすみません。
この2点がたまたま同じような距離の所にあった場合に収束が遅くなってしまいますし、判定を誤ってしまいますね。
結構難しそうですね。
やっぱりnagataさんのおっしゃるように過去の履歴ですかね?
    • good
    • 0

「目からうろこ」です、nagataさん!!


なんだか面倒な方にばかり落ち込んでいってしまっていたようです。

BoundingBoxの中心から始めれば真の位置からそう遠くはないだろうし、移動距離 d は最も遠いものと次に遠いものとの距離の差の1/2にでもしてやれば確実に収束しそうです。
比較の対象もBoundingBoxの内接球(ametsuchiさんが最初に初期球としたもの)の内部は無視してしまってもいいのではないでしょうか?

早く試してみてください、seljuさん!!
    • good
    • 0

> さて本題ですが、どうも先ほどの整理には問題があるようです。


> b の所で()内に書いた条件は逆で、3点球の探索は最遠2点と他の1点で行えばいいような気がします。
> (証明は出来ませんが。)

上記は誤りです。反例が直ぐに見つかってしまいました。
(大体において"()内"ではありませんでしたね。)

とすると3点をどのように見つけていけばいいのでしょう。
多少は枝刈りをするにしてもseljuさんのやり方で行くしかないんでしょうかね?
どうも2次元的手法をそのまま3次元で実行する部分がしっくりこないのですが・・・・。
    • good
    • 0

始めまして。


素人ですが次のようなアルゴリズムを考えました。

------------------------------------
球の中心pを適当に決める。
移動距離dを適当に決める。

while(!(dが十分小さい))
{
while(pが収束、振動していない){点pから最も遠い点の方向に向かって点pを距離d移動させる。}
dを小さくする。
}
------------------------------------

非常に単純で分かりやすいアルゴリズムだと思うんですが、
ひょっとしてseljuさんはもうこのアルゴリズムを試されたことがありますか?
もし実験済であれば、どの程度有効なアルゴリズムだったか評価をお聞かせ願えませんか。
逆に質問してどうするんだと言う気もしますがお願いします。

ちなみに振動、収束の判定はPの移動履歴を5~6個取っておいてそれと現在のpとの距離を
求めることで判定できると思っています。
    • good
    • 0

> 4点以上のケースが3Dだとありえるのでしょうか。



正四面体の頂点に点がある場合を考えれば明らかだと思います。
どの3点をとって3点球を作っても他の1点はこの球の中には収まりません。

点群の外側をつないだ多面体をイメージした場合、分かりやすくいえば、
2点球となるのはこの多面体が棒状で両先端が球に接する時、
3点球となるのはこの多面体が円盤状でそのヘリの部分が球に接する時のような
特殊な場合であって、一般には4点で最小球と接すると考えるのが自然だと思います。

さて本題ですが、どうも先ほどの整理には問題があるようです。
b の所で()内に書いた条件は逆で、3点球の探索は最遠2点と他の1点で行えばいいような気がします。
(証明は出来ませんが。)
一通り探査して最小球が見つからなければ c の段階に移ればいいと思います。
なお、c の4点による探索はこの4点で構成される四面体の内部にこの外接球の中心が
ある場合にのみこの球が最小球の候補となります。
この条件はametsuchiさんが述べておられる平面における条件、
「三角形が鋭角三角形」= 外接円の中心が三角形の内部にある、に相当します。
    • good
    • 0

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°以内であるか吟味する必要がある。
    • good
    • 0
この回答へのお礼

げげっ。まさにそのとおり。
これはまずいことです。これは、早速直さなければなりません。(内輪ですが。)

この、角度判別を織り込むとひょっとして、うまく行くような気がしてきました。
ありがとうございます。

お礼日時:2001/06/14 16:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード


このカテゴリの人気Q&Aランキング

おすすめ情報

カテゴリ