• 締切済み

続 最小包含円

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

みんなの回答

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

ちょっと整理をしてみました。 最小球を場合分けすると以下のようになると思います。 a. 最遠2点で最小球が定まる。 b. 3点で定まる円を大円とする球が最小球となる。 ただし、最遠2点がこの3点に含まれるとは限らない。 c. 4点で最小球が定まる。 5点以上の点が最小球上に乗ることも考えられますがこれは c のケースで カバーできると思いますので問題ないと思います。 selju さんの方法は a、b には対処できていますが c のケースには対処できていないので遭遇すると永久ループに陥ってしまいます。(3点球というのは b のようなものですよね?) b のレベルで同じ3点の組合せを2回調べようとした時点で c のレベルのサーチに移る、 ということをすれば原理的には求まるとは思いますが4点の組合せを考えると・・・。 b、c、共に範囲は異なりますが、最遠2点を求めた段階でかなりの部分を枝狩り出来てしまうので、 それを行えば多少はかなり速くなるとは思うのですが現実的な範囲に納まるかどうかは疑問です。 何かいい方法はないんでしょうか??

selju
質問者

お礼

す、すごい。確信を突いているような気がします。 3点球と表現したものも、そのとおりです。 とりあえず2Dで考えているので、3点円と一緒かなと思っていたのですが、4点以上のケースが3Dだとありえるのでしょうか。 2D,3Dで考え方を分ける必要あり? 2Dの場合、4点による円は、3点による円でカバーできないもんなんでしょうか。 どうも頭が固くて、CAD使って描かないとわからないもので。 プログラムでは、CADの精度上の誤魔化しを入れているので、数学的に本当に永久ループに陥るのかどうか、ちょっとしっくりきていません。 これだ!というやり方ってないのでしょうか。

全文を見る
すると、全ての回答が全文表示されます。
  • ametsuchi
  • ベストアンサー率31% (81/257)
回答No.3

seljuさん、使用目的を勘違いしてました。おハズカシい。大変失礼しました。トレランスとは、CAD用語でいう、ホントの”Tolerance”、たとえば0.1mmとかそういうオーダの世界の話なんですね..。兎に角トンでもない大ボケお詫びいたします。点数など、絶対付けないで下さい。前に頂いたのも返上したい気分です。 目的はCADで、Interactiveに球を定義する、というようなもんなんでしょうか?返事はいりませんが..。 だとすると、点数nも大変大きな数を想像していたのですが、数点かも知れないんですね?2D CADの世界では、3点から円、円弧を決めるなんてよくありますが、3D CADで球を定義する場合、中心と半径を与えるのが多いように思ってました。実は自動車など、自由曲面・自由曲線を主体に扱ってきたので、球面(の一部)は殆ど扱ってこなかったのです。 で、「点列から最小包含球」と聞いて、高速化のための処理と早とちりした次第。兎に角お役に立てず申し訳なかったです。

selju
質問者

お礼

私の方こそ説明下手で申し訳ございません。 最終目的も先に書いとけば良かったですね。 つい、数学のカテゴリーということで、そっちよりに書いた方が良い回答を得られるかなと思ったもので。 >目的はCADで、Interactiveに球を定義する、というようなもんなんでしょうか? まさにそのとおりです。3DCADのカスタマイズなのですが、 それこそ中心と半径でしか球を定義できない機能を、もっと使いやすくするのが目的です。 具体的には、ある形状を円柱材料から切り出すとき、 必要最小径の円柱材料がわかれば、コスト削減につながったりします。(この場合の"コスト"はまさに"$"です。) 実際対象なる形状も、自由曲面を含む部品もあれば、単純な積み木形状、 リバースエンジニアリングの数万点の点群からなる部品をも扱いたいと考えています。 教えて頂いた高速化の処理は、全部品干渉チェックとか、設計意図を織り込む、よりファジーな自動設計プログラムの開発に役立てようと思っています。 こんな内容を、理解して聞いてくれる方がいることが、 私にとってはとても嬉しく思います。 いつも、孤軍奮闘なもので…。

全文を見る
すると、全ての回答が全文表示されます。
  • ametsuchi
  • ベストアンサー率31% (81/257)
回答No.2

一寸補足。 seljuさんの方法、よくよく吟味してみると、コストは非常にかかるが、非常に「Tightな」BoundingSphereができるので、なかなかいいと見直しました。 ・3点の内、追加点に一番近い点を置き換える ・3点から球を一意に決める なんてのも、いいセンスしてると思います。 問題はそれだけコストをかける値打ちがあるかどうかです。対象とRay(=半直線)の交叉性を高速に検出する必要のある、RayTracingなら、私が示した方法より、いいかもしれない。RayTracingでは、画素数分のRayだけでなく、反射、屈折に伴い、Rayが分岐していく。 「Motion Blur」や「Delth of Field」などの「Distributed Raytracing」では計算時間が更に何10倍以上も時間がかかります。だから、この場合、ある程度コストをかけてもBoundingSphereは小さければ小さいほどいいかも知れません。 ただ、最大距離2点を探すのに1/2*n^2回計算するのは何とかなりませんか?BoundingBoxと、seianさんが言われたような方法で、かなりそれに近い2点を求めることができると思います。 しかし、普通のCADシステムでそこまでやる必要があるか否か疑問です。 ・実際に想定されるデータを基に、先ずコストと効果をキチンと調べてみたら如何でしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • ametsuchi
  • ベストアンサー率31% (81/257)
回答No.1

私より、seianさんの方が緻密な頭脳なようなので、彼の答に期待することにしましょう。 1)例の参考URLでは既に説明したとおりで、 a)全点をなめてx,y,z方向各々最大最小値を求める。(=BoundingBox) b)「widest dimensional span」即ち、BoundingBoxの3方向で一番大きいスパンに接するような球を初期値とする。中心はBox中心。大多数の点は球内に入る。このロジックはseianさん方式がいいかもしれない。 c)全ての点に付いて、 c1)球内ならこれを無視。 c2)球外の点について、この点と旧球の中心をとおりこの点と反対側は旧球に接するように新球を定める。 ですよね。これは勿論、おっしゃるように「元の球に接するように作ると、最初の2点が球の内側に入ってしまうため、1点しか通らない球で定まってしま」います。勘違いではないです。逆に質問ですが、 質問1)3点球ですが、元の球より小さくなるところがあり、ここで、元は入っていたのに、新球からはみ出てしまう点が出てくる可能性がありますね?永久ループするかどうか分からないけど、条件次第で、永久ループまたはそれに近いことになりませんか?永久ループしない自信がありますか? 質問2)最小包含球の目的自体、数学的な厳密解を要求している訳じゃないですよね?q=88669ではそう書いてありました。ならば、 ・なるべく小さい半径だが、確実に全点を包含する球を高速で求めること。 が目的ですよね? ■恐らく球半径の大きさという観点からは、seljuさん方式の方がベターでしょう。 ■問題は処理効率です。 ・初めに最大距離の点ペアを求めるには「n^2」回の計算が必要です。 ・その後の処理の処理ループ(=while Loop?)も何回回るか分からない。下手すると永久ループかそれに近い可能性もある。 ・各ループの中で、また、nに比例する処理が必要。私や、seianさんが示した方法なら、確実に、nに比例した処理で終わりです。

selju
質問者

お礼

回答ありがとうございます。 ametsuchiさんの言われるとおり、私自身が作ったものは、 永久ループになる場合があります。いえ、ありました。 実際の処理では、ループ化を検知した時点で終了、もしくは、適当回数回った時点で終了してました。 「時間がかかるわりに、全点が入る球が求まらないまま終わる」、これが発生することが最大の問題でした。 今現在は、教えて頂いた処理が保険で動くので、結果がでないということはなくなりました。 使用目的が、反復処理ではなく、CAD上で円もしくは、球そのものの位置、大きさを求めることなので、人の見た目で違っていると判断できるレベルの誤差は避けたいと思っております。 実際のCAD上で4点描いて、試してみると、想像以上に誤差が出ていることがわかりました。(特に半径ではなく中心位置のずれ) 人の見た目の判断基準はあいまいなので、 どのくらいの結果が理想的かといわれると、ちょっと難しいのですが、 オペレーター曰く、 ・半径誤差は0.1mm程度。(100mmR球に対して) ・誤差が発生する場合は、その誤差の程度が知りたい。 ・簡単形状に誤差が発生するのは許せない。 あいまいさに条件を付けた、ちょっと製造業の泥臭い仕様との板挟みになっております。 すみません、「厳密解を得たいが、CAD的な誤差は許す。」 「厳密解がだせればベスト、だめなら最適解で我慢するよ。」って感じでしょうか。 どちらかというと、上記のような結果重視で、高速化は、ついでにお願い。くらいの要件です。 教えて頂いた高速処理は、それはそれで非常に参考になりました。 別のところで利用できそうです。

全文を見る
すると、全ての回答が全文表示されます。

関連する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に当たるように 狙って一球で勝負がつくこともあり得ますよね? 詳しい方教えてください!

このQ&Aのポイント
  • 「男なら、これくらいやる(やって)」という物は何?
  • 「蛍光灯の電球交換」くらいなら「簡単にできる」と男は言うでしょう。女性も「男ならそれくらいは当然やってよね」と思うでしょう。そんな「男なら当然できる(やってよね)」と思うものは何が有りますか?
  • 1度に、3つ以内でお願いします。
回答を見る