VCGLib中邻接关系的维护依赖于各种单形中存储的相关信息。在VCGLib中几乎所有的算法实现都假设存在vcg::face::VertexRef,该属性存储了三个指向顶点对象的指针,可以通过V()函数访问。

面-面邻接关系

面之间的邻接关系存储于vcg::face::FFAdj(正四面体为vcg::face::TTAdj),该属性通过边来记录面之间的邻接关系。下图显示了两个三角形面:

图中顶点编号从0到2,以逆时针顺序编号,边i(i=0..2)的两个端点分别为i和(i+1)%3,因此图中面f0和面f1的公共边对f0而言是0,对f1而言是1。

对于面f的每个边e,vcg::face::FFAdj存储以下信息:

  • FFp(e):指向共享边e的面的指针,若e是border,则该指针指向自己;
  • FFi(e):在指向的面中e的索引。

例如在上图中,有:

  • f1->FFp(1) == f0
  • f1->FFi(1) == 0
  • f0->FFp(0) == f1
  • f0->FFi(0) == 1

VCGLib中对于非流形的情况也有考虑,因为只是想简单了解,没有看。

Pos

三角网格中,Pos为一三元组,pos = {v,e,f},e是f的边,v是e的端点。下图以小三角形的形式显示了三角网格中的一些pos,在每个面中,每个小三角形指向一个顶点倚靠一条边。这样就能保证任意给定一个pos c,若只改变c的三元组的一个分量,能够唯一确定一个邻居pos。

从一个pos移动到该pos的一个邻居的操作称为Flip,把改变顶点的Flip操作分别记做FlipVFlipEFlipF

例如,对于上图中的c0而言,其三元组中除了顶点,其他分量都相同的pos只有一个,即c2。记c2 = FlipV(c1)。

类似地,有:

  • c2 = FlipV(c1)
  • c0 = FlipE(c1)
  • c3 = FlipF(c0)

环绕v逆时针遍历:

  • c4 = FlipE(FlipF(c0))
  • c5 = FlipE(FlipF(c4))

在border上的情况:

  • c6 = FlipE(FlipF(c5))

环绕v顺时针遍历:

  • c3 = FlipE(FlipF(c6))
  • c1 = FlipE(FlipF(c3))

border:

  • c0 = FlipE(FlipF(c1))

可以发现,当两个flip嵌套操作的时候,根据pos与面的关系,可以实现顺时针或逆时针的pos转换。并且由于面-面邻接关系的定义方式,当pos在border上的时候,FlipF操作会返回到pos本身所在的面。

下面的例子展示了如何使用pos在顶点周围迭代

/* vcglib/apps/sample/trimesh_pos_demo/trimesh_pos_demo.cpp */
 
#include <vcg/simplex/face/pos.h> // include the definition of pos
 
//...includes to define your mesh type
 
//class MyVertex: ...
class MyFace: public vcg::FaceSimp2<MyVertex,MyEdge,MyFace, vcg::face::VertexRef, vcg::face::FFAdj>{};
 
void OneRingNeighborhood( MyFace * f)
{
  MyVertex * v = f->V(0);  
  MyFace* start = f;
  vcg::face::Pos<MyFace> p(f,0,v);// constructor that takes face, edge and vertex
  do
  {
    p.FlipF();
    p.FlipE();
  }while(p.f!=start);
}

Jumping Pos

Jumping Pos类似Pos,但在遇到border的时候不会反弹回去,而是跨到下一个border-face上去。下面这个例子中,上图中的p会从f0跨到f2。

/* vcglib/apps/sample/trimesh_pos_demo/trimesh_pos_demo.cpp */
 
#include <vcg/simplex/face/jumping_pos.h> // include the definition of jumping pos
 
//...includes to define your mesh type 
 
//class MyVertex: ...
class MyFace: public vcg::FaceSimp2<MyVertex,MyEdge,MyFace, vcg::face::VertexRef,vcg::face::FFAdj>{};
 
void OneRingNeighborhoodJP( MyFace * f)
{
  MyVertex * v = f->V(0);  
  MyFace* start = f;
  vcg::face::JumpingPos<MyFace> p(f,0,v);// constructor that takes face, edge and vertex
  do
  {
    p.NextFE();
  }while(p.f!=start);
}

顶点-面(VF)的邻接关系

VCG lib中,顶点与面之间也实现了邻接关系,即给定一个顶点v,可以找出所有与其关联的面。

设v_star = (f0,f1,f2,…,fk)为一个列表,该列表中的元素都是与顶点v关联的面。可以通过以下属性索引v_star:

  • vcg::vertex::VFAdj:这是一个顶点的属性,包含了指向f0的指针
  • vcg::face::VFAdj:这是面的属性,该面三个顶点中的每一个顶点都包含了指向v_star列表中下一个面的指针

这两个属性不仅是指针,还包含顶点在所指向的面中的索引。例如上图中,有:

v.VFp() == f2

v.VFi() == 0

f2->VFp(0) == f3

f2->VFi(0) == 1    //f2中索引为0的顶点(即v)指向了面f3,而v在f3中的索引为1

f3->VFp(1) == f1

f3->VFi(1) == 2

f1->VFp(2) == f0

f1->VFi(2) == 2

f0->VFp(2) == NULL

f0->VFi(2) == –1

英文原文地址:http://vcg.sourceforge.net/index.php/Tutorial

转载于:https://www.cnblogs.com/youthlion/archive/2012/04/21/2461025.html

VCGLib中邻接关系的实现相关推荐

  1. vcglib中面自相交的检测算法

    meshlab是基于vcglib写的, 最近需要检测mesh的自相交, 于是来看看它的源代码 static bool SelfIntersections(MeshType &m, std::v ...

  2. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  3. 图很难理解?看这篇图论基础与图存储结构就够了

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」,购票请扫码咨询 ↑↑↑ 作者 | 程序员吴师兄 转载自五分钟学算法(ID:CXYxiaowu) 1 前言 打算先普及一下图的相关理论支 ...

  4. 【数据结构与算法】图论基础与图存储结构

    前言 由于后续更新好几篇文章都涉及到 图 这种数据结构,因此打算先普及一下 图 的相关理论支持,如果后面的相关内容有些点不太容易理解,可以查阅此篇文章.本文不建议一口气阅读完毕,可以先浏览一遍,在后续 ...

  5. ospf配置命令_思科设备 OSPF 的相关知识点

    OSPF 基本配置命令 进入 OSPF 进程配置模式:Router(config)#router ospf <进程号> 在 OSPF 进程中宣告接口:Router(config-route ...

  6. 行人轨迹论文阅读SSAGCN: Social Soft Attention Graph Convolution Network for Pedestrian Trajectory Prediction

    SSAGCN: Social Soft Attention Graph Convolution Network for Pedestrian Trajectory Prediction SSAGCN: ...

  7. ISIS路由协议(1)

    ISIS路由协议 IS-IS概述 isis是intermediate system to intermediate system 的简称. IS-IS最初是国际标准化组织ISO为它的无连接网络协议CL ...

  8. OSPF(HCNA)——OSPF协议详解

    目录 1.链路状态与LSA 1.链路状态 2.LSA 2.OSPF报文的类型 3.单区域OSPF网络 1.链路状态数据库 2.最短路径树 3.OSPF路由器 4.多区域OSPF网络 5.邻居关系与邻接 ...

  9. 3.CCNP闫辉视频笔记OSPF

    简介 OSPF(开放式最短路由优先协议) IGP LS 发送的是LSA(链路状态通告Link Status Advertisement),包含的是拓扑信息.加入LSDB,用SPF计算出Routing ...

最新文章

  1. maven package和install
  2. 【Usaco2014Open银组】照相(pairphoto)
  3. 进程、线程和协程的理解
  4. Atitit.解决org.hibernate.DuplicateMappingException: Duplicate class/entity mapping
  5. 深圳市南山区派出所地址和电话列表
  6. 数据结构C语言版之线性表
  7. Thinking in Java 11.10 Map
  8. SQL Server 常用高级语法笔记
  9. 编写一个UNIX文件系统
  10. 董树义 近代微波测量技术_论文发表 | 基于微波雷达的1200米大跨悬索桥多点变形同步测量...
  11. js【点击 div 2s 后颜色变成『粉色」】
  12. 华为认证云计算HICA
  13. 阿里云批量发送短信接口Api
  14. B站大佬开发的这款无障碍看片神器火了,我有一个大胆的想法...
  15. 银行合规程序KYC、CDD、AML和TM
  16. Windows 服务器使用FTP出现“当前的安全设置不允许从该位置下载文件 警告
  17. linux下编译ts工程,linux下搭建生成HLS所需的.ts和.m3u8文件
  18. 短视频媒体怎么用手机去水印
  19. 搭建Remix IDE本地开发环境
  20. 传说中的“群控”!云控群控、线控群控到底是什么?

热门文章

  1. RHEL7及CentOS7的语言、字符编码、键盘映射、X11布局设置(localectl)-系统管理(1)...
  2. 安全漏洞问题6:SQL注入
  3. 实例协议分析RFC1483:AAL5和几种常见ADSL接入技术
  4. 如何区分数据科学家,数据工程师与数据分析师
  5. 转 SPI和API的区别
  6. Java通过 p12 建立ssl链接
  7. 【转载】BROCADE交换机配置
  8. 《深度学习》李宏毅 -- task5网络技巧设计
  9. WritableComparable排序的使用案例
  10. 数据分析的五个阶段及价值