凞包を芋぀けるためのクむックハルアルゎリズム

定矩が蚀うように、ある集合の凞包 最小の凞集合です 倚くを含む 。 ペアごずに異なる点の有限集合の凞包は倚面䜓です。

Quickhullアルゎリズムの1次元のケヌスを実装するには、関数std :: minmax_elementが適しおいたす。 ネット䞊では、フラットケヌスのQuickhullアルゎリズムの倚くの実装を芋぀けるこずができたす。 ただし、任意のディメンションの堎合、 qhull.orgからの1぀のヘビヌりェむト実装のみがすぐに芋぀かりたす。



甚語の暪の括匧内に、英語ぞの翻蚳を瀺したすTuґboのスタむルで、すみたせん。 これは、甚語に粟通しおおらず、リンクで英語のテキストを読んだり、゜ヌスコヌドを扱うこずを決めたりする人に圹立ちたす。

䞊蚘の「暙準的な」実装はCで蚘述されC ++バむンダヌがありたす、長い間GNU OctaveおよびMATLABパッケヌゞの䞀郚ずしお広く䜿甚されおいるため、十分にテストされおいたす。 ただし、1぀のQuickhullアルゎリズムのみに関連するコヌドを分離するこずにした堎合、問題が発生したす。 最も単玔なアプリケヌションの堎合、もっずコンパクトなものでできるようにしたいず思いたす。 少し詊しおから、実装を䜜成したした https://github.com/tomilov/quickhull これは䟝存関係のない唯䞀のクラスです。 合蚈玄750行。



幟䜕孊的な抂念。



倚次元゚ンティティの操䜜を開始するず、通垞の2次元および3次元のオブゞェクトずの類䌌性が有効であるこずがわかりたす。 知識をいくらか合理化する必芁がありたす。いく぀かの新しい甚語を導入し、それらの関係を明確にしたす。

プログラマヌにずっお、幟䜕孊的オブゞェクトは䞻にデヌタ構造です。 最初に、幟䜕孊的定矩厳密ではありたせんを瀺したす。 次に、デヌタを栌玍し、それらを効果的に操䜜するのに䟿利な察応するデヌタ構造の説明を行いたす。

空間の次元を 。





倚面䜓の衚面、その境界、その境界の境界など 英語では顔ず呌ばれたす。 良いリ゜ヌスぞのリンクを提䟛したす。ここでは、 次元空間、可芖たたは芳枬可胜なオブゞェクトは 次元オブゞェクト、぀たり境界 次元オブゞェクト。 英語のファセットは正確に芳察された顔です。 盎線は垞に1次元の゚ンティティです。 このグラデヌションのポむント頂点はれロ次元ず芋なすこずができたす。

いく぀かのセットを扱う ポむント、我々は察応するセットの怜蚎に進むこずができたす 他のすべおのポむントから1぀のポむントを枛算するこずにより、ベクトルを䜜成したす。 したがっお、この点を原点Eng。Originずしお割り圓おたす。 すべおのポむントが同じ平面にある堎合、平面は原点を通過し始めるようにシフトされたす。 アフィニティ独立 線圢独立性が実行されるずきにポむントが実行されたす 察応するベクトルの。 ベクトルの線圢独立性の定矩は、よく知っおいるこずでしょう。 だから -次元空間はこれ以䞊遞択できない それらはすべおアフィン的に独立しおいたす。 これを説明したしょう。3次元空間では、䞉角圢3次元シンプレックスの面-四面䜓は3぀の点もちろん、1぀の盎線䞊にないによっお定矩されたす。 単䞀の平面がこれらの3点を通過したす。 䞉角圢の3぀の頂点のセットに远加されたこの平面䞊の任意のポむントは、3぀のアフィン独立ポむントの可胜性を4぀のアフィン䟝存セットに倉換したす。 他の次元に぀いおも同様です。

ずりわけ、ハむパヌボリュヌム英語のハむパヌボリュヌムの抂念を導入する必芁がありたす。



ハむパヌボリュヌム。
倚数のシンプレックス 、 面 、 ゚ッゞ 、 ピヌクなどから考慮されるオブゞェクト。 察応するサブスペヌスで制限されたす。 そのようなオブゞェクトが占める「スペヌスの量」は、枬定/決定/定矩できたす。 1次元の盎接枬定倀は長さず呌ばれたす。 2次元平面の堎合、メゞャヌは面積ず呌ばれたす。 䞉次元のボディ-ボリュヌム。 この抂念は、D次元ボリュヌムたたはDハむパヌボリュヌムず呌ぶこずで䞀般化できたす。 ペアごずに異なる点で圢成されたシンプレックスの堎合 ポむントをリストする順序は重芁です、ハむパヌボリュヌムは次のように蚈算できたす 















ここで、ベクトルの座暙を線で曞きたした。 同様の匏ず掚論を列ベクトルに䞎えるこずができたす぀たり、すべおの行列を転眮する堎合、これは結果ず結論に圱響したせん。

䞊蚘の匏の行列匏の玄数は、平行四蟺圢を分割できるシンプレックスすべお同じ䜓積の数です。 ベクトルに基づく 。 したがっお、行列匏自䜓は平行四蟺圢のハむパヌボリュヌムです。 この声明の根拠に興味がある人のために、私はグラム行列の行列匏ずその幟䜕孊的解釈に぀いお読むこずをお勧めしたす。

「䜓積」オブゞェクトのこの枬定倀はれロ以倖の倀になり、正ず負の䞡方になる可胜性があるこずに泚意しおください。 次の考慮事項から蚘号の意味を理解するこずは難しくありたせん。シンプレックスの2぀のポむントを亀換するず、行列匏の蚘号に倉化が生じたす。 ポむントの順序は、シンプレックスの「巊右の向き」です。 飛行機では、想像するのは簡単です。䞉角圢の蟺が 反時蚈回りに蚘茉 行列匏は正です そうでなければ -è²  。 四面䜓の堎合、笊号は最埌から芋たずきに最初の3点がリストされる順序時蚈回りたたは反時蚈回りに䟝存したす。 したがっお、将来、幟䜕オブゞェクトを定矩するずき、ポむントの列挙の順序を固定する必芁があるこずを受け入れる必芁がありたす。

アルゎリズムは方向付けられたハむパヌボリュヌムの倧きさの笊号に関する情報のみを䜿甚するため、行列匏の前の因子を省略できたす。

少なくずも2぀のラむンが線圢に䟝存しおいる堎合、行列匏はれロですポむントがペアごずに異なる、぀たりラむンがれロではないこずを思い出しおください。 アフィン䟝存点ずそれらに察応する線圢䟝存ベクトルに関する䞊蚘の掚論の察応を簡単に怜蚌できたす。

行列匏の絶察倀は、ベクトルに枡すずきに枛算する正確な点の圱響を受けず、笊号のみに圱響したす。 最埌のポむントは垞に最初のポむントから枛算する必芁がありたす。そうしないず、将来䜿甚される同䞀方向の類䌌オブゞェクトの堎合、メゞャヌの笊号は偶数次元ず奇数次元で異なりたす。

顔など、倧きすぎる空間に埋め蟌たれたオブゞェクトのメゞャヌをどうするか 䞊蚘ず同じ方法でマトリックスを䜜成するず、長方圢になりたす。 このような行列の行列匏は取埗できたせん。 行ベクトルで構成される同じ行列を䜿甚しお、匏を䞀般化できるこずがわかりたすこの䞀般化はBinet-Cauchy匏に関連付けられおいたす 。























アフィン的に独立したペアごずに異なる点の堎合、行列匏の䞋の行列は垞に正定正方行列であり、そのような行列の行列匏自䜓は垞に正の数です。 アフィン䟝存点の堎合、行列は特異です぀たり、行列匏はれロです。 枬定倀が垞に非負であり、方向に関する情報がないこずは明らかです。

䞀方では、正方行列の積の行列匏は行列匏の積に等しく、他方では、転眮された正方行列の行列匏は元の行列匏ず䞀臎するため、最埌の匏は 正方圢の根を陀く点、すなわち このモゞュヌルは、空間内のポむントの盞察的な方向に関する远加情報を取埗するために省略できたす。



アルゎリズム



任意の次元の堎合のQuickhullアルゎリズム自䜓は、 Barber、C. Bradfordによっお提案されたした。 ドブキン、デビッドP。; Huhdanpaa、Hannu1996幎12月1日。 「凞包のクむックハルアルゎリズム。」 数孊゜フトりェア䞊のACMトランザクション224469–483 著者の「暙準的な」C実装は、すでに蚀及したサむトhttp://qhull.org/にありたす。これは、C ++むンタヌフェむスhttps://gitorious.org/qhull/qhullを備えたリポゞトリです。 元の゜ヌスからアルゎリズムを匕甚したす。

 d + 1ポむントのシンプレックスを䜜成したす
各ファセットF
	未割り圓おの各点p
		 pがFを超える堎合
			 pをFの倖郚セットに割り圓おたす
空でない倖郚セットを持぀各ファセットFに぀いお
	セットの倖偎のFの最も遠い点pを遞択する
	可芖セットVをFに初期化したす
	 Vのファセットのすべおの未蚪問のネむバヌ
		 pがNを超える堎合
			 NをVに远加
	地平線の尟根の集合HはVの境界です
	 Hの各リッゞR
		 RずPから新しいファセットを䜜成したす
		新しいファセットをその近隣にリンクしたす
	新しいファセットごずにF '
		 Vのファセットの倖郚セット内の各未割り圓お点q
			 qがF 'より倧きい堎合
				 qをF 'の倖郚セットに割り圓おる
	 Vのファセットを削陀したす




凞包は面のリストです。



シンプレックスの開始。



ご芧のずおり、 開始シンプレックスから開始する必芁がありたす。 どれでも遞択できたす アフィン独立したポむントですが、䜕らかの安䟡なヒュヌリスティックを䜿甚するこずをお勧めしたす。 このステップの䞻な芁件は、シンプレックスが可胜な限り「狭く」なるこずがないようにするこずです。 これは、浮動小数点挔算が䜿甚される堎合に重芁です。 元の実装では、最倧および最小の座暙を持぀ポむントが䜿甚されたす明らかに、それらは凞包の頂点のセットにも含たれたす。 開始シンプレックスから開始しお、埌続の各ステップで、より倧きな倚面䜓を取埗したす。その䞍倉のプロパティは垞にその凞性になりたす。 䞀時的な倚面䜓ず呌びたす。



シンプレックスを開始するための頂点怜玢ヒュヌリスティック。
私の発芋的手法は、ポむントの順次遞択に基づいおいるため、次の各ポむントは以前のすべおのポむントから可胜な限り離れおいたす。 「さらに」-ある意味で、これをさらに明確にしたす。

2぀のポむントリストが維持されたす゜ヌスリスト 最初は、アルゎリズムの入力からのすべおのポむントが含たれおいたすおよびシンプレックスのポむントのリスト 最初は空です。 セットによるず そしお あなたは倚くのベクトルを眮くこずができたす そしお 。 これを行うには、このアルゎリズムのすべおのステップで粟神的に任意のポむントを遞択したす 倚くのうち 空ではありたせん、芚えおから、そこから他のすべおの点ぞのベクトルを描画したす 受け取った 含たれる芁玠は1぀少ない からすべおのポむントぞ 受け取った  たず、最初のたたは他のポむントを取埗したす に移動したす 。 次に、からベクトルを探したす 最倧のモゞュヌルを䜿甚しお、察応するポむントを で 。 からの最初のポむント に戻る 圌女は基準なしで遞ばれた。 次のそれぞれに぀いお ポむントを探しおいる から 基底の あるアフィン空間から可胜な限り遠い から移動する で 。 これを行うには、察応するポむントを探したす ベクトル から 盎亀補完䞊の投圱モゞュヌル ベクトル郚分空間 最倧。 ここに -線圢シェル 、぀たり-ベクトル空間 ベクトル 構築により線圢に独立しお埗られる堎合、 このベクトル空間の基瀎です。

からの距離 前に 







ベクトルは、任意の郚分空間およびこの郚分空間の盎亀補数ぞの射圱の合蚈に盎接分解されるため、次のようになりたす。







正芏盎亀基底を持぀ ベクトル郚分空間 、この郚分空間の盎亀補数ぞの投圱モゞュヌルを蚈算できたす。







ベクトル座暙 セットからの座暙列ベクトルで構成されるたずえばHouseholderメ゜ッドによる長方圢行列のQR分解を実行するこずで取埗できたす。 。 その結果、盎亀長方圢行列Q および䞊䞉角R未䜿甚。 列Qはベクトルの座暙です ベクトル空間の正芏盎亀基底を圢成する 。

でアルゎリズムを完了した埌 䜍眮しおいたす ポむント。



次に、顔のいわゆる倖郚ポむントのリスト 英語の倖郚セットに残りのポむントを配垃する必芁がありたす-これらは、各顔に察しお維持され、ただ考慮されおいない以䞋-未割り圓お、英語未割り圓おポむントのリストですシンプレックスの内郚たたは将来の䞀時的な倚面䜓の反察偎の面に盎面したす。 ここでは、凞面倚面䜓特にシンプレックスのプロパティを䜿甚したす。これは、空間党䜓を各面の平面で割るこずによっお埗られる2぀の半空間のうちの1぀のみに存圚したす。 このプロパティは、ある点が凞包の面の倖郚点のリストのいずれにも該圓しない堎合、その点の内郚に確実に配眮されるずいう事実を意味したす。 将来的には、アルゎリズムは、倖郚ポむントのリストに含たれるポむントのどれが顔の平面から最も離れおいるかに぀いおの情報を必芁ずしたす。したがっお、倖郚ポむントのリストにポむントを远加するには、どれが最も遠いかに関する情報を保存する必芁がありたす。 任意のポむントは、倖郚ポむントの1぀のリストのみに分類されたす。 挞近的な耇雑さは、ポむントがリスト党䜓にどの皋床正確に分垃しおいるかには圱響されたせん。

この段階で、顔を蚭定する方法、顔たでの距離を蚈算する方法、顔に察する点の向きを決定する方法に぀いお説明したす。



瀬戞際。 フェヌスプレヌンからポむントたでの方向距離。
顔を蚭定するには、持っおいる必芁がありたす ポむント-顔の頂点。 䞊蚘の理由により、これらのポむントを敎然ず保管したす。 さらに、必芁な順序は厳密ではありたせん。 たずえば、ペアごずに異なるポむントの必ずしも異なるペアではない2぀の亀換を2回行った堎合、将来の操䜜で意味がたったく同じ向きになりたすこれは通垞、頂点の定数ず座暙から圢成された行列から行列匏を取埗したすこのようなペアの順列は結果に圱響したせん。 2぀の可胜な方向は、平面面の法線の2぀の可胜な方向に察応したす。

䞀床だけ-最初に-蚘号で向きを決定するために、開始シンプレックスのハむパヌボリュヌムの倀を蚈算する必芁がありたす。 面に関する以降のすべおの操䜜は、ポむントたでの指向距離英語の指瀺距離の蚈算のみで構成されたす。 ここで、任意の次元の堎合に䞀般化できる孊校の公匏を思い出すこずができたす。぀たり、「䞉角圢の面積は底蟺、高さの積の半分です」たたは「ピラミッドの䜓積は基底面積ず高さの積の3分の1です」 䜓ず顔の尺床を削陀する方法を知っおいるので、高さ1次元の長さを衚珟できたす。







アルゎリズムでは、固定平面面からポむントたでの方向付けられた距離を蚈算する必芁がありたす。 この堎合、分母に正の定数があるこずがわかりたす。 分子内のハむパヌボリュヌムのみがポむントの䜍眮に䟝存したす「䞊」たたは「䞋」。 定数でもありたす。 したがっお、顔ず点から構成されるシンプレックスのハむパヌボリュヌムたたは、察応する平行四蟺圢の盞察的な倧きさのみを考慮するこずができたす。 行列匏が最も遅い方法ず芋なされない堎合定矩により、  最速ではありたせん 、およびLUP分解法英語のLUP分解を䜿甚するず、耇雑さを達成できたす。 そしおたずもな数倀安定性。 私は、行列匏の蚈算の耇雑さがアルゎリズム党䜓の最終的な耇雑さにどのように圱響するかを評䟡するこずは想定しおいたせんが、実隓しお、最悪の堎合たずえば、球英語の球圢の点にある点の堎合 距離を掚定するための行列匏の蚈算は、蚈算コストが高すぎたす。

別のアプロヌチは、正芏化された平面方皋匏の䜿甚です。これは、平面䞊の点の座暙、正芏化された法線ベクトルの座暙を関連付ける䞀次方皋匏です  — ) (. normalized normal vector) (. offset):















— :







, , — :







, , , — .

そしお - () .

: . std::inner_product , , , — 。 , , , , , .



これで、面の平面を説明するこずができたすが、あいたいさが1぀ありたす。開始シンプレックスの面の頂点のリストで、ポむントの列挙の順序を遞択する方法です。著者は、頂点のリストを順序付けしたせん。そうしたせん。任意であるが固定された次数の頂点に察しお平面の方皋匏を蚭定するず、この平面に察する内郚ポむント英語の内郚ポむントの方向がわかりたす。぀たり、指向距離が蚈算されたす。距離が負の堎合、超平面の法線の座暙ず原点からのオフセットで笊号が倉わりたす。たたは、フラグの倀を蚭定しお、顔が䞊䞋逆になっおいるこずを瀺したす英語を反転。凞倚面䜓の内郚点は、少なくずもその頂点すべおの頂点を取埗した堎合、いわゆる重心の算術平均になりたす。



開始シンプレックスの面の向きを倉曎したす。
( ) . , , ( ) (  , «» , ( ). , ( ). .

。 , , . , . ( / ).

, , , , . , .



面ごずに、頂点のリスト、倖郚ポむントのリストを指定するこずに加えお、隣接する英語の隣接リスト面のリストを指定する必芁がありたす。顔ごずに正確に含たれたす 芁玠。開始シンプレックスには面が含たれおいるため、その面のいずれに぀いおも、他のすべおの面ピヌスが隣接する面のリストに含たれるこずは明らかです。



メむンルヌプ。



これで、メむンルヌプで䜜業できる䞀時的なポリゎンができたした。メむンルヌプでは、この䞀時的なポリゎンが完成し、倚面䜓の倖偎に1぀のポむントがなくなる瞬間が来るたで、たすたす倚くのスペヌスず元のセットのポむントを「キャプチャ」したす。次に、このプロセスに぀いお詳しく説明したす。぀たり、それが私の実装でどのように機胜するかです。

メむンルヌプはフェむスルヌプです。各反埩で、倖郚ポむントの空でないリストを持぀面の䞭から、最良の面が遞択されたす英語の最良の面。倖郚ポむントのリストから最も遠いポむントが他のフェヌスよりもフェヌスから遠いずいう意味で最高です。倖郚ポむントの空でないリストを持぀面がなくなるず、サむクルが終了したす。

メむンサむクルのボディでは、遞択した面は凞包の意図的に非面ずしお削陀されたす。しかし、最初に、圌女は「コンポヌネントを理解したす」。倖郚ポむントのリストから最も遠いポむントが抜出されたす-おそらく凞包の䞊郚です。残りのポむントは、割り圓おられおいないポむントの䞀時的なリストに移動されたす。 。さらに、Facesのリストから始たる隣接するFacesのリストでは、䞀時的な倚面䜓のFacesの隣接グラフがバむパスされ、各Facesが既に蚪れたVisitFacesのリストに远加され、ポむントからの可芖性がテストされたす 。面がポむントから芋えない堎合、その隣接する面はそれ以䞊進みたせん。隣接する面の䞭で次の可芖面に䞍可芖ポむントがある堎合、境界の可芖面のリストになりたす氎平線の前ではなく、氎平線の前-「氎平線を超えお」。ただし、すべおの隣接する顔が衚瀺されおいる堎合、そのような顔は削陀甚の顔のリストに远加されたす。面の隣接グラフを走査した埌、境界に衚瀺される面のリストず削陀する面のリストには、ポむントから芋えるすべおが含たれたすファセット。これで、リストからすべおの顔が削陀されたした。さらに、削陀された各顔は、その隣接する隣接顔のリストから削陀されたせん。これは安党です。これは、隣接する面が将来的に隣接する面のリストから芋える境界であっおも、ポむントから芋えない゚ッゞぞの近接に関する情報のみが䜿甚されるためです。削陀する面のリストに続いお、境界に衚瀺される面のリストがスキャンされたす。境界に衚瀺される各面は「解析」されその埌、隣接する面のリストず頂点のリストが必芁になりたす、削陀されたす。境界の可芖面ごずに、新しい面が䜜成されたす1から新しい顔のリストに远加されたす。この堎合、隣接する顔のリストがスキャンされ、このリストから芋えない各顔に぀いお、特定の可芖境界を持぀共通の゚ッゞが怜玢されたす。非衚瀺゚ッゞず境界衚瀺゚ッゞに共通の頂点぀たり、共通゚ッゞの頂点は、さらに、境界衚瀺面の頂点のリストに曞き蟌たれた順序で、新しい面の頂点のリストに曞き蟌たれたす。ちなみに、゚ッゞEng。Horizo​​n ridgeは、ポむントから芋える䞀時的な倚面䜓の衚面のその郚分の地平線の䞀郚です 。 この゚ッゞに属さない境界可芖面の唯䞀の頂点がポむントに眮き換えられたす 新しい面の頂点のリストでは、残りの頂点は、衚瀺されおいる面の境界の頂点の順序付けられたリストず同じで、同じ堎所にありたす。したがっお、構築された新しい面の頂点のリストは正しい向きを保蚌したす。぀たり、正芏化された平面方皋匏を蚈算するずき、法線は䞀時的な倚面䜓の倖偎に向けられ、オフセット倀は正しい笊号を取埗したす。すべおの境界衚瀺面が凊理された埌、新しい面のリストが䜜成されたす。これらの面の超平面方皋匏は、それらの頂点のリストを䜜成した盎埌に蚈算できたす。たた、新しい面を䜜成する堎合、隣接する面のリストに1぀の面、぀たり新しい面の頂点のリストを䜜成するずきに境界の可芖面に隣接しおいた察応する非衚瀺面を远加できたす。明らかに残り残りの新しい顔の䞭から隣接する顔を探す必芁がありたす。

刀明したようにGoogle Performance Toolsからプロファむラヌでサンプリングするずき、アルゎリズムは、倧きな次元および/たたは悪い入力デヌタの堎合぀たり、ほずんどのポむントが凞包の頂点である堎合に新しい顔の隣接する顔の怜玢に費やしたす。私の実装では、最初はアルゎリズムは非垞に簡単でした新しい面のリストからの面のすべおの可胜なペア2぀のネストされたルヌプが゜ヌトされ、1぀の䞍䞀臎を持぀頂点リストの順序ポむントの入力リストからの番号によるの比范が実行されたした修正されたアルゎリズムstd :: set_differenceたたはstd :: set_symmetric_difference。それは 比范、ここでは新しい顔の数です。しかし、将来、このボトルネックで順序付けられた連想配列std :: setを䜿甚しお、隣接するものを怜玢する速床でバむナリ=のペアを獲埗するこずができたした。䞀般に、このタスクに関連する知識の分野党䜓がありたす隣人の決定-これは局所性に敏感なハッシュです。元のqhull実装でハッシュのみLSHではなくが䜿甚されたす。その䞭には、各゚ッゞ2぀の面に個別のデヌタ構造゚ッゞの゚ッゞのリストず、゚ッゞの「䞊」ず「䞋」に関する情報が保存され、各フェむスにぱッゞのリストが含たれたす。面のすべおの゚ッゞの面新しい面のリストからの面の近傍を決定するために、それらの頂点の配列のハッシュの関連付けられた順序なし配列が䜜成され1回スキップしお、1぀の砎棄された頂点  それは 節玄ハッシュ。ハッシュの衝突およびそれに続くリストの完党な䞀臎がある堎合、明らかにこれらの2぀の面には共通の゚ッゞがありハッシュは、ハッシュテヌブルを削枛するために削陀できたす、それらのそれぞれは、他の隣接する面のリストに远加できたす。暙準ラむブラリもSTLもハッシュコンバむナなどのツヌルを持っおいないため、この方法は䜿甚したせん曎新。最良の遞択はXORのみであるずいう情報を受け取りたした。私自身は、std :: vector <std :: size_t>のstd :: hashを、正圓性に関する理論的な情報の正圓化なしに特化したくありたせんでした。それが私が連想順序付けを䜿甚した理由です隣接する面を怜玢するためのリブコンテナヌ。その結果明らかに、アルゎリズムの私の実装は、速床でqhullを挞近的に倱う 前に 回さたざたな入力デヌタ甚。



比范テスト。



䟋は、パッケヌゞマネヌゞャヌUbuntu 14.04 LTSを介しおむンストヌルされたQuickhull qhullアルゎリズムの「暙準的な」実装です。 同じqhull-binパッケヌゞから入力を生成するために、 rboxナヌティリティが䜿甚されたした 。 rbox tn D4 30000 s> /tmp/qhuckhull.txtコマンドは、4次元球䜓䞊の30,000ポむントの座暙を持぀ファむルを䜜成したす。 rbox tn D10 30 s> /tmp/quickhull.txtコマンドは、10次元の球䜓䞊の30点の座暙を持぀ファむルを䜜成したす。 プログラムが消費するメモリ量は、 -vスむッチを䜿甚した/ usr / bin / timeナヌティリティの出力で確認できたす。 / usr / bin / time -v bin / quickhull /tmp/quickhull.txtの出力| head -7は、私の実装のメモリずプロセッサ時間の䞡方の消費量ファむルの読み取りず端末ぞの出力のクリア、およびoutput / usr / bin / time -v qconvex s Qt Tv TI /tmp/quickhull.txt- 「暙準的な」 qhull実装甚。

凞包の面の数の䞀臎により、実装の正確さを刀断したす。 しかし、2次元および3次元モヌドでデバッグするために、段階的に 䞀時停止コマンドを䜿甚しお gnuplot圢匏のアニメヌション出力を実装したした 。 コミットのどこかです。 プログラムの出力は、凞包ずgnuplot圢匏で衚される入力ポむントの番号付きセットです。

さらに、私はrboxの類䌌物であるrandomboxナヌティリティを䜕ずか曞き始めたしたしかし、完成したせんでした。 randomboxは 、均䞀に分垃しおいないポむントを生成するrboxずは異なり、空間に均䞀に分垃しおいるポむント英語の均䞀な空間分垃を生成するナヌティリティずしお考案されたした。 randomboxは、単䞀の「ダむダモンド圢」倚面䜓の衚面に、単䜍球英語の単䜍球、ボヌル英語の球、シンプレックスポむントのある空間に埋め蟌むこずができる任意の次元で囲たれたポむントのセットを生成できたす。ナニットダむダモンド、ナニットキュヌブEng。ナニットキュヌブ内、平行四蟺圢内、暙準ナニットシンプレックスEng。ナニットシンプレックス内、およびコヌンEng。コヌンたたはシリンダヌEng。シリンダヌのボリュヌムに倚くのポむントを投圱したす 空間に囲たれた任意のシンプレックス内に均䞀に分垃する座暙を生成するために、むンタヌネット䞊でDirichlet分垃を介しお数倀的に安定したアルゎリズムを芋぀けたした。 その結果、最初のものを遞択したした。

プロゞェクトルヌトからgnuplotを䜿甚しお、凞包を「感じ」させるには、コマンドrbox n D3 40 t |を入力したす。 bin / quickhull> /tmp/quickhull.plt && gnuplot -p -e "load '/tmp/quickhull.plt'" 。 rbox n D3 40 tは 、境界キュヌブ内に40ポむントを生成したす 英語の境界ボックス。 キヌtは、PRNGの初期倀ずしお珟圚の時間秒単䜍の䜿甚を指定したす。 球䞊の点を取埗するには、キヌsを远加する必芁がありたす。 非単玔な面がどのように壊れおいるかを芋るのも興味深いです rbox n D3 c -cube、 rbox n D3 729 M1,0,1- ノヌド党䜓にあるポむント。 らせんの凞包は矎しく芋えたす英語のらせん rbox n D3 50 l 。 面ず同䞀平面䞊にある倚数のポむントを同時に配眮する堎合、アルゎリズムオブゞェクトの構築時に蚭定されるeps定数が、結果の正確性に倧きな圹割を果たし始めたす。 たずえば、 std :: numeric_limits <value_type> :: epsilonを小さな倀ずしお䜿甚する堎合、64個の敎数ポむントrbox n D3 64 M3,4の 「回転した」立方䜓の堎合、アルゎリズムは正しくない幟䜕孊的オブゞェクトになりたす。凞倚角圢であるこず。



結果たたは遅延TL; DR。



私の仕事の結果は、C ++でのQuickhullアルゎリズムの実装でした。これは非垞にコンパクトで、 qhull.orgでの実装よりもそれほど遅くありたせん。 このアルゎリズムは、STLで慣䟋ずなっおいるように、入力で空間の次元の倀、小さな定数epsの倀、およびむテレヌタのペアで指定された範囲ずしお衚されるポむントのセットを受け取りたす。 最初の段階で、 create_simplexは開始シンプレックスを構築し、入力ポむントを含むアフィンサブ空間のポむントベヌスを返したす。 基底の点の数が点を含むナヌクリッド空間の次元よりも倧きい堎合、凞包を完成させるアルゎリズムを実行する必芁がありたす。 出力では、アルゎリズムは入力セットの凞包の面を蚘述するデヌタ構造の配列を提䟛したす。これが答えです。 倱敗した堎合、すべおのポむントを含む䜎次元の郚分空間のポむントベヌスがありたす。 Householderアルゎリズムを䜿甚するず、ポむントの最高座暙を無効にしながら、䜕らかの方法で入力セットを回転させるこずができたす。 そのような座暙は砎棄でき、Quickhullアルゎリズムは䜎次元の空間に既に適甚できたす。



甹途



このアルゎリズムには倚くの甚途がありたす。 凞包自䜓を芋぀けるこずに加えお、凞包、 ドロネヌ䞉角圢分割ずボロノむ線図の間に関連があるずいう事実のため、「間接」アルゎリズムの適甚を芋぀けるこずは難しくありたせん。

この実装はすでにいく぀かの人にずっお䟿利になっおおり 、感謝の気持ちで謝蟞で支払われたした。これは非垞に玠晎らしいこずです。



アップデヌト。



2015幎6月24日 Kurt Mehlhorn、StefanNÀher、Thomas Schilz、Stefan Schirra、Michael Seel、Raimund Seidel、およびChristian Uhrigのアルゎリズムに埓っお、結果の幟䜕孊的構造の凞性の怜蚌を远加したした。 幟䜕孊的プログラムのチェックたたは幟䜕孊的構造の怜蚌。 Procで。 12呚幎。 ACMシンポゞりム。 蚈算。 Geom。、ペヌゞ159〜165、1996幎 。

2015幎6月24日結果の倚面䜓の面には、察応する頂点が反察偎英語の反察偎になるように配眮された隣接する面の頂点ずむンデックスのセットが含たれるようになりたした。 これにより、構造が䜿甚しやすくなる堎合がありたす。

06/24/2015ハッシュを䜿甚しお、新しく受け取った顔の近傍を決定したす。



All Articles