几何算法——介绍
很早之前就想写一些几何算法相关的文章,又是总是因为各种原因一直没有开展,可能是平时懒散拖拉惯了。决定从今天开始,偶尔抽空写一些几何算法的学习笔记,与大家共同学习和探讨。
我也不知道能坚持多久,最终能写下几篇,但是且写且看吧,写一篇算一篇了。——2022.11.19,于上海
介绍
1 关于几何引擎介绍
林雪萍先生写了一篇很精彩的文章,三维cad软件核心技术是什么? 介绍3d几何引擎现状的,很精彩,值得一看。
2 关于模型的表达
CSG和B-rep边界表示法,是实体建模中常用的两种主要表示模式。
2.1 CSG (Constructive Solid Geometry )表示
在CSG表示中,固体被表示为原始固体物体的集合理论Boolean表达式,结构更简单。
优点:方法简洁,生成速度快,处理方便,无冗余信息,而且能够详细地记录构成实体的原始特征参数,甚至在必要时可修改体素参数或附加体素进行重新拼合。数据结构比较简单,数据量较小,修改比较容易,而且可以方便地转换成边界(Brep)表示。
局限:由于信息简单,这种数据结构无法存贮物体最终的详细信息,例如边界、顶点的信息等。由于CSG表示受体素的种类和对体素操作的种类的限制,使得它表示形体的覆盖域有较大的局限性,而且对形体的局部操作(例如,倒角等)不易实现,显示CSG表示的结果形体时需要的间也比较长。
2.2 Brep (Boundary Representation)表示
边界表示法(B-rep)只将实体的有向曲面描述为由顶点、边和面组成的数据结构。
优点:
1. 有较多的关于面、边、点及其相互关系的信息。
2. 有利于生成和绘制线框图、投影图,有利于计算几何特性,易于同二维绘图软件衔接和同曲面建模软件相关联。
局限:
对几何物体的整体描述能力相对较差,无法提供关于实体生成过程的历史信息,也无法记录组成几何体的基本体素的元素的原始数据,同时描述物体所需信息量较多,边界表达法的表达形式不唯一
3 关于翼边结构和半边结构
3.1 翼边结构
翼边结构于70年代由Standford大学的B.G. Baumgart 作为多面体的边界表示法提出,最早用于从图象重建三维物体中。
3.2 半边结构
半边数据结构是翼边数据结构的变形,主要出发点是要改进翼边数据结构,使其在边的数据结构的构造和使用方面更加高效。已成为主流边界表示数据结构。
4 关于边界表示法
B-rep
4.1 ACIS中的Brep表示
BODY:
最高层次的拓扑元素。
1、可以由一系列分离体组成(LUMP 链表),如图,正方体减去一个圆柱体后得到的物体由四个 LUMP组成。
2、 可以表示一个二维区域(sheet, 具体的 sheet 可以是开的)。
3、可以表示线框(称 wire body,由 wire 的链表表示。线框可以是点、折线段(开、闭)和整个物体的线框模型)。
4、 LUMP 和WIRE 两者只有其一。
LUMP:
表示连通体或连通的二维区域。具体由多个 SHELL 链表示,可以是多个SHELL。
SHELL:表示LUMP 的一个连通边界,可以是二维的,也可以是一维的。具体由一系列的FACEs 组成,或由一系列 WIREs 组成。面链的尾巴是 NULL。
NOTE:
1、SHELL 中的 FACE 指针与WIRE指针,总有一个为NULL。即表明其不能同时表示实体和线框,原因是 coedge 无法兼顾这两者。
2、SHELL 可以是开的,可以是闭的。
3、SHELL 可以是complete 和incomplete。
4、包含incomplete shell的BODY可能仅仅以其定义的边界区域(而不是一个体)参加造型操作,甚至某些情况就不允许参加操作,因此仍会有二义性。
SUBSHELL:
ACIS 将 SHELL 分解成层次结构的SUBSHELLs 表示,用以提高操作效率。由于该表示仅供系统内部使用。
FACE:
表示一张几何曲面的一部分(应为连通区域)。具体由一系列 LOOPs 表示,当 LOOP=NULL 时,表示整张曲面,可以是无界曲面。(LOOP 链的尾巴是 NULL)。
sense: 表示 Face 的法向与 Surface 的法向相同还是相反。FORWORD 表示同向,REVERSE 表示反向。
sides: 表示 Face 为 single sided or double sided。单边面表示面的一边属于体内,另一边属于体外;双边面表示或两边同时属于体内,或同时不属于体内
cont: 表示双边面是both-inside,或both-outside。前者表示体内面,后者表示二维区域。
NOTE:
1、当 FACE的 LOOP 指针为NULL 时,FACE 仅含有几何信息SURFACE,而不再有拓扑信息,从而等价于曲面模型,此时许多实体造型操作将不能作用在FACE上。
2、由于引入了sides 和cont,从而使得: 1. sheet 仅需要一个面表示,而以前均需用两个面表示(不合理,既浪费空间,又会造成操作不可靠)。2. 能够表示体内面。
LOOP:
表示FACE 的一个连通的边界。具体表示为一个COEDGE链。链可开、可闭,故遍历时的结束条件(等于 NULL 或等于 start edge)。
在 FACE 的所有环中,部分内环,外环,因对某些曲面合适,如圆柱。
对开的 LOOP,开端可以是有限的,也可以是无限的。如果有一端是有限的,则不完备,如有一端是无限的,则为无限面。
COEDGE:
表示边在面中的引用,仅与一个面相关。COEDGE 为双向链表。
COEDGE 的 partner(partner_ptr)以逆时针方向构成一个循环链,表示同一 EDGE的所有 COEDGE
Sense: 相对于EDGE的方向,FORWARD共向,REVERSE反向
Pcurve: 指向EDGE在COEDGE所属面的参数域上的曲线。
Start()、end()返回 COEDGE 的起点、末点,已考虑了 sense。
EDGE:
表示一条曲线上的一部分(可以是有界,也可以是无界)。
具体由一个 curve 指针和两个端点指针表示。端点指针可以是NULL,端点为 NULL 表示边在那端不受到限制。如果曲线在那端是无限的,则EDGE 在那端也是无限的。如果边和曲线是封闭的,则或者两端点全部为NULL,或者两端点指向同一点。
曲线指针可以为 NULL,此时必须两端点指向同一个 VERTEX,用以表示孤立点。如圆锥的顶点。
sense: 相对于curve 的方向,FORWARD 为同向,REVERSE 为反向。
VERTEX:
除有几何点指针外,包含与其相邻的一条边的指针,指针可以为空,此时表明该顶点包含一个vertex ATTRIB,其中包含多条边指针,每一条边属于该点的一个不同的伞。