一种快速成型中三角面片模型的逐边分层方法

文档序号:6545596阅读:266来源:国知局
一种快速成型中三角面片模型的逐边分层方法
【专利摘要】本发明公开了一种快速成型中三角面片模型的逐边分层方法,首先,基于读入到内存的三角面片模型数据,去除冗余点,创建正向边表及其左、右连接面片信息;其次,遍历模型,获得分层方向的最大Z值和最小Z值,并根据设定的分层厚度计算出该模型的分层总层数N;创建长度为分层层数N的交点连接辅助数据结构的动态数组,以及创建长度为分层层数N的分层轮廓数组;再次,遍历正向边表,依次取一条正向边,基于边的几何连续性依次求出该边与相交分层平面的交点,每求出一个有效交点后立即执行交点连接算法;最后,依次处理完所有正向边后,获得轮廓线方向符合左手定则的分层轮廓线。该方法能有效地提高分层效率。
【专利说明】一种快速成型中三角面片模型的逐边分层方法
【技术领域】
[0001]本发明涉及一种快速成型中三角面片模型的逐边分层方法。
【背景技术】
[0002]快速成型技术不需要复杂的生产线和工装,可一次成型任意复杂形状的零件,极大简化了生产制造过程,达到降低生产成本、缩短开发周期的效果。快速成型技术基于分层离散/增材原理,因此CAD模型的分层是快速成型过程的基础,分层算法研究也一直是快速成型研究领域的重要方面。
[0003]由于CAD模型的不同,分层算法可分为两大类。(I)连续曲面模型的直接分层算法;(2)以STL模型为代表的三角面片模型的分层算法。此类算法只能获得离散折线,轮廓精度较低,但其算法较为简单,稳定性好。在众多分层算法中,基于STL模型为代表的数据面片模型的分层方法还是研究的主流。基于STL模型的分层算法主要有四种基本方法:①基于拓扑信息的分层算法基于三角面片位置信息进行面片分组的分层算法基于三角面片几何连续性并采用新面片表和活性面片表的分层算法;④三角面片没有组织形式的分层算法。这些方法中,方法②和③没有创建拓扑信息,分层时通过分组或活性面表来缩小搜索相交面片的范围,但重复计算交点、交点排序、排序时的三维坐标比较等影响了效率。方法④则没有将模型全部读入内存,分层时反复从文件中搜索相交面片,求交后就从内存释放,交点处理同法②和③。该方法主要是为了节省内存,一般用于超大文件,其效率显然不高。而方法①通过建立拓扑信息来避免分层时相邻面片的搜索,同时也避免了交点重复计算和交点排序,能直接获得有序轮廓。因此从原理上看,方法①分层时的效率应该是最高的。
[0004]这四种方法都有一个共同点就是依次取不同的分层平面来切割模型,每次切割获得一层轮廓线。因此可统称这类方法为逐层(或层优先)分层方法,其不足之处在于不能很好利用模型中边的几何连续性,以至影响分层效率。王素等在学术期刊《计算机辅助设计与图形学学报》2011,23 (04), P600-606发表的学术论文“STL模型的分层邻接排序快速切片算法”提出了一种可称为逐面片(或面片优先)分层的方法,基本原理为:依次取一个三角面片,反求与其相交的各分层平面及其索引号,分别在相交层序号对应的List链表内线性查找是否有相邻面片,如找到则计算两面片公共边与对应分层平面的交点,并依照邻接关系插入交点。该算法占用内存少,不重复计算交点,但也存在影响分层效率的因素,如:由于没有建立面片相邻拓扑信息,每次相邻面片的查找都需要经过多次的顶点坐标比较;由于需要找到公共边后再计算交点,也就没有利用边的几何连续性。
[0005]综上所述,现有针对三角面片模型的逐层分层方法和逐面片分层方法,都不能直接有效地利用边的几何连续性进行分层,影响了分层效率。

【发明内容】

[0006]本发明提供了一种快速成型中三角面片模型的逐边分层方法,其克服了【背景技术】中所述的现有技术的不足。
[0007]本发明解决其技术问题的所采用的技术方案是:
[0008]快速成型中三角面片模型的逐边分层方法,它包括:
[0009]步骤1,基于读入到内存的三角面片模型数据,去除冗余点,创建正向边表及其左、右连接面片信息;
[0010]步骤2,遍历模型,获得分层方向的最大Z值和最小Z值,并根据设定的分层厚度计算出该模型的分层总层数N;创建长度为分层层数N的交点连接辅助数据结构的动态数组,用于进行交点插入;以及创建长度为分层层数N的分层轮廓数组,用于保存分层结果;
[0011]步骤3,遍历正向边表,依次取一条正向边,基于边的几何连续性依次求出该边与相交分层平面的交点,每求出一个有效交点后立即执行交点连接算法;
[0012]其中:所述正向边是指:当分层方向为坐标系Z轴正方向时,三角面片中的非水平边,其两个端点中Z值较小的端点为边的起始顶点,Z值较大的端点为边的终止顶点;正向边表中包含起始顶点索引值、终止顶点索引值、左连接面片索引值、右连接面片索引值;
[0013]步骤4,重复步骤3,处理完所有正向边后,获得轮廓线方向符合左手定则的分层轮廓线。
[0014]一实施例之中:基于无冗余点的顶点表和面片表,创建正向边表及其左、右连接面片信息的方法包括:
[0015]①取一个面片F,在面片顶点存储顺序与面片法矢符合右手定则的情况下,依次取顶点0、1,顶点1、2,顶点2、0构成三条边;
[0016]②对于一条边E,其起点为Vs,终点为VE,比较两个顶点的Z值大小,有三种情况:其一是\与Ve的Z值相等,则不插入正向边表;其二是Vs的Z值较小,则设置面片F为边E的左连接面片,插入正向边表;其三是Vs的Z值较大,则交换E的两个顶点的索引值,设置面片F为边E的右连接面片,然后再插入正向边表;
[0017]其中:将边E插入正向边表时,若正向边表中已存在一条具有相同顶AVs和顶点Ve的边E',则,当边E为②中情况二时,将面片F赋值给E'的左连接面片索引值;当边E为②中情况三时,则将面片F赋值给E'的右连接面片索引值;然后清除边E的信息;
[0018]③取面片F中的下一条边,继续执行步骤②;面片中三条边均处理完成后,取下一个面片执行步骤①-③。
[0019]一实施例之中:所述交点连接辅助数据结构动态数组包括两个结构体,具体是:
[0020]其一为交点链表结构体,包含一个交点双向队列、一个队列头部交点所属正向边的左连接面片索引值、一个队列尾部交点所属正向边的右连接面片索引值;
[0021]其二为面片索引值与交点链表结构体指针之间的映射结构体,包含两个映射表变量:一是队列头部交点所属正向边的左连接面片索引值与交点链表结构体指针的映射表变量,记为hash_FLeft_DEQ ;二是队列尾部交点所属正向边的右连接面片索引值与交点链表结构体指针的映射表变量,记为hash_FRight_DEQ。
[0022]一实施例之中:所述交点连接算法,包括:
[0023]⑴正向边为E,与第η个分层平面的有效交点为P,第η层对应的面片索引值与交点链表结构体指针之间的映射结构体变量为struct_Slice ;
[0024]⑵分别用正向边E的左连接面片索引值nFLeft作为关键词查找struct_Slice变量中的映射表变量hash FRiRht DEQ,找到则设其映射的交点链表结构体指针对象为pDPnts_FL ;然后再用边E的右连接面片索引值nFRight作为关键词查找struct_Slice中的映射表变量hash FLeft DEQ,找到则设其映射的交点链表结构体指针对象为pDPnts_FR ;
[0025]⑶两个查询结果可构成四种组合情况,分别进行处理:
[0026]情况一、pDPnts_FL、pDPnts_FR均没有被查找到,此时交点连接过程如下:
[0027]①创建一个新的交点链表结构体指针对象;
[0028]②分别将交点、正向边的左、右连接面片索引值分别存储到交点链表结构体指针对象中的对应变量中;
[0029]③建立nFLeft与新建交点链表结构体指针之间的映射并保存到struct_Slice对象中hash_FLeft_DEQ变量,同样建立nRight与新建交点链表结构体指针之间的映射并保存到 struct_Slice 对象中的 hash_FRight_DEQ 变量;
[0030]情况二、pDPnts_FL、pDPnts_FR均有被查找到,此时交点连接过程如下:
[0031]①分别在struct_Slice对象中hash_FLeft_DEQ变量删除键值为nFRight的映射,在hash_FRight_DEQ变量中删除键值为nFLeft的映射;
[0032]②将有效交点P加入到pDPnts_FL指针对象中交点队列的最后;
[0033]③将pDPnts_FR指针对象中的交点队列取出,加到pDPnts_FL中的交点队列之后,本步骤完成后pDPnts_FL的交点队列由原pDPnts_FL内交点、有效交点P、原pDPnts_FR内交点有序构成;
[0034]④将pDPnts_FR中的右连接面片索引值赋值给pDPnts_FL中的右连接面片索引值,并删除pDPnts_FR指针对象;
[0035]⑤检查pDPnts_FL内的左右连接面片索引值是否相同,如果相同,则由pDPnts_FL队列中的交点创建一个封闭的轮廓环对象,并保存到分层轮廓数组的对应层中;再从两个映射表变量中删除pDPnts_FL的左右连接面片索引值对应的键值元素;
[0036]⑥如果pDPnts_FL左右连接面片索引值是不相同的,则在hash_FRight_DEQ中,将键值为pDPnts_FL的右连接面片索引值的映射指针修改为pDPnts_FL指针;
[0037]情况三、只有pDPnts_FR被查找到,此时交点连接过程如下:
[0038]①在hash_FLeft_DEQ变量中删除键值为nFRight的映射;
[0039]②将有效交点P加入到pDPnts_FR指针对象内交点队列的最前面,并将pDPnts_FR内的左连接面片索引值修改为交点P所属正向边的左连接面片索引值nFLeft ;
[0040]③检查pDPnts_FR内的左右连接面片索引值是否相同,如果相同,则由pDPnts_FR内的交点队列创建一个封闭的轮廓线对象,并保存到分层轮廓数组的对应层中;再从hash_FRight_DEQ中删除pDPnts_FR右连接面片索引值对应的键值元素;
[0041]④如果pDPnts_FR内左右连接面片索引值是不相同的,贝U在hash_FLeft_DEQ中插入一个新元素,该元素的键值为nFLeft、映射对象为pDPnts_FR指针;
[0042]情况四、只有pDPnts_FL被查找到,此时交点连接过程如下:
[0043]①在hash_FRight_DEQ变量中删除键值为nFLeft的映射;
[0044]②将有效交点P加入到pDPnts_FL指针对象内交点队列的最后,并将pDPnts_FL指针对象内的右连接面片索引值修改为交点P所属正向边的左连接面片索引值nFRight ;[0045]③检查pDPnts_FL内的左右连接面片索引值是否相同,如果相同,则由pDPnts_FL内的交点队列创建一个封闭的轮廓环对象,并保存到分层轮廓数组的对应层中;再从hash_FLeft_DEQ中删除pDPnts_FL左连接面片索引值对应的键值元素;
[0046]④如果pDPnts_FL内左右连接面片索引值不相同,贝U在hash_FRight_DEQ中插入一个新元素,该元素的键值为nFRight、映射对象为pDPnts_FL指针。
[0047]一实施例之中:所述正向边表中的各索引值类型包括指针类型。
[0048]一实施例之中:通过C++模板库中的set容器的insert函数建立正向边表。
[0049]本技术方案与【背景技术】相比,它具有如下优点:
[0050]1、本发明提供的逐边分层方法,能够更加方便地有效利用边的几何连续性,提高分层效率;
[0051]2、采用的正向边结构,可以给分层算法提供必要的拓扑信息,同时也有利于拓扑信息的创建;
[0052]3、提出的交点辅助数据结构及连接算法,可以实现交点的高效连接,并自动形成方向符合左手规则的分层轮廓线。
【专利附图】

【附图说明】
[0053]下面结合附图和实施例对本发明作进一步说明。
[0054]图1绘示了快速成型中三角面片模型的逐边分层步骤示意图。
[0055]图2绘示了顶点和面片数据结构定义表示图。
[0056]图3绘示了正向边与面片法矢形成符合右手定则的示意图。
[0057]图4绘示了正向边的数据结构图。
[0058]图5绘示了交点链表结构体的定义表示图。
[0059]图6绘示了面片索引值与交点链表结构体指针之间的映射结构体定义表示图。
[0060]图7绘示了获得有效交点的定义示意图。
[0061]图8绘示了交点连接算法流程图。
[0062]图9绘示了交点连接时的映射情况示意图。
[0063]图10绘示了交点连接时经映射修改后的示意图。
[0064]图11绘示了本实施例中兔子三角面片模型的线框显示图。
[0065]图12绘示了本实施例中的兔子三角面片模型经本发明所述的算法分层后的线框显示图。
[0066]图13绘示了本实施例中龙三角面片模型的线框显示图。
[0067]图14绘示了本实施例中的龙三角面片模型经本发明所述的算法分层后的线框显示图。
【具体实施方式】
[0068]请查阅图1至图14,一种快速成型中三角面片模型的逐边分层方法,具体包括以下步骤:
[0069]步骤1,基于读入到内存的三角面片模型数据,去除冗余点,创建正向边表及其左右连接面片信息;[0070]如图2所示,顶点结构体POINT中包含三个浮点数变量用于保存顶点三维坐标,面片结构体FACET中包含长度为3的整型变量数组。采用C++标准模板库中的顺序容器 vector 类声明点表 vector〈POINT>m_vecPoints 以及声明面片表 vector〈FACET>m_vecFacets。从硬盘中将三角面片模型,如STL模型,读入内存时,采用C++标准模板库中的关联容器类,如set、map、multimap等,进行冗余顶点的去除,建立无重复顶点的点表和面片表;
[0071]所述步骤I中的正向边是指:
[0072]当分层方向为坐标系Z轴正方向时,三角面片中的非水平边,其两个端点中Z值较小的端点为边的起始顶点,Z值较大的端点为边的终止顶点;如图3所示,面片顶点与法矢符合右手定则,面片F1的三个顶点在图中逆时针顺序,法矢指向纸外,包含e(l、ei和e2等正向边;面片F2包含正向边%和e3,其中Vtl和V4顶点Z值相同,所以不构成正向边。F1为θι和e2的右邻接面片,为e。的左邻接面片;F2为e。的右邻接面片,为e3的左邻接面片。
[0073]如图4所示,所述步骤I中的正向边数据结构,其中包含起始顶点索引值、终止顶点索引值、左连接面片索引值、右连接面片索引值;正向边数据结构中的各索引值也可以是指针类型。
[0074]所述步骤I中的创建正向边表及其左右连接面片信息的具体方法是:
[0075]利用C++模板库中的set容器建立正向边的正向边表,由无冗余点的顶点表和面片表基础上创建正向边表的过程如下:
[0076]①取一个面片F,在面片顶点存储顺序与面片法矢符合右手定则的情况下,依次取顶点0、1,顶点1、2,顶点2、0构成三条边;
[0077]②对于一条边E,其起点为Vs,终点为VE,比较两个顶点的Z值大小,有三种情况:其一是\与Ve的Z值相等,则不插入正向边表;其二是Vs的Z值较小,则设置面片F为边E的左连接面片,插入正向边表;其三是Vs的Z值较大,则交换E的两个顶点的索引值,设置面片F为边E的右连接面片,然后再插入正向边表;
[0078]其中:将边E插入正向边表时,若正向边表中已存在一条具有相同顶AVs和顶点Ve的边E',那么,当边E为②中情况二时,将面片F赋值给E'的左连接面片索引值;当边E为②中情况三时,则将面片F赋值给E'的右连接面片索引值;然后清除边E的信息;
[0079]③取面片F中的下一条边,继续执行步骤②;面片中三条边均处理完成后,取下一个面片执行步骤①-③。
[0080]步骤2,遍历模型,获得分层方向的最大Z值和最小Z值,并根据设定的分层厚度计算出该模型的分层总层数N;创建长度为分层层数N的交点连接辅助数据结构的动态数组,用于进行交点插入;以及创建长度为分层层数N的分层轮廓数组,用于保存分层结果;
[0081]所述步骤2中的交点连接辅助数据结构,包括两个结构体,具体是:
[0082]其一为如图5所示的交点链表结构体DeqPnts,主要包含一个交点双向队列deqPnts、一个队列头部交点所属正向边的左连接面片索引值nFStart_Left、一个队列尾部交点所属正向边的右连接面片索引值nFEnd_Right ;
[0083]其二为如图6所示的面片索引值与交点链表结构体指针之间的映射结构体HashSliceByWEdge,包含两个映射表变量:一是队列头部交点所属正向边的左连接面片索引值与交点链表结构体指针的映射表变量,为hash_FLeft_DEQ ;二是队列尾部交点所属正向边的右连接面片索引值与交点链表结构体指针的映射表变量,为hash_FRight_DEQ。
[0084]步骤3,遍历正向边表,依次取一条正向边,基于边的几何连续性依次求出该边与相交分层平面的交点,每求出一个有效交点后立即执行交点连接算法;
[0085]步骤4、重复步骤3,处理完所有正向边后,获得轮廓线方向符合左手定则的分层轮廓线。
[0086]所述步骤3中的基于边的几何连续性依次求出该边与相交分层平面的交点,具体方法是:
[0087]分层时,为降低分层的台阶误差,分层平面取每层的中间Z值。设三角面片模型的AABB包围盒Z轴方向最小为Zmin,最大为zmax;分层厚度为δ,则其倒数为λ = l/δ ;正向边E的起点为Vs (X。,y0, z0),终点为VeU1, y1; Z1),则:
[0088]①计算正向边E的最低分层平面序号η以及相交分层平面数量1:
[0089]n = ceil ([z0-(zmin+0.5.δ ) ].λ)
[0090]= ceil ((Z0-Zmin).λ+0.5);
[0091]i = f100r((Z1-Z0).λ)
[0092]其中函数ceil获得大于等于给定值的最小整数,而floor则获得小于等于给定值的最大整数。
[0093]②设Ze = I/(Z1-Z0),则Λ X 和Λ y 计算为:
[0094]Δ X = (X1-X0).δ.Ze,
[0095]Ay= (Y1-Y0).δ.Zk
[0096]③边E与第η分层平面的交点计算如下:
[0097]zn = zmin+n.δ ;
[0098]χη = (X1-X0).(zn+0.5.δ - z0).Ze ;
[0099]yn = (Y1-Y0).(ζη+0.5.δ - ζ0).ΖΕ,
[0100]④利用几何连续性计算边E与第(n+j)分层平面的交点如下:
[0101]Zn+j = Zn+^!+ δ,zn+i < Z1 ;j = I, 2,…,1.[0102]xn+j = χη+j-l+ Δ x ;
[0103]yn+j = yn+j-1+ Δ y
[0104]所述步骤3中的有效交点是指:
[0105]计算出的交点为正向边端点时,可采用上闭下开(或下闭上开)的原则来处理,即交点为正向边终点时,则该交点为有效交点,按照正常的交点连接算法来处理;否则为无效交点,不进行进一步处理。如图7所示中虚线为分层平面,由e1、e2、e3分别获得的交点V为正向边起点,按照上闭下开原则,忽略此类交点;而由e(l、e4分别获得交点V为正向边终点,则需要分别执行交点连接算法。要注意的是,由%获得的有效交点V与由e4获得的有效交点V,其左右邻接面片是不一样的,为了形成连续的分层轮廓线,每次获得有效交点V后都必须进行交点连接处理。
[0106]如图8所示,所述步骤3中的交点连接算法,具体过程是:
[0107]⑴正向边为E,与第η个分层平面的有效交点为P,第η层对应的HashSliceByffEdge 结构体变量为 struct_Slice ;
[0108] ⑵分别用正向边E的左连接面片索引值nFLeft作为关键词查找struct_Slice变量中的映射表变量hash_FRi ght_DEQ,找到则设其映射的交点链表结构指针对象为pDPnts_FL ;然后再用边E的右连接面片索引值nFRight作为关键词查找struct_Slice中的映射表变量hash_FLeft_DEQ,找到则设其映射的交点链表结构指针对象为pDPnts_FR ;
[0109]⑶两个查询结果可构成四种组合情况,分别进行处理:
[0110]情况一、pDPnts_FL、pDPnts_FR均没有被查找到,处理如下:
[0111]①创建一个新的交点链表结构指针对象;
[0112]②分别将交点、正向边左右连接面片索引值分别存储到指针对象中对应变量中;
[0113]③建立nFLeft与新建交点链表结构指针之间的映射并保存到struct_Slice对象中hash_FLeft_DEQ变量,同样建立nFLeft与新建交点链表结构指针之间的映射并保存到hash_FRight_DEQ 变量;
[0114]情况二、pDPnts_FL、pDPnts_FR均有被查找到,设此时struct_Slice内两个映射表变量内容如图9所示,此时交点连接过程如下:
[0115]①分别在struct_Slice对象中hash_FLeft_DEQ变量删除键值为nFRight的映射,在hash_FRight_DEQ变量中删除键值为nFLeft的映射;
[0116]②将有效交点P加入到pDPnts_FL指针对象中交点队列的最后;
[0117]③将pDPnts_FR指针对象中的交点队列取出,加到pDPnts_FL中的交点队列之后。本步骤完成后pDPnts_FL的交点队列由原pDPnts_FL内交点、有效交点P、原pDPnts_FR内交点有序构成;
[0118]④将pDPnts_FR中的右连接面片索引值赋值给pDPnts_FL中的右连接面片索引值,并删除pDPnts_FR指针对象;
[0119]⑤检查pDPnts_FL内的左右连接面片索引值是否相同,如果相同,则由pDPnts_FL内队列中的交点创建一个封闭的轮廓环对象,并保存到分层轮廓数组的对应层中;再从两个映射表变量中删除pDPnts_FL左右连接面片索引值对应的键值元素,如图9中,在hash_FLeft_DEQ内删除键值为nFL3的映射,在hash_FRight_DEQ内删除键值为nFR4的映射;
[0120]⑥如果pDPnts_FL左右连接面片索引值是不相同的,则在hash_FRight_DEQ中,将键值为pDPnts_FL右连接面片索引值的映射指针修改为pDPnts_FL指针,交点连接完成后如图10所示;
[0121]情况三、只有pDPnts_FR被查找到,此时交点连接如下:
[0122]①在hash_FLeft_DEQ变量中删除键值为nFRight的映射;
[0123]②将有效交点P加入到pDPnts_FR指针对象内交点队列的最前面,并将pDPnts_FR内的左连接面片索引值修改为nFLeft ;
[0124]③检查pDPnts_FR内的左右连接面片索引值是否相同,如果相同,则由pDPnts_FR内的交点队列创建一个封闭的轮廓环对象,并保存到对应层中;再从hash_FRight_DEQ中删除pDPnts_FR右连接面片索引值对应的键值元素;
[0125]④如果pDPnts_FR内左右连接面片索引值是不相同的,贝U在hash_FLeft_DEQ中插入一个新元素,该元素的键值为nFLeft、映射对象为pDPnts_FR指针;
[0126]情况四、只有pDPnts_FL被查找到,此时交点连接如下:
[0127]①在hash_FRight_DEQ变量中删除键值为nFLeft的映射;
[0128]②将有效交点P加入到pDPnts_FL指针对象内交点队列的最后,并将pDPnts_FL指针对象内的右连接面片索引值修改为nFRight ;
[0129]③检查pDPnts_FL内的左右连接面片索引值是否相同,如果相同,则由pDPnts_FL内的交点队列创建一个封闭的轮廓环对象,并保存到对应层中;再从hash_FLeft_DEQ中删除pDPnts_FL左连接面片索引值对应的键值元素;
[0130]④如果pDPnts_FL内左右连接面片索引值是不相同的,贝U在hash_FRight_DEQ中插入一个新元素,该元素的键值为nFRight、映射对象为pDPnts_FL指针。
[0131]如图11至图14所示,为本发明的实施实例。图11所示为测试三角面片模型Bunny,该模型由Stanford大学提供下载,共包含69451个三角面片,合并重复的顶点后由69451X3 = 208353个顶点变成34834个,经过缩放后其包围盒尺寸为X方向155.7mm、Y方向 120.7mm、Z 方向 154.3mm。
[0132]实施本发明的逐边分层算法,分层厚度选择为1_,图11所示模型的分层后轮廓线如图12所示。在编程实现时使用GetTickCout函数获得精确分层时间,其中创建正向边表的时间156晕秒,分层时间为234晕秒。
[0133]图13所示为测试三角面片模型Dragon,该模型由Stanford大学提供下载,经过减少面片数量及尺寸缩放后,共包含68759个三角面片,合并重复的顶点后由68759X 3 =206277个顶点变成34273个,经过缩放后其包围盒尺寸为X方向182.6mm、Y方向105.5mm、Z 方向 124.1_。
[0134]实施本发明的逐边分层算法,分层厚度选择为1_,图13所示模型的分层后轮廓线如图14所示。在编程实现时使用GetTickCout函数获得精确分层时间,其中创建正向边表的时间156毫秒,分层时间为187毫秒。
[0135]以上所述,仅为本发明较佳实施例而已,故不能依此限定本发明实施的范围,即依本发明专利范围及说明书内容所作的等效变化与修饰,皆应仍属本发明涵盖的范围内。
【权利要求】
1.快速成型中三角面片模型的逐边分层方法,其特征在于:包括: 步骤1,基于读入到内存的三角面片模型数据,去除冗余点,创建正向边表及其左、右连接面片信息; 步骤2,遍历模型,获得分层方向的最大Z值和最小Z值,并根据设定的分层厚度计算出该模型的分层总层数N;创建长度为分层层数N的交点连接辅助数据结构的动态数组,用于进行交点插入;以及创建长度为分层层数N的分层轮廓数组,用于保存分层结果; 步骤3,遍历正向边表,依次取一条正向边,基于边的几何连续性依次求出该边与相交分层平面的交点,每求出一个有效交点后立即执行交点连接算法; 其中:所述正向边是指:当分层方向为坐标系Z轴正方向时,三角面片中的非水平边,其两个端点中Z值较小的端点为边的起始顶点,Z值较大的端点为边的终止顶点;正向边表中包含起始顶点索引值、终止顶点索引值、左连接面片索引值、右连接面片索引值; 步骤4,重复步骤3,处理完所有正向边后,获得轮廓线方向符合左手定则的分层轮廓线。
2.根据权利要求1中所述的快速成型中三角面片模型的逐边分层方法,其特征在于:基于无冗余点的顶点表和面片表,创建正向边表及其左、右连接面片信息的方法包括: ①取一个面片F,在面片顶点存储顺序与面片法矢符合右手定则的情况下,依次取顶点0、1,顶点1、2,顶点2、0构成三条边; ②对于一条边E,其起点为Vs,终点为VE,比较两个顶点的Z值大小,有三种情况:其一是Vs与Ve的Z值相等,则不插入正向边表;其二是Vs的Z值较小,则设置面片F为边E的左连接面片,插入正向边表;其三是\的Z值较大,则交换E的两个顶点的索引值,设置面片F为边E的右连接面片,然后再插入正向边表; 其中:将边E插入正向边表时,若正向边表中已存在一条具有相同顶点Vs和顶点Ve的边Ei,则,当边E为②中情况二时,将面片F赋值给Ei的左连接面片索引值;当边E为②中情况三时,则将面片F赋值给E'的右连接面片索引值;然后清除边E的信息; ③取面片F中的下一条边,继续执行步骤②;面片中三条边均处理完成后,取下一个面片执行步骤①-③。
3.根据权利要求1中所述的快速成型中三角面片模型的逐边分层方法,其特征在于:所述交点连接辅助数据结构动态数组包括两个结构体,具体是: 其一为交点链表结构体,包含一个交点双向队列、一个队列头部交点所属正向边的左连接面片索引值、一个队列尾部交点所属正向边的右连接面片索引值; 其二为面片索引值与交点链表结构体指针之间的映射结构体,包含两个映射表变量:一是队列头部交点所属正向边的左连接面片索引值与交点链表结构体指针的映射表变量,记为hash_FLeft_DEQ ;二是队列尾部交点所属正向边的右连接面片索引值与交点链表结构体指针的映射表变量,记为hash_FRight_DEQ。
4.根据权利要求1中所述的快速成型中三角面片模型的逐边分层方法,其特征在于:所述交点连接算法,包括: ⑴正向边为E,与第η个分层平面的有效交点为P,第η层对应的面片索引值与交点链表结构体指针之间的映射结构体变量为struct_Slice ; ⑵分别用正向边E的左连接面片索引值nFLeft作为关键词查找struct_Slice变量中的映射表变量hash FRight DEQ,找到则设其映射的交点链表结构体指针对象为pDPnts_FL ;然后再用边E的右连接面片索引值nFRight作为关键词查找struct_Slice中的映射表变量hash FLeft DEQ,找到则设其映射的交点链表结构体指针对象为pDPnts_FR ; ⑶两个查询结果可构成四种组合情况,分别进行处理: 情况一、pDPnts_FL、pDPnts_FR均没有被查找到,此时交点连接过程如下: ①创建一个新的交点链表结构体指针对象; ②分别将交点、正向边的左、右连接面片索引值分别存储到交点链表结构体指针对象中的对应变量中; ③建立nFLeft与新建交点链表结构体指针之间的映射并保存到struct_Slice对象中hash_FLeft_DEQ变量,同样建立nRight与新建交点链表结构体指针之间的映射并保存到struct_Slice 对象中的 hash_FRight_DEQ 变量; 情况二、pDPnts_FL、pDPnts_FR均有被查找到,此时交点连接过程如下: ①分别在struct_Slice对象中hash_FLeft_DEQ变量删除键值为nFRight的映射,在hash_FRight_DEQ变量中删除键值为nFLeft的映射; ②将有效交点P加入到pDPnts_FL指针对象中交点队列的最后; ③将pDPnts_FR指针对象中的交点队列取出,加到pDPnts_FL中的交点队列之后,本步骤完成后pDPnts_FL 的交点队列由原pDPnts_FL内交点、有效交点P、原pDPnts_FR内交点有序构成; ④将pDPnts_FR中的右连接面片索引值赋值给pDPnts_FL中的右连接面片索引值,并删除pDPnts_FR指针对象; ⑤检查pDPnts_FL内的左右连接面片索引值是否相同,如果相同,则由pDPnts_FL队列中的交点创建一个封闭的轮廓环对象,并保存到分层轮廓数组的对应层中;再从两个映射表变量中删除pDPnts_FL的左右连接面片索引值对应的键值元素; ⑥如果pDPnts_FL左右连接面片索引值是不相同的,则在hash_FRight_DEQ中,将键值为pDPnts_FL右连接面片索引值的映射指针修改为pDPnts_FL指针; 情况三、只有pDPnts_FR被查找到,此时交点连接过程如下: ①在hash_FLeft_DEQ变量中删除键值为nFRight的映射; ②将有效交点P加入到pDPnts_FR指针对象内交点队列的最前面,并将pDPnts_FR内的左连接面片索引值修改为交点P所属正向边的左连接面片索引值nFLeft ; ③检查pDPnts_FR内的左右连接面片索引值是否相同,如果相同,则由pDPnts_FR内的交点队列创建一个封闭的轮廓线对象,并保存到分层轮廓数组的对应层中;再从hash_FRight_DEQ中删除pDPnts_FR右连接面片索引值对应的键值元素; ④如果pDPnts_FR内左右连接面片索引值是不相同的,贝丨』在hash_FLeft_DEQ中插入一个新元素,该元素的键值为nFLeft、映射对象为pDPnts_FR指针; 情况四、只有pDPnts_FL被查找到,此时交点连接过程如下: ①在hash_FRight_DEQ变量中删除键值为nFLeft的映射; ②将有效交点P加入到pDPnts_FL指针对象内交点队列的最后,并将pDPnts_FL指针对象内的右连接面片索引值修改为交点P所属正向边的左连接面片索引值nFRight ; ③检查pDPnts_FL内的左右连接面片索引值是否相同,如果相同,则由pDPnts_FL内的交点队列创建一个封闭的轮廓环对象,并保存到分层轮廓数组的对应层中;再从hash_FLeft_DEQ中删除pDPnts_FL左连接面片索引值对应的键值元素; ④如果pDPnts_FL内左右连接面片索引值不相同,则在hash_FRight_DEQ中插入一个新元素,该元素的键值为nFRight、映射对象为pDPnts_FL指针。
5.根据权利要求1中所述的快速成型中三角面片模型的逐边分层方法,其特征在于:所述正向边表中的各索引值类型包括指针类型。
6.根据权利要求2中所述的快速成型中三角面片模型的逐边分层方法,其特征在于:通过C++模板库 中的set容器的insert函数建立正向边表。
【文档编号】G06F17/50GK103970949SQ201410185901
【公开日】2014年8月6日 申请日期:2014年5月5日 优先权日:2014年5月5日
【发明者】黄常标, 江开勇, 刘斌, 林俊义, 路平 申请人:华侨大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1