如何在多边形网格中进行三角形内部测试?


10

在此处输入图片说明(V1, V2, V3)在规则三角形网格上随机选择了3个顶点。对于这3个顶点,我已经计算出它们之间的测地线距离和路径(通过使用Dijkstra),并形成了一个如上图所示的三角形表面。

现在,我有了每个路径中的顶点,并且可以计算到给定顶点的测地距离。

我要做的是获取位于三角形区域的顶点或三角形。我怎样才能做到这一点?


2
假设重心方法可以实现我认为的功能,那么使用大型方法会很慢。想象一个900万个顶点的集合,而所需集合中只有9个顶点。当v1,v2和v3为您提供所需的所有信息时,为什么要迭代整个集合。洪水填充答案将是最快的灵活解决方案。尽管不灵活,但是如果可以假设您现在拥有几何中的线,那么扫描线将是最快的方法。
安德鲁·威尔逊

对于性能问题,您绝对正确。我想在大型网格物体中使用这种方法,所以我正在寻找一种有效的方法。实际上,我对泛洪填充和扫描填充算法都不熟悉,我将对其进行介绍。谢谢。
mkocabas

3
带有图的洪水填充将从一个节点开始,如果满足边界条件但没有被访问,则访问每个邻居节点,将其标记为已访问,然后重复(递归)。变更:将路径上的每个节点标记为已访问,并从集合内的一个节点开始。然后只需使用访问检查作为边界条件。
安德鲁·威尔逊

感谢您的详细解释。我发现洪水填充算法更合理,但我想同时实施洪水填充和扫描线,然后比较性能。
mkocabas

Answers:


4

有一种替代方法依赖于洪水填充。首先将边缘数据排列成一个循环,在该循环中边缘形成逆时针循环。然后从循环上的任意点开始,并选择连接该点的边。使用出站边界边缘并将其与另一个出站边缘交叉,如果它指向面法线的方向,则该边缘将被包括在内,如果不丢弃的话。从该边缘继续直到您到达边界边缘,然后终止填充。在尚未访问的边界边缘顶点处继续。


我对洪水填充算法不熟悉。您的解释对我来说似乎有点复杂。您能否提供一个体面的参考资料看一下?谢谢。
mkocabas

我通过阅读一些解决方案。谢谢。
mkocabas

3

我已经评论过洪水填充的用法,以及它如何变得更好,因为它更灵活,但另一个可行的解决方案是scanline。(我之所以说是可能的,是因为它对您的几何形状做出了许多假设,但对于所示的特定集合和许多类似的假设,它都可以使用。)

对于具有3个点的示例:从线段v1,v2和v3所在的线中找到交点顶点。(顶点位于v2的左上角)我们将其称为顶点v4。

For every vertex pair a,b down v1,v4 and v1,v3 
    For every vertex from a to b
        Mark as in the set
For every vertex pair a,b down v3,v2 and v4,v3
    For every vertex from a to b
        Mark as in the set

在此处输入图片说明

之所以称为扫描线,是因为(在上图中)您同时沿红线和绿线走,然后沿走线同时扫描红线和蓝线。

如果存在索引模式(通常是这种情况),则此解决方案将非常快。否则,将需要进行计算以确定哪个相邻顶点位于该线上。

有趣的是,扫描线,重心测试(在三角形边界框中)和泛洪填充都是在3d渲染中绘制三角形的方式。


2

我认为您可以为表面上的每个点计算一些表面绑定的重心坐标,然后使用它们来检查三角形的内部或外部。

我手头没有确切的算法,但是我发现下面的这篇论文似乎确实可以处理这种坐标。

表面上的重心坐标


感谢您的回答和参考文件。我将尝试实施建议的方法。
mkocabas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.