假设我有一组点,我之间有线/边。所有这些边缘在我的点的凸包内创建非重叠的三角形。所有点都连接到三角形。
如何有效地检查哪个点是哪个三角形的一部分?我可以检查每个边缘的入射点并逐渐构建三个点,但听起来非常慢(o(n ^ 2)?)。 是否有类似于线路的东西或那样做?
欢呼声。
答案 0 :(得分:3)
如果你有一个像你所描述的二维设置,那么你有一个完全三角形的平面图(当你排除端点时没有相交的边),它跨越你的点的凸包。在这种情况下,如果根据它们与顶点形成的角度对每个顶点周围的边进行圆形排序,则可以确定每对相邻边都是三角形。此外,如果对每个顶点执行此过程,则可以通过这种方式找到每个三角形。迭代所有顶点时,每个三角形将被找到3次。您可以使用哈希表来检测重复项,也可以在完成识别重复项时对所有三角形进行排序。如果你使用哈希表,那么如果你有V个顶点那么整体复杂度是O(V log d),其中d是顶点的最大度数(因为你有一个顶点数量的边缘总数是线性的平面图)。因此,绝对最坏情况是O(V log V),如果您对所有三角形进行排序以查找重复项(因为最大三角形数量在顶点数量上也是线性的),这是最坏的情况。使这项工作的唯一警告是你需要知道每个顶点的邻居顶点(即偶然边缘)。
答案 1 :(得分:1)
边缘定义了无向图G
,三角形是G
中带有length=3
的周期集。
几何三角剖分通常具有相对较低的节点度(度d
是与每个节点相邻的边数,d<=10
是几何三角剖分的典型值),因此,这是一个相当有效的{{ {1}}可用于构造三角形集的算法。
设置类似图形的数据结构,支持访问每个节点旁边的边缘列表。
迭代所有节点。考虑与给定节点O(n*d^3)
相邻的所有边对。对于与i
相邻的给定边对,我们有一个潜在的节点三元组i
。如果存在连接节点i,j,k
的边,则此三元组为三角形,可以通过扫描j,k
的边列表来检查。
j,k
的简单实现将生成重复的三角形。维护三角形的哈希表以拒绝重复的三元组。
我假设边缘定义了一个有效的不相交三角剖分,不相交等等。
希望这会有所帮助。