1 / 37

10.1 概述 半边结构(如何表达,如何生成,如何操作) 欧拉操作 基本体元的生成 实体的布尔操作

第十章 实体造型中的基本算法及特征造型. 10.1 概述 半边结构(如何表达,如何生成,如何操作) 欧拉操作 基本体元的生成 实体的布尔操作. 10.2 半边数据结构. 当实体以边界模型存储时,翼边结构较好地描述了点、边、面 之间的拓扑关系,但它也存在着一些缺陷。因此,人们提出了 一种更完善的数据结构 —— 半边数据结构,简称半边结构。 10.2.1 半边数据结构描述 10.2.2 半边结构程序描述 10.2.3 半边数据结构的具体算法. Solid. Face. Face. Face. Edge. Edge. Edge. Vertex.

iona
Télécharger la présentation

10.1 概述 半边结构(如何表达,如何生成,如何操作) 欧拉操作 基本体元的生成 实体的布尔操作

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第十章 实体造型中的基本算法及特征造型 10.1 概述半边结构(如何表达,如何生成,如何操作)欧拉操作基本体元的生成实体的布尔操作

  2. 10.2 半边数据结构 当实体以边界模型存储时,翼边结构较好地描述了点、边、面 之间的拓扑关系,但它也存在着一些缺陷。因此,人们提出了 一种更完善的数据结构——半边数据结构,简称半边结构。 10.2.1 半边数据结构描述 10.2.2 半边结构程序描述 10.2.3 半边数据结构的具体算法

  3. Solid Face Face Face Edge Edge Edge Vertex Vertex Vertex

  4. 10.2.1 半边数据结构描述 5种节点Solid、Face、Loop、HalfEdge和Vertex的描述: typedef struct solid Solid; typedef struct face Face; typedef struct loop Loop; typedef struct halfedge HalfEdge; typedef struct vertex Vertex; typedef struct edge Edge; typedef union nodes Node;

  5. 10.2.2 半边结构程序描述 struct solid { Id Solidno; /*solid identifier*/ Face *sfaces; /*pointer to list faces*/ Edge *sedges; /*pointer to list of vertices*/ Vertex *sverts; /*pointer to list of solid*/ Solid *nexts; /*pointer to next solid*/ Solid *prevs; /*pointer to previous solid*/ };

  6. struct face { Id faceno; /*face identifier*/ Solid *fsolid; /*back pointer to solid*/ Loop *flout; /*pointer to outer loop*/ Loop *floops; /*pointer to list of loops*/ vector feq; /*face equation*/ (SURFACE *fgeom ;) Face *nextf; /*pointer to next face*/ Face *prevf; /*pointer to previous face*/ }; Face Loop Loop Loop

  7. struct loop { HalfEdge *lege; /*pointer to ring of halfedges*/ Face *lface; /*back pointer to face*/ Loop *nextl; /*pointer to next loop*/ Loop *prevl; /*pointer to previous face*/ }; Loop Halfedge Halfedge Halfedge

  8. struct halfedge { Edge *edg; /*pointer to parent edge*/ Vertex *vex; /*pointer to starting vertex*/ Loop *wloop; /*back pointer to loop*/ HalfEdge *nxt; /*pointer to next halfedge*/ HalfEdge *prv; /*pointer to previous halfedge*/ }; Halfedge vertex

  9. struct vertex { Id vertexno; /*vertex identifier*/ HalfEdge *vedge; /*pointer to a halfedge*/ vector vcoord; /*vertex coordinates*/ Vertex *nextv; /*pointer to next vertex*/ Vertex *prevv; /*pointer to previous vertex*/ };

  10. struct edge { HalfEdge *he1; /*pointer to right halfedge*/ HalfEdge *he2; /*pointer to left halfedge*/ Edge *nexte; /*pointer to next edge*/ Edge *preve; /*pointer to previous edge*/ Curve *cgeom ; };

  11. 10.2.3 半边数据结构具体算法 • 收寻面上的边 • 2. 搜索与顶点V相邻的顶点 • 3. 半边结构中数据的增删算法

  12. 10.3 欧拉操作 已知多面体的欧拉不变性定理,即对于一个顶点数为v、面数为f、边数为e的多面体,恒有如下性质: ve+f = 2 (欧拉公式) 为了适应在数据结构中对各数据项的操作,在欧拉公式中引入另外3个参数: s:实体的个数。 h:实体所含孔的个数。 r:实体中面所含孔(内环)的个数。 于是,欧拉公式扩展为 ve+f=2(sh)+r (扩展的欧拉公式)

  13. 如图10.3(a)中,v=8、e=12、f=6、s=1、h=0,满足扩展的欧拉公式。图10.3(b)中,v=14、e=21、f=9、s=1、h=1、r=2,也满足扩展的欧拉公式。如图10.3(a)中,v=8、e=12、f=6、s=1、h=0,满足扩展的欧拉公式。图10.3(b)中,v=14、e=21、f=9、s=1、h=1、r=2,也满足扩展的欧拉公式。 图10.3 两个实体

  14. 10.3.1 基本欧拉操作 符号说明: M(make):增加 K(kill):删除 V(vertex):顶点 E(edge):边 F(face):面 S(solid):实体 H(hole):孔 R(ring):环 ve+f=2(sh)+r 基本欧拉操作一般包括如下5对: MVFS; Mev;Mef; Mekr; Kfmrh; KVFS;KEV;KEF;KEMR;MFKRH;

  15. MVFS • MVFS生成一个solid,它只包含一个顶点和一个面,没有环和边。这个面包在顶点的外面。MVFS是用于创建一个实体的初操作。 • KVFS 删去一个顶点,一个面和一个体,它是MVFS的逆操作。 • MEV • MEV在指定的s上增加一个新的顶点v和一条新边e,新边以v为顶点,指向s中的一个指定的已有顶点。 • KEV 删去s中的一个已有顶点和边,是MEV的逆操作。 • MEF • MEV 在指定的s中的一个面face上增加一条新边e,e将face分划出一个新的面f, f与face通过e相邻。 • KEF删去s中的一条边和一个面,是MEF的逆操作。

  16. 4. MEKR MEKR在s中一个指定面的外环与内环之相应顶点间增加一条新边e,从而使两个环合成一个外环。 KEMR 删去s中面所含的一条边,生成一个新的内环,是MEKR的逆操作。 5. KFMRH KFMRH将两个面f1,f2变成一个面。其方法是将f2的外环变成f1的内环,结果是f2消去,f1出现一个内孔。KFMRH用于将两个面粘合成一个面,或将面的内环打穿,形成体的孔。 MFKRH 删去一个内环和一个孔,从而创建一个面,是KFMRH的逆操作。

  17. 10.3.1.2 低级欧拉算子 1、 LMEV lmev为低级顶点分裂算子(vertex-spliting operator) (1) (2)

  18. 10.3.1.2 低级欧拉算子 2、 LMEF lmef,低级面分裂算子(face-spliting operator)。和lmev相似,如果he1!=he2,则lmef将用一条从he1->vtx到he2->vtx的新边把he1和he2的环分为两个环。半边he1仍处于老环中,而he2被移到新环上,该环变成了一个新面的外边界。对于he1= =he2的特殊情况,就建立只带有一条边的环形面。 3、LKEMR lkemr,分裂一个环为两部分的低级算子。首先为一个新环的节点分配存储单元,然后,对将要删除边的相应的两个半边h1和h2进行操作,将它们保留在两个不同的部分中,其中与h2对应的部分变成新环。这种处理方式的优点是可以直接应用例程delhe删除h1和h2,且排除了“空”环等各种特殊情况。

  19. 10.3.1.3 高级级欧拉算子 高级欧拉算子的实现是基于其相应的低级欧拉算子和一些辅助例程,这些辅助例程用来对半边数据结构进行搜索,查找所有需要的指针。高级欧拉操作总是分为两步实现: 1. 通过搜索,找出相应低级欧拉操作所需的半边结点参数。 2. 调用低级欧拉操作实现功能

  20. 10.4 基本体元的生成 10.4.1移动掠扫算法 10.4.2 长方体产生的算法 10.4.3 圆柱生成算法 10.4.4以曲线为基的旋转掠扫算法

  21. 立方体的生成 1个体,一个面,一个顶点 1. MVFS 2. MEV 1个体,一个面,3条边, 4个顶点 MEV MEV 1个体,2个面,4条边, 4个顶点 3. MEF

  22. 4. MEV MEV MEV MEV 5. MEF MEF MEF MEF

  23. 10.4.1移动掠扫算法 移动掠扫算法使用一个基本平面FACE,并指定一个移动方向(dx,dy,dz)。其中dx,dy,dz分别表示移动距离的三上分量,通过欧拉操作,自动生成一个多面体的半边数据结构 (a) (b) (c) (d) (e) (f) 图10.4 在程序10.1执行过程中,数据结构的逐步生成的示意图

  24. void sweep(fac, dx, dy, dz) Face * fac; Float dx, dy, dz; { Loop * l; HalfEdge*first, *scan; Vertex * v; lgetmaxnames(fac->fsolid); l = fac->floops; while(l) { first = l->ledg; / * a * / scan = first->nxt; v =scan->vtx; lmev(scan, scan, ++maxv, v->vcoord[0]+dx, v->vcoord[1]+dy, v->vcoord[2]+dz); / * b * / 程序10.1移动掠扫算法 while(scam ! = first) { v = scan->nxt->vtx; lmev(scan->nxt, scan->nxt, ++maxv, v->vcoord[0]+dx, v->vcoord[1]+dy, v->vcoord[2]+dz); / * c * / lmef(scan->prv, scan->nxt->nxt, ++maxf); / * d * / scan = mate(scan->nxt)->nxt; } / * e * / lmef(scan->prv, scan->nxt, ++maxf); l = l->nextl; } } / * end of sweep * /

  25. 10.4.4 以曲线为基的旋转掠扫算法 以曲线为基线,通过旋转掠扫,可以产生曲面。这是实体基元球、锥等数据结构生成的基本方法。其中曲线总是以折线逼近,而旋转也总是以正n边形的边界轨逼近。因此,生成的是一个逼近曲面的多面壳。 程序10.6示出了以曲线为基的旋转掠扫算法。其中作为基线的折线,含在s之中。参数nfaces指出了逼近旋转的正n边形之边数。图10.6示出了程序在执行中的数据结构和指针变化情况。 • void rsweep(s, nfaces) • Solid * s; • Int nfaces; • { • HalfEdge * first, * cfirst, * last, * scan; • Face *tailf; • matrix m; • vector v;

  26. lgetmaxnames(s); first = s->sfaces->floops->ledg; while(first->edg ! = first->nxt->edg) first = first->nxt; last = first->nxt; while(last->edg! = last->nxt->edg) last = last->nxt; cfirst = first; / * a * / matident(m); matrotate(m, (-2.0 * PI / nfaces), 0.0, 0.0); while(--nfaces) { vecmult(v, cfirst->nxt->vtx->vcoord, m); lmev(cfirst->nxt, cfirst->nxt,++maxv, v[0], v[1], v[2]); scan = cfirst->nxt; / * b * /

  27. while(scan ! = last->nxt) { vecmult(v, scan->prv->vtx->vcoord, m); lmev(scan->prv, scan->nxt, ++maxf); scan = mate(scan->nxt->nxt); / * d * / } last = scan; cfirst = mate(cfirst->nxt->nxt); / * e * / } / * f * / tailf = lmef(cfirst->nxt, mate(first),++maxf);

  28. while(cfirst ! = scan) • { • lmef(cfirst, cfirst->nxt->nxt->nxt, ++maxf); • cfirst = mate(cfirst->prv)->prv; • } • } / * g * / 程序10.6 以曲线为基的旋转操作算法

  29. (a) (b) (c) (d) (e) (f) (g) 图10.6 rsweep程序的执行过程图示

  30. 局部操作 MEV MEV MEV MEV MEF KEF KEV KEV

  31. 10.5 实体的布尔操作 在Brep模型上的布尔集合操作 边界分类 顶点邻域分类 空边的连接 结果的产生

  32. 在Brep模型上的布尔集合操作 布尔集合操作包括3个操作,即交、并、差,它们分别记做∩、∪、\。通常,布尔集合操作的概念如图10.7所示 图10.7 A、B的布尔集合运算

  33. 对两个形状A、B进行布尔集合操作,可分两步进行:对两个形状A、B进行布尔集合操作,可分两步进行: ⒈ 将A和B沿相交线割剪成碎片。这个分裂操作称为 split。以图10.7所示的两个圆为例,split(A,B)→{x,y,z}。 ⒉ 选择碎片,加以粘贴。这个粘合操作记为。以图10.7所示 的两圆为例,粘合的规则是 x z y

  34. 首先定义如下记号。 b(s)表示实体的边界。例如A的边界记为b(A)。 A in B表示b(A)在B中的部分(图10.8(a))。 A out B表示b(A)在B之外的部分。 (A in B)1表示一个与A in B所含的所有面相同,但朝向相反的面的集合。 A on B+表示b(A)中与b(B)相重合,并且法线方向相同的部分(图10.8(b))。 A on B表示b(A)中与b(B)相重合,并且法线方向与b(B)相反的部分(图10.8(c))。 图10.8 边界的割剪

  35. 对于B-rep的布尔集合操作,仍分两步进行,描述如下:对于B-rep的布尔集合操作,仍分两步进行,描述如下: ⒈ split(A,B){A out B,A in B,(A in B)1,A on B+,A on B,B out A,B in A,(B in A)1,B on A},其中B on A+与A on B+相同,故不列入内。 ⒉粘合规则(表示粘合操作) ⑴A∩BA in BB in AA on B+ ⑵A∪BA out BB out AA on B+ ⑶A\BA out B(B in A)1A on B 上述粘合规则在实际使用中可以简化,即视操作的不同,将on用in或out代替。替代规则如下。 ⑴ 在A∩B中将A on B+代之以A in B。 ⑵ 在A∪B中将A on B+代之以A out B。 ⑶在A\B中将A on B代之以A out B。 因此,有简化的粘合规则如下。 ⑴ A∩BA in BB in A ⑵ A∪BA out BB out A ⑶ A\BA out B(B in A)1

  36. 图10.9 A和B(B-rep)按交线割剪后的碎片

  37. 步骤 ⒈ 将A的所有边与B相交求得交点,并在交点处将边分成两条边(将A的所有边与B相交求得交点,并在交点处将边分成两条边)。 ⒉ 在交点处插入空边。 ⒊ 对顶点进行分类,按分类对顶点进行连接,得到新的实体。

More Related