【发布时间】:2018-06-25 14:23:14
【问题描述】:
简短介绍: 我有一个由外表面表示的主体,以 STL 形式给出(一组三角形元素及其指向外部的法线向量)。 我正在尝试检测坐标给出的点是在身体内部还是外部。
问题: 如何找到离给定点最近的元素? 更具体地说,假设您找到了离该点最近的顶点,并且该顶点由两个(或更多)元素共享。哪个是“最近”的? 请注意,最终结果是确定该点是在身体内部还是外部。简单的法线距离(与法线的点积)不能解决问题,并且可能会导致基于哪些元素选择了共享节点而产生歧义。 使用元素的质心也是有问题的。
欢迎提出任何建议和想法(尤其是来自以前参与过此问题的人)!
编辑: 我会让这个问题稍微难一些。假设有一个开放的表面(但它覆盖了整个域,因此每个点都位于表面的两侧之一,无论是向内还是向外,都基于相对于法线的方向。 这也需要使用相同的方法来回答。
编辑2: 找到答案了!
希望这会有所帮助!
【问题讨论】:
-
通常的方法是从查询点向任意方向射出一条射线,并计算与表面的交点。如果您的表面很小,您可以测试所有三角形的交点。或者您可以使用加速数据结构(网格、kd-tree、包围体层次结构...)
-
我以前见过这种方法——但是它是有问题的。 1. 查看我的编辑评论 2. 我正在使用的复杂体在几个处理器之间拆分以节省运行时间。这对我没有用。
-
STL 不支持开放曲面。对于命中测试,您根本不需要最近的三角形或顶点,只需从 bbox 外的任何位置开始,指向与该方向不平行的任何三角形的中心(所以
|dot(direction,triangle_normal)|>0.0)
标签: math stl geometry nearest-neighbor cad