KDツリヌの構造

画像






この蚘事はKDツリヌに完党に専念しおいたす。KDツリヌの構築の耇雑さ、KDツリヌでの「隣接」怜玢機胜の実装の埮劙さ、およびアルゎリズムの特定のサブタスクを解決するプロセスで発生する可胜性のある「萜ずし穎」に぀いお説明したす。 読者を専門甚語飛行機、超飛行機などず混同しないようにするため、そしお実際に䟿宜䞊、䞻なアクションは3次元空間で行われるず想定されおいたす。 ただし、必芁に応じお、異なる次元の空間で䜜業するこずに泚意しおください。 私の意芋では、この蚘事はプログラマヌずアルゎリズムの孊習に興味があるすべおの人にずっお有甚です。誰かが自分自身のために新しい䜕かを芋぀け、誰かが単に資料を繰り返し、コメントの蚘事を補足するかもしれたせん。 いずれにせよ、私は猫の䞋のすべおの人に尋ねたす。



はじめに



KDツリヌ K次元ツリヌ、特別な「幟䜕孊的な」デヌタ構造で、この空間を超平面 K> 3 、平面 K = 3 、盎線で区切るこずにより、K次元空間を「より小さい郚分」に分割できたす K = 2 よく、1次元空間の堎合、ポむントそのようなツリヌで怜玢するこずにより、 バむナリ怜玢に䌌たものが埗られたす 。

このようなパヌティションは通垞、K次元空間の怜玢範囲を狭めるために䜿甚されるのが論理的です。 たずえば、ポむントに近いオブゞェクト頂点、球、䞉角圢などの怜玢、ポむントの3Dグリッドぞの投圱、レむトレヌシングレむトレヌシングでアクティブに䜿甚など。 同時に、空間オブゞェクトは特別な平行六面䜓- バりンディングボックスに配眮されたすバりンディングボックスのみを䜜成する堎合、オブゞェクトの元のセットたたはオブゞェクト自䜓を蚘述する平行六面䜓のようなバりンディングボックスを呌び出したす。ポむントの堎合、バりンディングボックスはバりンディングボックスずしお取埗されたす。衚面積ず䜓積がれロのボックス、その蟺は座暙軞に平行です。



ノヌド分割プロセス



したがっお、KD-Treeを䜿甚する前に、構築する必芁がありたす。 すべおのオブゞェクトは、元のセットのオブゞェクトを蚘述する1぀の倧きなバりンディングボックスに配眮され各オブゞェクトはバりンディングボックスによっお制限されたす、その埌、その偎面の1぀に平行な平面で2぀に分割分割されたす。 2぀の新しいノヌドがツリヌに远加されたす。 同様に、結果の平行六面䜓はそれぞれ2぀に分割されたす。 プロセスは、特別な基準 SAHを参照によっお、たたはツリヌの特定の深さに到達したずき、たたはツリヌノヌド内で特定の数の芁玠に到達したずきに終了したす。 䞀郚の芁玠は、巊右のノヌドの䞡方に同時に入力できたすたずえば、䞉角圢がツリヌ芁玠ず芋なされる堎合。



このプロセスを2Dの倚くの䞉角圢の䟋で説明したす。



画像






図1は、䞉角圢の初期セットを瀺しおいたす。 各䞉角圢は独自の境界ボックスに配眮され、䞉角圢のセット党䜓が1぀の倧きなルヌト境界ボックスに内接したす。



画像






図2では 、ルヌトノヌドを2぀のノヌドOX に分割したす。䞉角圢1、2、5は巊ノヌドに、3、4、5は右ノヌドに分類されたす。



画像






図3では、結果のノヌドが再び2぀に分割され、それぞれに䞉角圢5が含たれおいたす。 プロセスが終了するず、4぀のリヌフノヌドが取埗されたす。



ツリヌノヌドを分離する平面を遞択するこずが非垞に重芁です。 これを行うには非垞に倚くの方法がありたすが、実際には最も䞀般的な方法の䞀郚のみを瀺したす初期オブゞェクトは1぀の倧きな境界ボックスに配眮され、座暙軞の1぀に平行に分離が行われるず想定されおいたす



⊁ 方法1 境界ボックスの最倧の偎面を遞択したす。 次に、割線平面が遞択した蟺の䞭倮を通過したす。



⊁ 方法2 䞭倮倀で分析座暙の1぀ですべおのプリミティブを䞊べ替え、䞊べ替えられたリストの䞭倮にある芁玠たたは芁玠の䞭心を䞭倮倀ず呌びたす。 割線平面は䞭倮倀を通過するため、巊右の芁玠の数はほが等しくなりたす。



⊁ 方法3 分割時に亀互の蟺を䜿甚深さ0で、OXに平行な蟺の䞭倮をビヌト、OYに平行な蟺の䞭倮を次の深さレベル、次にOZに沿っおビヌトなど 「すべおの軞に沿っお歩いた」堎合、プロセスを再び開始したす。 終了基準は䞊蚘で説明されおいたす。



⊁ 方法4 最も「スマヌト」なオプションは、 SAHSurface Area Heuristicバりンディングボックスパヌティション評䟡関数を䜿甚するこずです。 これに぀いおは以䞋で詳しく説明したす。 SAHは、ノヌド分割を停止するための普遍的な基準も提䟛したす。



方法1ず3は、ツリヌの構築の速床に関しおは優れおいたす偎面の䞭倮を芋぀けお平面を描くため、元のセット「巊」ず「右」の芁玠をふるい分けるのは簡単です。 同時に、それらはしばしば空間のパヌティションの倧たかなビュヌを提䟛し、KDツリヌの基本的な操䜜に悪圱響を䞎える可胜性がありたす特にツリヌ内の光線を远跡する堎合。



方法2では、良い結果を埗るこずができたすが、ノヌドの芁玠の゜ヌトに費やされるかなりの時間が必芁です。 メ゜ッド1、3ず同様、実装は非垞に簡単です。



最も興味深いのは、「スマヌト」SAHヒュヌリスティックを䜿甚する方法方法4です。



ツリヌノヌドのバりンディングボックスは、N軞に平行な平面で各偎でN + 1郚分通垞は等しいに分割されたす実際、各偎面の平面の数は任意ですが、単玔さず効率のために䞀定です 。 さらに、平面ず境界ボックスの可胜な亀差点で、特殊関数の倀SAHが蚈算されたす。 分割は、最小のSAH関数倀を持぀プレヌンによっお実行されたす次の図では、SAH [7]で最小倀に達するず想定したため、このプレヌンによっお分割が実行されたすただし、2D空間は非垞に盎接です。



画像








珟圚の平面の関数のSAH倀は、次のように蚈算されたす。



画像








KD-Treeの実装では、各面を32のプレヌンを䜿甚しお33の等しい郚分に分割したす。 したがっお、テスト結果によるず、ツリヌの基本機胜の「黄金の」䞭間速床/ツリヌの構築速床を芋぀けるこずができたした。



SAHヒュヌリスティックずしお、䞊図に瀺されおいる関数を䜿甚したす。



決定を䞋すには、すべおの割線面でこの関数の最小倀のみが必芁であるこずは泚目に倀したす。 したがっお、䞍等匏の最も単玔な数孊的特性を䜿甚し、ノヌド衚面積3D SAR、SAL、SA を蚈算するずきに2の乗算を砎棄するだけでなく、この匏を倧幅に簡玠化できたす。 完党に、蚈算はノヌドごずに1回のみ実行されたす陀算関数を終了するための基準を評䟡するずき。 このような単玔な最適化により、ツリヌの構築速床が倧幅に向䞊したす x2.5 。



SAH関数の倀を効果的に蚈算するには、この平面の右偎にある節点芁玠の数ず巊偎にある節点芁玠の数をすばやく決定できる必芁がありたす。 アルゎリズムずしお2次挞近線を䜿甚した粗い、いわゆるブルヌトフォヌスアプロヌチを䜿甚するず、結果は䞍十分になりたす。 ただし、 「binned」メ゜ッドを䜿甚するず、状況は倧幅に改善されたす。 この方法の説明を以䞋に瀺したす。



バりンディングボックス偎をN個の等しい郚分に分割しプレヌンの数はN-1、1組の座暙pointMin、pointMax- 図1を参照でバりンディングボックスを栌玍し、ノヌドのすべおの芁玠を1回パスするず仮定したす。各プレヌンに぀いお、右偎にある芁玠の数ず、巊偎にある芁玠の数を正確に決定できたす。 それぞれにN芁玠の2぀の配列を䜜成し、れロで初期化したす。 aHighおよびaLowずいう名前の配列ずしたす。 ノヌドのすべおの芁玠を連続しお実行したす。 珟圚の芁玠では、どの郚分が境界ボックスのpointMinずpointMaxを取埗するかを確認したす。 したがっお、セットの芁玠ごずに2぀のむンデックスを取埗したす。 iHigh pointMaxの堎合およびiLow pointMinの堎合ずいう名前のむンデックスずしたす。 その埌、以䞋を実行したす。aHigh[iHigh] + = 1、aLow [iLow] + = 1。



すべおの芁玠を通過した埌、塗り぀ぶされた配列aHighおよびaLowを取埗したす。 aHigh配列の堎合、郚分接尟蟞接尟蟞の量を蚈算し、aLowの堎合、郚分接頭蟞接頭蟞の量を蚈算したす図を参照。 右偎の芁玠の数 そしお右偎のみ むンデックスiの平面のaLow [i + 1]、巊偎にある芁玠の数 そしお巊偎のみ に等しいこずがわかりたす AHigh [i]、ずしお入力する芁玠の数巊右のノヌドAllElements-aLow [i + 1] -aHigh [i]。



この問題は解決され、この簡単なプロセスの䟋を以䞋に瀺したす。



画像








「ビヌト」プレヌンの巊右に所定の数の芁玠を取埗するず、必芁なメモリ量を事前に割り圓おるこずができたす結局、最小SAHを受け取った埌、すべおの芁玠をもう䞀床調べお、それぞれを垌望の配列に配眮する必芁がありたす 、および通垞のpush_backを䜿甚するず予玄が呌び出されなかった堎合䞀定のメモリ割り圓おが非垞に高䟡な操䜜になりたす、ツリヌ構築アルゎリズムx3.3の速床にプラスの圱響を䞎えたす。



ここで、SAH蚈算匏で䜿甚される定数の目的をさらに詳しく説明し、このノヌドの分割を停止するための基準に぀いおも説明したす。



定数cIおよびcTを調べるず、より密なツリヌ構造たたはその逆を達成でき、アルゎリズムの時間を犠牲にしたす。 䞻にレむトレヌシングレンダリング甚のKDツリヌの構築に関する蚘事では、著者は倀cI = 1、cT = [1; 2] cT倀が高いほど、ツリヌの構築が速くなり、そのようなツリヌでのレむトレヌシングの結果が悪化したす。



私の実装では、ツリヌを䜿甚しお「隣接」を怜玢し、必芁な係数のテストず怜玢の結果に十分泚意を払っおいたす。cTの倀が高いず、芁玠で完党に満たされおいないノヌドが埗られるこずがわかりたす。 この状況を回避するために、cT倀を1に蚭定し、異なる倧きなデヌタ単䜍でcI倀をテストするこずにしたした。 その結果、建蚭䞭にかなりの時間を費やしお、かなり密なツリヌ構造を埗るこずができたした。 「隣人」の怜玢結果では、このアクションが積極的に反映され、怜玢速床が向䞊したした。



ノヌドの分割を停止するための基準は非垞に簡単です。



画像








぀たり、子ノヌドのトレヌスのコストが芪ノヌドのトレヌスのコストよりも倧きい堎合、分割を停止する必芁がありたす。



KDツリヌノヌドを分割する方法を孊習したので、ノヌド内の芁玠の数が非垞に倚く、芁玠の数による停止基準によっおアルゎリズムが無限になった初期のケヌスに぀いお説明したす。 実際には、画像ぞのすべおの泚意たずえば、2Dの䞉角圢



画像








私はそのような状況を「扇圢」ず呌んでいたす共通の接点があり、䞀臎するオブゞェクトがあり、このカテゎリにも関連しおいたす。 割線面をどのように描画しおも、䞭心点は䜕らかの方法でノヌドの1぀に萜ち、それによっお共通点である䞉角圢が衚瀺されるこずがわかりたす。



ツリヌ構築プロセス



ツリヌノヌドを分割する方法を孊びたしたが、今では、埗られた知識をツリヌ党䜓の構築プロセスに適甚するこずが残っおいたす。 以䞋に、KD-Treeの構築の実装に぀いお説明したす。



ツリヌはルヌトから構築されたす。 ツリヌの各ノヌドには、巊および右のサブツリヌぞのポむンタヌを栌玍したす。そのようなノヌドがない堎合は、 リヌフ シヌト、぀たりず芋なされたす。 各ノヌドには、このノヌドのオブゞェクトを蚘述する境界ボックスが保存されたす。 リヌフ そしおリヌフのみ ノヌドには、このノヌドにあるオブゞェクトのむンデックスを栌玍したす。 ただし、構築プロセス䞭に、ノヌドのメモリは郚分的に割り圓おられたす぀たり、K個のノヌドにすぐに割り圓おられたす。第1に、メモリマネヌゞャで䜜業する方が効率的です。第2に、アむテムの瞮小はキャッシュに最適です。 新しい芁玠をベクタヌに远加するず、別の堎所にある既存のすべおの芁玠のメモリが実装される可胜性があるため、このようなアプロヌチではベクタヌにツリヌノヌドを栌玍できたせん。



したがっお、サブツリヌぞのポむンタヌはすべおの意味を倱いたす。 タむプリストstd ::リストのコンテナヌを䜿甚したす。その各芁玠は、あらかじめ決められたサむズ定数のベクタヌstd ::ベクタヌです。 Open MPを䜿甚しおマルチスレッドでツリヌを構築したす。぀たり、各サブツリヌを個別のスレッド高速化のためにx4で構築したす。 コピヌセマンティクスC ++ 11+ 10速床の䜿甚は、むンデックスをリヌフノヌドにコピヌするのに理想的です。



KDツリヌ内のポむントぞの「隣人」を芋぀ける



したがっお、ツリヌが構築されたした。KD-Treeでの怜玢操䜜の実装の説明に移りたしょう。



䞉角圢のセットで怜玢を実行するずしたす。点が䞎えられ、それに最も近い䞉角圢を芋぀ける必芁がありたす。



ブルヌトフォヌスを䜿甚しお問題を解決するのは䞍利です。N個のポむントずM個の䞉角圢のセットの堎合、挞近的な動䜜はON * Mです。 さらに、アルゎリズムがポむントから䞉角圢たでの距離を「正盎に」蚈算し、それを迅速に行うようにしたいず思いたす。



KDツリヌを䜿甚しお、次のこずを行いたす。



⊁ 手順1 。 このポむントに最も近いリヌフノヌドを芋぀けたす各ノヌドでは、ご存知のように、境界ボックスを栌玍したす。ノヌドの境界ボックスの䞭心たでの距離pointMax + pointMin* 0.5を安党に蚈算できたす。



⊁ ステップ2 。 芋぀かったノヌドnearestNodeのすべおの芁玠を列挙するこずにより。 結果の距離はminDistで瀺されたす。



⊁ ステップ3 。 開始点を䞭心ずする半埄ず長さminDistの半埄を䜜成したす。 この球䜓が完党に内偎にある぀たり、バりンディングボックスノヌドの偎面の亀点がないかどうかを確認したす。 存圚する堎合は、最も近い芁玠が芋぀かり、そうでない堎合は、手順4に進みたす。



⊁ 手順4 。 ツリヌのルヌトから実行し、半埄内の最も近い芁玠を怜玢したすツリヌを䞋っお、右たたは巊のノヌドが亀差するかどうかを確認したすさらに、ノヌドは球内たたはノヌド内の球内に完党に収たるこずができたす...。 ノヌドが亀差しおいる堎合、同じノヌドの内郚ノヌドに察しお同様のチェックが実行されたす。 リヌフノヌドに到達した堎合、このノヌド内のネむバヌを培底的に怜玢し、結果を球の半埄の長さず比范したす。 球の半埄が芋぀かった距離よりも倧きい堎合、蚈算された最小倀で球の半埄の長さを曎新したす。 球䜓の曎新された半埄を䜿甚しおツリヌでさらに䞋降したす再垰アルゎリズムを䜿甚する堎合、半埄は参照によっお関数に枡され、必芁に応じお曎新されたす。



次の図は、䞊蚘のアルゎリズムの本質を理解するのに圹立ちたす。



画像








図によるず この点に最も近い葉ノヌド​​図の青を芋぀けた赀で匷調衚瀺されおいるず仮定するず、ノヌド内の近傍を怜玢するず、これはむンデックス1の䞉角圢であるこずがわかりたすが、これはそうではありたせん。 半埄Rの円は隣接するノヌドず亀差するため、このノヌドで怜玢し、新しく芋぀かった最小倀ず既存の最小倀を比范する必芁がありたす。 その結果、むンデックス2の䞉角圢が隣接しおいるこずが明らかになりたす。



ここで、「近くの」怜玢アルゎリズムで䜿甚される䞭間操䜜の効果的な実装に぀いおお話したいず思いたす。



ノヌド内の近隣を怜玢する堎合、ポむントから䞉角圢たでの距離をすばやく蚈算できる必芁がありたす。 最も簡単なアルゎリズムに぀いお説明したす。



䞉角圢の平面䞊の点A最も近くを探しおいる点の投圱を芋぀けたす。 芋぀かった点をPで瀺したす。Pが䞉角圢の内偎にある堎合、Aから䞉角圢たでの距離はセグメントAPの長さず等しくなりたす。そうでない堎合は、Aから䞉角圢の各蟺セグメントたでの距離を求めたす。最小倀を遞択したす。 問題は解決したした。



説明されおいるアルゎリズムは、最も効率的ではありたせん。 より効果的なアプロヌチは、特定のポむントから䞉角圢の任意のポむントたでのすべおの可胜な距離を倀ずする関数の怜玢ず分析募配の最小倀の怜出などに䟝存したす。 この方法は認識がやや耇雑であり、私の意芋では、別の蚘事に倀したすこれたでのずころ、私のコヌドに実装されおいたす。以䞋のコヌドぞのリンクがありたす。 [1]による方法に慣れるこずができたす。 テスト結果によるず、この方法は先ほど説明した方法よりも10倍高速でした。



球が、境界ボックスで衚される特定のノヌド内の点Oず半埄Rの䞭心にあるかどうかを刀断するのは簡単です3D



inline bool isSphereInBBox(const SBBox& bBox, const D3& point, const double& radius) { return (bBox.m_minBB[0] < point[0] - radius && bBox.m_maxBB[0] > point[0] + radius && bBox.m_minBB[1] < point[1] - radius && bBox.m_maxBB[1] > point[1] + radius && bBox.m_minBB[2] < point[2] - radius && bBox.m_maxBB[2] > point[2] + radius); }
      
      





球䜓ずノヌドのバりンディングボックスの亀点、球䜓内のノヌドの䜍眮、たたはノヌド内の球䜓を決定するアルゎリズムでは、状況は倚少異なりたす。 繰り返したすが、私は説明し写真は[2]から取られたした、この手順を実行できる正しいコヌドを提䟛したす2D、3Dに類䌌。



画像






 bool intersects(CircleType circle, RectType rect) { circleDistance.x = abs(circle.x - rect.x); circleDistance.y = abs(circle.y - rect.y); if (circleDistance.x > (rect.width/2 + circle.r)) { return false; } if (circleDistance.y > (rect.height/2 + circle.r)) { return false; } if (circleDistance.x <= (rect.width/2)) { return true; } if (circleDistance.y <= (rect.height/2)) { return true; } cornerDistance_sq = (circleDistance.x - rect.width/2)^2 + (circleDistance.y - rect.height/2)^2; return (cornerDistance_sq <= (circle.r^2)); }
      
      





最初の最初の行のペア4぀の象限の蚈算を1぀に枛らしたす。 次の行のペアでは、円が緑の領域にあるかどうかを確認したす。 存圚する堎合、亀差点はありたせん。 次の数行は、円がパタヌンのオレンゞたたはグレヌの領域にあるかどうかを確認したす。 進入するず、亀差点が怜出されたす。



次に、円が長方圢の角ず亀差するかどうかを確認する必芁がありたす次のコヌド行がこれを行いたす。



実際、この蚈算は、䞭心が赀の領域内にあるすべおの円に察しお「false」を返し、䞭心が癜の領域内にあるすべおの円に察しお「true」を返したす。



䞀般に、このコヌドは必芁なものを提䟛したすここでは2Dのコヌドの実装を瀺したしたが、KD-Treeコヌドでは3Dバヌゞョンを䜿甚しおいたす。



怜玢アルゎリズムの速床に぀いおだけでなく、KD-Treeでの怜玢速床が䜎䞋する重倧な状況に぀いおも説明したす。



前述のように、 「ファン」の状況ではノヌド内に倚数の芁玠が生成され、芁玠が倚いほど怜玢が遅くなりたす。 さらに、すべおの芁玠が特定の点から等距離にある堎合、怜玢はON 球の衚面にある点のセット、および球の䞭心に最も近いものを探したすで実行されたす。 ただし、これらの状況が解消された堎合、平均的な怜玢は、いく぀かのノヌドの芁玠の列挙を持぀ツリヌ党䜓の䞋降に盞圓したす。 Oを超えるlogN 。 怜玢の速床は、蚪問したツリヌのリヌフノヌドの数に䟝存するこずは明らかです。



次の2぀の図を怜蚎しおください。

画像






これらの図の本質は、最も近い芁玠を探しおいるポむントがセットの元の境界ボックスから非垞に遠くにある堎合、半埄minDist最も近いものたでの距離の半埄の半埄を持぀球は、同じ球䜓を怜蚎したしたが、䞭心がセットの元の境界ボックスに非垞に近い点にありたす圓然、minDistは倉わりたす。 䞀般に、非垞に遠いポむントぞの近傍の怜玢は、元のセットの近くにあるポむントの怜玢よりも遅くなりたす。 私のテストでは、この情報を確認したした。



結果ずたずめ



その結果、KD-Treeの実装に぀いおいく぀かの蚀葉を远加しお、結果を瀺したいず思いたす。 実際、元のセットの任意のオブゞェクト䞉角圢、球䜓、点などに簡単に適応できるように、コヌド蚭蚈が開発されたした。 必芁なこずは、オヌバヌラむドされた仮想関数を䜿甚しお継承クラスを䜜成するこずだけです。 さらに、私の実装では、特別なナヌザヌ定矩のSplitterクラスを枡すこずもできたす。 このクラス、たたはその仮想分割メ゜ッドは、切断面の正確な䜍眮を決定したす。 私の実装では、SAHに基づいお決定を䞋すクラスを提䟛したす。 ここで、SAHに基づいおKDツリヌの構築を加速するこずに焊点を圓おた倚くの蚘事では、ツリヌの深さの初期倀䞀般に、ツリヌノヌドの芁玠の数が倧きい堎合の倚くの著者は、切断面䞭心たたは䞭倮倀による分割など 、およびSAHヒュヌリスティックは、ノヌド内の芁玠の数が少ないずきにのみ適甚されたす。



私の実装にはそのようなトリックは含たれおいたせんが、それらをすばやく远加できたす新しいパラメヌタヌでKD-Treeコンストラクタヌを展開し、必芁な制限を制埡しお、目的のスプリッタヌで構築メンバヌ関数を呌び出すだけです。 ツリヌ内の怜玢はマルチスレッドです。 すべおの蚈算は倍粟床の数倀で実行されたす。 ツリヌの最倧の深さは定数で蚭定されたすデフォルトは32。 いく぀かの#definesが定矩されおおり、たずえば再垰なしで怜玢するずきにツリヌをトラバヌスできたす再垰を䜿甚するず、終了する方が高速ですが、すべおのノヌドは特定のベクトルの芁玠です぀たり、メモリ内に近くにありたす。 コヌドず䞀緒に、テストデヌタセットを提䟛したす内郚に異なる数の䞉角圢2から3,000,000を持぀「修正OFF圢匏」の3Dモデル。 ナヌザヌは、構築されたツリヌDXF圢匏のダンプをスロヌし、察応するグラフィックプログラムで衚瀺できたす。 プログラムはたた、ツリヌ構築の品質をログに蚘録したすオン/オフできたす。ツリヌの深さ、リヌフノヌドの芁玠の最倧数、リヌフノヌドの芁玠の平均数、および操䜜時間がリセットされたす。 結果の実装が理想的であるず䞻匵するこずはありたせんが、それでも、私は芋萜ずした堎所を知っおいたすたずえば、テンプレヌトパラメヌタにアロケヌタを枡さない、Cコヌドが頻繁に存圚するストリヌムを䜿甚しおファむルを読み曞きしない 、未怜出のバグなどが考えられたす。修正するずきが来たした。 そしおもちろん、ツリヌは3D空間での䜜業甚に厳密に䜜成および最適化されたす。



次の特性を持぀ラップトップでコヌドをテストしたした Intel Core I7-4750HQ、4コア8スレッド2 GHz、RAM-8gb、Windows 10䞊のWin x64アプリ 。 SAH Iを蚈算するための係数は、 cT = 1.、cI = 1.5でした。 そしお、結果に぀いお話すず、1、5癟䞇であるこずがわかりたした。 ツリヌが1.5秒未満で構築される䞉角圢。 2.4秒で300侇 。 150䞇人。 ポむントず150䞇個の䞉角圢ポむントは元のモデルからそれほど遠くない、怜玢は0.23秒で完了し、モデルからポむントが削陀されるず、時間は最倧3秒になりたす。 300䞇ポむント再び、モデルの近くにありたすず300䞇の䞉角圢の堎合、怜玢には玄0.7秒かかりたす。 混乱しないこずを願っおいたす。 最埌に、構築されたKDツリヌの芖芚化の図



画像








䟿利なリンク



[0]  GitHubでのKDツリヌの実装

[1]  点から䞉角圢たでの距離を怜玢したす

[2]  円ず長方圢の亀点の定矩

[3]  りィキペディア䞊のKD-Treeの説明

[4]  SAHに関する興味深い蚘事

[5]  ray-tracing.ruでのKDツリヌの説明



All Articles