我搜索并搜索了这个问题,但我无法理解我找到的任何答案。我的问题很简单:
有一个网格(由三角形构建的3D非凸多边形),我扫描空间(xyz),我需要找到网格“内部”的所有点,以便以后处理。我再说一遍,我已经看到了很多答案,但我无法理解它们。
周围有人帮忙吗?
答案 0 :(得分:1)
我假设你试图找出一个给定的点是否在网格中(否则,显然有无限量的点)。
一个简单的解决方案是从该点(任何方向)投射光线,并计算与其相交的三角形的交点数量。如果数字是奇数,则该点在内部。当光线撞击边缘或顶点时,必须小心将其计为一个交叉点。 光线和三角形的交点是通过将一条线与一个平面相交来完成的,检查该点属于光线并位于三角形内。
答案 1 :(得分:0)
检查每个点以查看它是否在网格中可行,但我们可以从性能角度做得更好。
您的当前方法将在O(x*y*z*t)
中运行,假设点x
y
z
t
,并且网格有O(x*y*t)
个面。
将在for each X in [0,1] {
for each Y in [0,1] {
Let P be a list of points of intersection between the mesh and the line from (X,Y,0) to (X,Y,1)
Sort P into ascending order of z-coordinate
Let I be false
for each Z in [0,1] {
if Z > P[0] {
I = !I
pop P[0] off the list
}
if( I ) {
point (X,Y,Z) is inside the mesh
}
}
}
}
中运行的替代方法是考虑穿过网格的网格线 - 找到线与网格之间的交点。应该有偶数个交叉点。一旦这些交叉点被排序,它们就定义了位于网格内的线的区域。
然后,生成位于这些区域的线上的点就很简单了。
粗略地(假设网格位于单位立方体内):
{{1}}