三角形メッシュで表される境界で定義された3D多面体を考えると、与えられた3D点が多面体の内部に属するかどうかを決定するアルゴリズムはどのように実装できますか?3D点が3D多面体の中にあるかどうかをテスト
答えて
この機能を実装する方法はいくつかあります。
最も簡単なのは、ポイントから始まって任意の方向に向かって無限光線(または非常に長いセグメント)を作成し、次に光線と三角形の間の交差点の数を数えることです。交点の数が奇数の場合、点は多面体の内部にあります。今
Inside(Polyhedron P, point q)
Segment S = [q, q+(0,0,1e30)]
count = 0
For each triangle T of P
If Intersect(S,T)
count = count + 1
End if
End for
return odd(count)
End
セグメントと三角形との交点が存在するか否かを計算する関数:ここで二つの大きな落とし穴がある
Orient3d(a,b,c,d)
// Computes the sign of the signed volume
// of the tetrahedron (a,b,c,d)
return Sign(dot(cross(b-a,c-a),d-a))
End
:
Intersect([q1,q2],(t1,t2,t3))
s1 = orient3d(q1,t1,t2,t3)
s2 = orient3d(q2,t1,t2,t3)
// Test whether the two extermities of the segment
// are on the same side of the supporting plane of
// the triangle
If(s1 == s2)
return false
End if
// Now we know that the segment 'straddles' the supporing
// plane. We need to test whether the three tetrahedra formed
// by the segment and the three edges of the triangle have
// the same orientation
s3 = orient3d(q1,q2,t1,t2)
s4 = orient3d(q1,q2,t2,t3)
s5 = orient3d(q1,q2,t3,t1)
return (s3 == s4 AND s4 == s5)
End
最後に、orient3d機能:
Orient3dコンピューティング時に浮動小数点精度が不十分な場合はどうなりますか?
選択したセグメントが 頂点または三角形のエッジを正確に通過するとどうなりますか?
については、任意の精密算術[1]を使用しなければならない。 [2]のリファレンス[1](Jonathan Shewchuk)の著者が公開しているorient3d()の実装があります。私自身のプログラミングライブラリであるGeogramの実装もあります[3]。
2の場合は、より厄介です。記号的な摂動を実装するのが最良の方法です[4]。つまり、ポイントが時間によってパラメータ化された軌道に沿って移動していることを考慮し、時間がゼロになるときの位置の制限をとることによって、orient3d()がゼロを返す構成を明確にすることです(別の言い方をすれば、位置が答えを与えない場合は、時刻t = 0の「速度ベクトル」を見てください)。オリジナルの参考文献[4]は、 "ポリゴンの点"テスト(問題の2D版)のorient2d()の記号的な混乱を示しています。
注:怠惰で、象徴的な摂動を実装したくない場合は、orient3d()テストのいずれかがゼロを返すたびにランダムな方向を選ぶことができます(永久には検索されないという保証はありません実際には起こりそうもない)。とにかく、プロトタイピングのためだけにそれを使用し、最後に象徴的な摂動を実装することをお勧めします。
[1] https://people.eecs.berkeley.edu/~jrs/papers/robustr.pdf
[2] https://www.cs.cmu.edu/~quake/robust.html
[3]
- 1. 3D点が円柱の中にあるかどうかをチェックする方法
- 2. 球の中の3D点があるかどうかを調べる
- 3. どのように球体の中の位置平面は3d as3?
- 4. JavaScriptを使用して3D多面体をモデル化する
- 5. 3D衝突の解決、AABB +多面体の移動
- 6. Three.js(面)のメッシュ3D頂点のレンダリング
- 7. 3d objファイル、頂点の順番対面
- 8. ポイントが3Dキューブ内にあるかどうかを確認
- 9. どのようにして画面の3D点を画面に合わせるか?
- 10. OpenGLは3D点から
- 11. Java 3D図面
- 12. XNA 3D点群
- 13. 3D点の問題点
- 14. ユニティ3D - 剛体
- 15. 2組の3d点
- 16. 表示面にクリップされた3D点の投影をどのように扱うべきですか?
- 17. 平面上の3D点をUV座標に変換するにはどうすればいいですか?
- 18. 3dモデルの表面上の点を計算する
- 19. ポイントが3Dライン上にあるかどうかを確認しますか?
- 20. 原点の周りの3D点を回転/ 3Dベクトルを傾ける
- 21. 3dベクトル - 別のベクトルが逆平行であるかどうかをテストする方法
- 22. aframe:3D球面コンポーネントで3Dシーンにビデオカメラを置く方法
- 23. Tテスト3D配列
- 24. Zend_Mailと= 0D = 0A = 3D = 3D = 3D = 3D = 3D
- 25. 3D平面を回転するにはどうすればいいですか?
- 26. ハッシュに多数のキーがあるかどうかのテスト
- 27. 立方体の表面/壁の合体に2d線を描く3d
- 28. gnuplotの - 3D曲面グラフ
- 29. 3dの幅と断面
- 30. THREE.Pointsで3D点をレンダリング
http://alice.loria.fr/software/geogram/doc/html/index.htmlは、実際には理解することは容易ではありません。私は後であなたの答えを受け入れるでしょう。申し訳ありません。 – isifzade
さらに詳しい説明が必要な場合はお気軽にお問い合わせください。 – BrunoLevy