镶嵌的逆任务

时间:2012-06-07 08:37:14

标签: algorithm 3d computational-geometry

作为输入,我有一组三角形,形成带孔的凹面网格。每个三角形由三个顶点组成:(vi,vj,vk),......不提供邻接信息。算法必须将具有相同法线的三角形组“结合”为多边形。所以输出是(pi,pj,pk,...,ps),......

例如(见下图),假设我们有由三角形组成的网格

(v0,v1,v4),(v1,v3,v4),(v1,v2,v3)

(v2,v6,v4),(v6,v5,v4)。

作为输出,我们有:

(P0,P1,P4)

(P1,P2,P3,P4)

enter image description here

我正在寻找解决上述问题的有效算法。任何建议,提示或文章都表示赞赏。

2 个答案:

答案 0 :(得分:2)

脱离我的头顶;

  • 对每个多边形进行三角测量,以获得一组三角形。
  • 对于所有多边形中的所有三角形,请根据法线
  • 指定组编号
  • 对于每个三角形,T =(va,vb,vc)创建邻接信息E =(ab,bc,ca),其中ab是与边缘a,b处的T相邻的三角形的链接/索引。
  • 通过搜索两个相邻三角形不属于同一组的任何边,跟踪具有相同关系的下一条边,并重复直到返回第一条边来跟踪每个新多边形的轮廓。 / LI>

请注意,您还必须在TIN外壳的边缘处与NULL边缘类型竞争,但这很简单。

这里最慢的一点是开发邻接信息,可以通过许多优秀的TIN创建算法在O(n log n)中完成。

答案 1 :(得分:1)

查看自适应网格粗化算法。这些通常用于计算流体动力学的高级软件(Ansys CFXCD-Adapco Star CCM+等)/结构动力学(Anasys等)。在给定网格的自动细化和粗化有利的情况下。

一些关于这个主题的免费论文,将给你一个强有力的起点:

  1. https://cfwebprod.sandia.gov/cfdocs/CCIM/docs/coarsening.pdf

  2. http://tetra.mech.ubc.ca/ANSLab/publications/coarsen.pdf

  3. http://www.cs.cmu.edu/~glmiller/Publications/MiTaTe98.pdf(这是相当数学的)

  4. 自适应网格细化算法领域的其他Google搜索将揭示有关该主题的类似论文。

    编辑。自适应网格粗化的基本且完善的方法是边缘折叠方法,其涉及将边缘减少到单个顶点,从而移除两个元素。 Li X.,Shephard M.S.,Beall M.W.“通过网格修改的三维各向异性网格自适应。”应用力学与工程中的计算机方法,2004。有一个很好的粗化算法,在伪代码中定义为

    for all edge in short edge list do
        for all vertex that bounds the current edge do
            if vertex is not yet tagger then
                append vertex to dynamic list
                tag vertex to be in dynamic list
            end if
        end for
    end for
    while vertices not tagged processed in dynamic list do
        get an unprocessed vertex Vi from the list
        get Ej , the shortest mesh edge in transformed space connected to Vi
        if the transformed length Ej is greater than Llow then
            remove Vi from the dynamic list
        else
            evaluate edge collapse operation of collapsing Ej with Vi removed
            if the edge collapse would create an edge longer than Lmax then
                evaluate relocated vertex Vi
            else if the edge collapse would lead to 
                at/inverted elements then
                evaluate the swaps(s)/collapse compound operation
            end if
            if any local mesh modication is determined then
                tag neighbouring vertices of Vi in the dynamic list as unprocessed
                apply the local mesh modication
                remove Vi from the dynamic list if it is collapse
            else
                tag Vi as processed
            end if
        end if
    end while
    

    这取自我过去使用的令人印象深刻的硕士论文。可以找到here

    我希望这会有所帮助。