【OpenMesh】使用迭代器和循环机
原文出处: http://openmesh.org/Documentation/OpenMesh-Doc-Latest/tutorial.html 
 这个例子展现:
- 如何使用迭代器
 - 如何使用循环机
 
这个例子是第一个版本的平滑器。我们将会介绍迭代器(iterators)和循环机(circulators)。
 
 这两个概念提供线性枚举的功能,比如网格中所有的顶点,围绕一个顶点循环,枚举所有的1-ring邻接元素。更详细的内容参考Mesh Iterators and Circulators。
 
 首先我们定义Mesh类型。这一次我使用三角网格而不是多边形网格:
#include <OpenMesh/Core/Mesh/TriMesh_ArrayKernelT.hh>
typedef OpenMesh::TriMesh_ArrayKernelT<> MyMesh;
读取将要平滑的文件:
if ( ! OpenMesh::IO::read_mesh(mesh, argv[2]) )
一个平滑迭代器由两步完成: 
 对每个顶点:计算1-ring的重心(barycenter)
 
 对每个顶点:移动顶点到重心
 
 我们可以轻松的实现顶点迭代。Mesh提供了迭代器的开始和结束分别是vertices_begin() 和 vertices_end()。
MyMesh::VertexIter v_it, v_end(mesh.vertices_end());
for (v_it=mesh.vertices_begin(); v_it!=v_end; ++v_it)
现在我们计算每个顶点的重心并存储起来:
std::vector<MyMesh::Point> cogs;
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; ++vv_it)
{
cog += mesh.point( vv_it );
++valence;
}
cogs.push_back(cog / valence);
}
计算重心完成之后,剩下的就是移动顶点到相应的重心。完整的代码如下:
#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; ++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;
}
【OpenMesh】使用迭代器和循环机的更多相关文章
- Python_Mix*函数名的使用以及第一类对象,闭包,迭代器,for循环的内部机制
		
一:函数名的应用(第一类对象) 函数名的命名规范和变量是一样的,函数名其实就是变量名, 0)函数名可以赋值给其他变量 def func(): #定义一个名为func的函数 print('my ange ...
 - 【经验】STL的list vector在iterator迭代器的循环中 使用erase 造成的BUG
		
#include <iostream> #include <list> #include <vector> using namespace std; typedef ...
 - Python中的可迭代对象/迭代器/For循环工作机制/生成器
		
本文分成6个部分: 1.iterable iterator区别 2.iterable的工作机制 3.iterator的工作机制 4.for循环的工作机制 5.generator的原理 6.总结 1.i ...
 - 7.15 迭代器 for循环的本质 生成器
		
迭代器 迭代:更新换代的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 作用 迭代器提供了一种不依赖于索引取值的方式 根据以上对于迭代的描述,如果只是简单的重复,不算迭代,如下: n ...
 - Python—day13 迭代器、迭代器对象、for循环对象、生成器、枚举对象
		
一.迭代器 1.迭代器概念: 器:包含了多个值的容器 迭代:循环反馈(一次从容器在取出一个值) 迭代器:从装有多个值的容器在一次取出一个值 ls=[3,5,7,1,9] 遍历:被遍历的对象必须是有序容 ...
 - [Day18]集合框架Collection、迭代器、增强for循环以及泛型
		
1.集合 1.1集合-本身是一个存储的容器 集合类的基本接口是Collection接口,这个接口有两个基本方法 (1)boolean add(E element) 用于向集合中添加元素,如果添加元素确 ...
 - java基础(18):集合、Iterator迭代器、增强for循环、泛型
		
1. 集合 1.1 集合介绍 集合,集合是java中提供的一种容器,可以用来存储多个数据. 在前面的学习中,我们知道数据多了,可以使用数组存放或者使用ArrayList集合进行存放数据.那么,集合和数 ...
 - python高级之生成器&迭代器
		
python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container):多个元素组织在一起的数据结构 可迭代对象( ...
 - 第三篇:python高级之生成器&迭代器
		
python高级之生成器&迭代器 python高级之生成器&迭代器 本机内容 概念梳理 容器 可迭代对象 迭代器 for循环内部实现 生成器 1.概念梳理 容器(container ...
 
随机推荐
- JS常用的标准函数
			
原文:JS常用的标准函数 1.Array类型函数 array.concat(item...) 函数功能:关联数组,实现数组相加功能,但并不影响原先数组,concat返回新数组. array.join( ...
 - PHP 4:从Login进一步看到的
			
原文:PHP 4:从Login进一步看到的 我们已经在PHP 3:从Login界面谈PHP标记谈到了PHP标记,不过其页面代码有一句 require_once('bookmark_fns.php'); ...
 - android App Widgets
			
http://developer.android.com/guide/practices/ui_guidelines/widget_design.html#design http://develope ...
 - [译]Java 垃圾回收的监控和分析
			
说明:这篇文章来翻译来自于Javapapers 的Java Garbage Collection Monitoring and Analysi 在这个系列的Java垃圾回收教程中,我们将看到可用于垃圾 ...
 - 添加MySql Metat Database 信息
			
有时候我们想看看 一个数据库上面 某种元素(比如表名)的所有信息,在Mysql上 我们可以通过引入information_schema 的方式,就可以非常方便的查看到. 添加步骤 Edit->P ...
 - 创业路(VC Pipeline),创业需要融资的阅读
			
企业家们经常问我,您的投资渠道(投资流程)到底是怎么样的? 看看有多少项目,有多少人遇到,频度,终于选择哪些公司进行了投资. 这让我认为有必要提高VC投资通道的可见度.同一时候也有助于介绍到底哪些方面 ...
 - android音乐播放器开发 SweetMusicPlayer  
智能负载直插式歌词
			
在一份书面的使用MediaPlayer播放音乐, http://blog.csdn.net/huweigoodboy/article/details/39862773.假设没有本地歌词怎么办?如今来将 ...
 - .net创建并安装windows服务案例
			
1. 创建windows服务[引用博文]: 1. 将这个服务程序切换到设计视图2. 右击设计视图选择“添加安装程序”3. 切换到刚被添加的ProjectInstaller的设计视图4. 设置servi ...
 - Node.js基础知识
			
Node.js入门 Node.js Node.js是一套用来编写高性能网络服务器的JavaScript工具包,一系列的变化由此开始.比较独特的是,Node.js会假设在POSIX环境下运行 ...
 - 2014.3.4-C语言学习小结
			
位操作: 知识点: 1.位运算符 2.位移运算符 1.将指定位设置为12.将指定位设置为03.获取指定位的内容 ==========================复习二进制 1.二进制转换 10-- ...