从边缘/线条构造三角形的有效方法?

时间:2013-08-02 13:37:33

标签: algorithm geometry triangulation

假设我有一组点,我之间有线/边。所有这些边缘在我的点的凸包内创建非重叠的三角形。所有点都连接到三角形。

如何有效地检查哪个点是哪个三角形的一部分?我可以检查每个边缘的入射点并逐渐构建三个点,但听起来非常慢(o(n ^ 2)?)。 是否有类似于线路的东西或那样做?

欢呼声。

2 个答案:

答案 0 :(得分:3)

如果你有一个像你所描述的二维设置,那么你有一个完全三角形的平面图(当你排除端点时没有相交的边),它跨越你的点的凸包。在这种情况下,如果根据它们与顶点形成的角度对每个顶点周围的边进行圆形排序,则可以确定每对相邻边都是三角形。此外,如果对每个顶点执行此过程,则可以通过这种方式找到每个三角形。迭代所有顶点时,每个三角形将被找到3次。您可以使用哈希表来检测重复项,也可以在完成识别重复项时对所有三角形进行排序。如果你使用哈希表,那么如果你有V个顶点那么整体复杂度是O(V log d),其中d是顶点的最大度数(因为你有一个顶点数量的边缘总数是线性的平面图)。因此,绝对最坏情况是O(V log V),如果您对所有三角形进行排序以查找重复项(因为最大三角形数量在顶点数量上也是线性的),这是最坏的情况。使这项工作的唯一警告是你需要知道每个顶点的邻居顶点(即偶然边缘)。

答案 1 :(得分:1)

边缘定义了无向图G,三角形是G中带有length=3的周期集。

几何三角剖分通常具有相对较低的节点度(度d是与每个节点相邻的边数,d<=10是几何三角剖分的典型值),因此,这是一个相当有效的{{ {1}}可用于构造三角形集的算法。

  1. 设置类似图形的数据结构,支持访问每个节点旁边的边缘列表。

  2. 迭代所有节点。考虑与给定节点O(n*d^3)相邻的所有边对。对于与i相邻的给定边对,我们有一个潜在的节点三元组i。如果存在连接节点i,j,k的边,则此三元组为三角形,可以通过扫描j,k的边列表来检查。

  3. j,k的简单实现将生成重复的三角形。维护三角形的哈希表以拒绝重复的三元组。

    我假设边缘定义了一个有效的不相交三角剖分,不相交等等。

    希望这会有所帮助。