迭代器与循环器的使用

  • 首先,我们必须定义我们想要使用的网格类型。 这次我们使用三角形网格而不是多边形网格:
  • 我们从文件中读取要平滑的网格:
  • 一个平滑迭代分两步完成:
  1. 对于每个顶点:计算其单环邻居的重心。
  2. 对于每个顶点:将顶点移动到计算的重心。
  • 这可以使用顶点迭代器轻松实现。 网格通过vertices_begin()和vertices_end()提供开始和结束迭代器。
  • 为了计算重心,我们必须迭代当前顶点的单环邻域。 此功能由VertexVertexIter提供:
  • 现在我们可以计算每个顶点的重心并将它们存储在数组cogs中:
  • 在我们计算了重心之后,剩下要做的就是将顶点移动到相应的重心。 完整的源代码如下所示。
  • 具体的示例代码如下所示:
  • #include <iostream>
    #include <vector>
    // -------------------- OpenMesh
    #include <OpenMesh/Core/IO/MeshIO.hh>
    #include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
    typedef OpenMesh::TriMesh_ArrayKernelT<>  MyMesh;
    int main(int argc, char **argv)
    {
      MyMesh  mesh;
      // check command line options
      if (argc != 4) 
      {
        std::cerr << "Usage:  " << argv[0] << " #iterations infile outfile\n";
        return 1;
      }
      // read mesh from stdin
      if ( ! OpenMesh::IO::read_mesh(mesh, argv[2]) )
      {
        std::cerr << "Error: Cannot read mesh from " << argv[2] << std::endl;
        return 1;
      }
      // this vector stores the computed centers of gravity
      std::vector<MyMesh::Point>  cogs;
      std::vector<MyMesh::Point>::iterator cog_it;
      cogs.reserve(mesh.n_vertices());
      // smoothing mesh argv[1] times
      MyMesh::VertexIter          v_it, v_end(mesh.vertices_end());
      MyMesh::VertexVertexIter    vv_it;
      MyMesh::Point               cog;
      MyMesh::Scalar              valence;
      unsigned int                i, N(atoi(argv[1]));
      for (i=0; i < N; ++i)
      {
        cogs.clear();
        for (v_it=mesh.vertices_begin(); v_it!=v_end; ++v_it)
        {
          cog[0] = cog[1] = cog[2] = valence = 0.0;
          
          for (vv_it=mesh.vv_iter( *v_it ); vv_it.is_valid(); ++vv_it)
          {
            cog += mesh.point( *vv_it );
            ++valence;
          }
          cogs.push_back(cog / valence);
        }
        
        for (v_it=mesh.vertices_begin(), cog_it=cogs.begin(); 
             v_it!=v_end; ++v_it, ++cog_it)
          if ( !mesh.is_boundary( *v_it ) )
            mesh.set_point( *v_it, *cog_it );
      }
      // write mesh to stdout
      if ( ! OpenMesh::IO::write_mesh(mesh, argv[3]) )
      {
        std::cerr << "Error: cannot write mesh to " << argv[3] << std::endl;
        return 1;
      }
      return 0;
    }

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值