四边形网格处理——沿Edge遍历 & 矩形域顶点提取

        记录最近遇到的一个问题和解决方案。

        最近遇到的问题:将一个五边形划分为四边形网格。

        参考文献《Closed -form Quadrangulation of n-Sided Patches》,划分方式如下图所示,实际上是在五边形中间添加了一个顶点,顶点分别向五边形的5条边各引出一条分割线,将五边形划分成了5个四边形区域,再将5个四边形区域分成更细小的四边形网格。

                ​​​​​​​        ​​​​​​​        ​​​​​​​        ​​​​​​​        

        假如划分后的整体四边形网格已得到,如何得到分割的5块四边形区域网格,并将其顶点按照矩形域的形式(形如N行M列)排好呢?此问题可整理为:

输入: quadMesh -- 四边形网格;

            corners     -- 五边形5个角点的vid;

            sides        -- 各条边(side)的vid集合;

            mpoint      -- 中间的分界点;上图中的红点;

输出

            patchMesh  -- mpoint分割出来的5个四边形区域的顶点,顶点整理成N*M的形式

大致思路

          1. 遍历mpoint邻接的所有四边形;

          2. 对每一个四边形,找到与mpoint邻接的两个Edge;

          3. 分别沿这两条Edge向边的方向遍历,直到抵达五边形边界;

           四边形网格沿Edge遍历的大致思路,Edge首尾点分别为a,b,首先分别找到a,b邻接的所有面,取b邻接面的所有与b邻接的顶点,从这些顶点中再筛选出不属于a的邻接面的顶点,即沿Edge遍历的下一个顶点。

          4. 固定一条EdgeA为矩形域首行点,另一条EdgeB为矩形域首列点;那么矩形域顶点的行数为EdgeB的顶点数,矩形域顶点的列数为EdgeA的顶点数。

          5. 从第2行开始,根据前一行顶点位置,和当前行第一个顶点的位置,查找并填充当前行的所有顶点,直到所有行顶点填充完毕。

        这里需要实现已知面的三个顶点ID,搜索该面ID及余下一顶点的ID。搜索面ID的时候,从三个顶点的邻接面中搜索即可。

        代码使用C++\vcglib实现。

        代码基于quadwild-bimdf项目修改(GitHub - cgg-bern/quadwild-bimdf: QuadWild extended with BiMDF solver)。五边形mpoint的编号固定为3。

 //Get polymesh
            PolyMeshType quadrangulatedChartMesh;
            QuadRetopology::internal::eigenToVCG(quadrangulationV, quadrangulationF, quadrangulatedChartMesh, 4);

            vcg::tri::UpdateTopology<PolyMeshType>::FaceFace(quadrangulatedChartMesh);
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值