したがって、単に実装しようとしている場合は、おそらくすべての三角形のグローバル検索から開始します。各三角形の 2 次元点の重心座標を計算し、重心座標がすべて正である三角形を見つけ、次に、それらを使用して 3d にマップします (stu の位置に 3d ポイントを掛けます)。最初にこれを行い、十分に高速でない場合にのみ、より複雑なものを試します。
2 次元の点ではなく三角形で反復できる場合、重心法はおそらく十分に高速です。しかし、マッピングする必要がある任意の位置に多数の 2D ポイントがあり、ポイントはフレームごとに位置が変わるようです。
このような状況の場合は、フレームごとにローカル アップデートを実装することで、大幅な高速化が得られる可能性があります。各 2d ポイントは、それがどの三角形の中にあるかを覚えています。それを現在の三角形として設定します。新しい位置が現在の三角形内にあるかどうかをテストします。そうでない場合は、メッシュをターゲットの 2d ポイントに最も近い隣接する三角形に移動します。エッジに隣接する各三角形は、エッジ上の 2 つの共通点と別の点で構成されます。エッジに隣接する三角形の他のポイントのうち、ターゲットに最も近いポイントを見つけて、それを現在のポイントとして設定します。それから繰り返します - それはかなり早く見つけるべきだと思いますか? 各三角形の最大サイズをキャッシュすることもできます。
しかし、コメントで述べたように、凹み、穴、または個別の接続されたコンポーネントを持つメッシュで問題が発生する可能性があり、局所的な最小値に陥る可能性があります。これに対処するには、いくつかの方法があります。最も簡単な方法は、訪問したすべての三角形のリストを保持し (三角形のフラグ、 vector< bool > または set<三角形インデックス > として)、三角形の再訪問を拒否することだと思います。現在の三角形のすべての近隣を訪問したことがわかった場合は、グローバル検索に戻ります。このような失敗はめったに起こらない可能性が高いため、パフォーマンスがそれほど損なわれることはありません。
この種のフレームごとの更新は非常に高速であり、三角形を含む最初の部分を計算するためのまともなアプローチでさえあるかもしれません - ランダムな三角形を選択してそこから歩くだけです (n 個すべての三角形をチェックすることから、おおよそ aターゲットへの直線)。十分に高速でない場合は、2d メッシュ ポイントの kd ツリー (または類似のもの) と、各メッシュ ポイントの単一の接触三角形インデックスを保持することができます。反復をシードするには、kd ツリーでターゲットの 2d ポイントに最も近いポイントを見つけ、隣接する三角形を現在の三角形に設定してから反復します。