3D点内对象

时间:2013-06-15 15:17:57

标签: c++ algorithm graphics computational-geometry

我搜索并搜索了这个问题,但我无法理解我找到的任何答案。我的问题很简单:

有一个网格(由三角形构建的3D非凸多边形),我扫描空间(xyz),我需要找到网格“内部”的所有点,以便以后处理。我再说一遍,我已经看到了很多答案,但我无法理解它们。

周围有人帮忙吗?

2 个答案:

答案 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}}