【发布时间】:2022-06-24 06:20:13
【问题描述】:
我正在编写一个 3D 有限元代码,我面临以下问题:
如果我取一个任意点(比如 x),我如何确定它在哪个元素中?
这可以简化为:如何检查任意点 (x) 是否位于(六面体)元素的内部或外部?
我已经找到的:
- 仅限于立方体:How to determine a point is inside or outside a cube?
- 仅限于矩形:https://math.stackexchange.com/questions/1472049/check-if-a-point-is-inside-a-rectangular-shaped-area-3d
与上述两种方法相反,我的问题既不是直角也不是平行面。
问题草图:
符号:(再次说明:虽然草图显示了一个规则的形状,但我们的六面体被假定为一般形状)
-
8节点六面体拓扑,节点数:0,..,7
-
轴:r,s,t
t | 4--------|-------------7 /| | /| / | | / | / | | / | / | | / | / | | / | / | | / | 5----------------------6 | | | | | | | | o------|---------s | | / | | | 0------/--------|------3 | / / | / | / / | / | / / | / | / / | / | / r | / |/ |/ 1----------------------2
我们可用的数据:
- 节点坐标(向量 P0 到 P7)
- 我们要检查的点的坐标(比如说 Px)
此外,我们假设节点的顺序如上图所示。
到目前为止我的方法/解决方案:
-
计算表面(向外)法线向量
使用叉积,例如。对于 r_pos_normal_vec(指向平面外)
r_pos_normvec = (P2-P1) x (P5-P1)对于 r_neg_normal_vec
r_neg_normvec = (P4-P0) x (P3-P0)s 和 t 方向类似
-
检查两个对角节点(我选择了节点0和节点6)
-
对于节点0
-
计算从P0到Px的向量:
P0x = Px - P0 -
计算 P0x 的内部产品和与节点 0 相邻的表面
-
-
对于节点1
- 与节点 0 的方案相同,但使用 P1 代替 P0 和法线向量的正对应项
-
-
如果所有 6 个(来自 node0 的 3 个和来自 node1 的 3 个)内积导致负值 -> 该点在六面体内部。
问题:
我在我的代码中实现了上述功能并运行了一些测试。 它似乎有效,从数学方面我很有信心。
请讨论我的方法,我很高兴任何提示/线索/建议/错误修复...... 有什么方法可以让这更快吗? 替代解决方案?
注意:
- 为了加快算法速度,可以先进行复选框检查:
- 围绕六面体构造一个矩形框:
- 获取每个方向上节点坐标的最小值和最大值。
- 如果要检查的点 (x) 在此(较大的)框之外,则它不能在六面体内。
【问题讨论】:
标签: geometry computational-geometry mesh