一种基于stl文件提取指定表面网格特征线的方法
【专利摘要】一种基于stl文件提取指定表面网格特征线的方法,可以提取由用户指定的某一表面或某一对相互平行的表面网格特征线。本发明在选定表面的法向量后,从stl文件中读取具有此法向量的三角形网格。然后对三角形网格进行分组,使属于同一闭合区域的三角形为一组。最后对每组闭合区域按顺序提取边界点,依次连接边界点得到特征线。本发明可以有效地提取stl文件中指定表面网格特征线,且效率高,占用资源少。
【专利说明】
一种基于St I文件提取指定表面网格特征线的方法
技术领域
[0001] 本发明提供了一种基于stl文件提取表面网格特征线的方法,更具体地,可以提取 由用户指定的某一表面或某一对相互平行的表面(两表面的法向量平行且方向相反)网格 特征线。本发明属于计算机辅助设计领域。
【背景技术】
[0002] 随着产品的数字化以及快速原型制造技术的发展,反向工程得到了越来越多的应 用与研究。stl格式文件用三角形网格来表示具有复杂拓扑和外形的几何模型,且能产生直 观的视觉效果,因而在反向工程中得到了广泛的应用。在实际的工程应用中,stl文件中所 存储的三角形网格并不是理想的网格,因为其中的某些网格可能存在冗余,而需要对其进 行优化处理。特征线的提取技术是使表面网格得以优化的关键技术之一。
[0003] 国内许多学者针对stl文件中表面网格特征线的提取进行了研究并取得了一定成 果。检索了大量相关技术文献发现,目前绝大多数的表面网格特征线的提取方法是,首先找 出三角形网格上的曲率突变点,以此作为特征点,然后,将这些离散的特征点连接成线,得 到全部表面的特征线。尽管这类方法对离散的三角形网格模型特征点的提取已经较为成 熟,但是,将这些特征点连接生成特征线的过程都存在弊端,并不能很好的将特征点进行分 组连接。同时,在实际的工程应用当中,有时只需要获取某一表面或某一对相互平行的表面 网格的特征线,而不是所有表面网格的特征线。因此,提出一种基于stl文件提取指定表面 网格特征线的方法,有着重要的实际意义。
【发明内容】
[0004] 本发明的目的在于提供一种基于stl文件的提取表面网格特征线的方法,该方法 可以提取由用户指定的某一表面或某一对相互平行的表面网格特征线,具有准确性高、占 用资源少、几何形状适应性强等特点。
[0005] 为了实现上述的目的,本发明采用的技术方案分为以下几个步骤:
[0006] l)stl文件的预处理。若stl文件中存储的x,y,z坐标值的最小值不在原点(0,0,0) 处,则对s 11文件的X,y,z坐标值进行平移。否则不予处理。
[0007] 2)从stl文件中读取指定表面的所有三角形网格,以三角形为单位(三个顶点为一 组)进行存储,同时存储三角形三条边中点的坐标。
[0008] 3)对存储的三角形进行分组,将属于同一闭合区域的三角形分为一组。
[0009] 4)选出每一组的边界点,按顺序存储在边界点容器当中。连接存储在顶点容器中 的点得到特征线。
[0010] 进一步,所述步骤1)具体内容如下:
[0011] 遍历stl文件中所有x,y,z的坐标值,找出最小值xMir^yMir^zMiruSUMir^yMin, zMin)辛(0,0,0),则对stl模型进行平移,使(xMin,yMin,zMin) = (0,0,0)。否则不予处理。
[0012] 进一步,所述步骤2)具体包括如下几个步骤:
[0013] 21)由法向量可以指定stl文件所描述模型的一个表面或两个相互平行的表面。例 如,若指定法向量平行于z轴的上下两个表面,可以取法向量x = 0,y = 0, z辛0。若指定法向 量平行于Z轴正方向的上表面,可以取法向量1 = 0,7 = 0,2>0。若指定法向量平行于2轴负方 向的下表面,可以取法向量x = 0,y = 0,z〈0。
[0014] 22)以选取的法向量为筛选条件,将符合条件的三角形读入到内存,并通过三角形 三个顶点的坐标计算出三条边中点的坐标。然后以三角形为单位存储每个三角形的三个顶 点坐标以及三个中点坐标。
[0015] 进一步,所述步骤3)具体包括以下几个步骤:
[0016] 31)判断所有三角形是否都已参与分组,若是,分组完毕。否则,进入32)。
[0017] 32)任意选取一个没有参与分组的三角形,新建一个分组。
[0018] 33)从没有参与分组的三角形中,选取一个与分组中三角形相邻的三角形,然后把 这个三角形加入到该分组中。
[0019] 34)判断没有参与分组的三角形中是否存在与该分组相邻的三角形,如果有,则进 入步骤33)。否则进入步骤31)。
[0020] 进一步,所述步骤4)具体包括以下几个步骤:
[0021] 41)判断是否所有分组都已处理,若是,进入44)。否则,进入42)。
[0022] 42)选取一个分组,对分组内的所有三角形的重复顶点进行合并,选出边界点,将 其存储在边界点容器当中。
[0023] 43)处理下一个分组,进入步骤41)。
[0024] 44)对每组存储在边界点容器当中的点依次连接,并连接好容器当中最后一个点 和第一个点,构成闭合曲线,即得到特征线。
[0025]进一步,所述步骤33)具体为:
[0026]本发明判断两个三角形相邻,运用了相邻三角形公共边中点坐标相等的理论。也 就是说,如果两个三角形拥有相同的边中点坐标,则这两三角形必有公共边,即这两个三角 形必定是相邻三角形。基于此理论,则可以通过遍历全部三角形,把所有相邻的三角形分为 一组,且这些三角形将构成一个闭合区域。
[0027]进一步,所述步骤42)具体为:
[0028]首先,引入三角形网格内点以及边界点的定义。
[0029] 设表示三角形网格面M=(vi,vj, . . .,vn),对于Μ中的任意一点Vi = (xi,yi,zi),用N (Vi)表示所有包含顶点Vi的三角面片集合,称该点为顶点Vi为三角网格Μ的顶点,称这些三 角形为该顶点的邻接三角形。将一个顶点 Vl与该顶点相连的顶点组成的边 L(vi) = /,:/ 称为该顶点的邻接边。对于顶点Vi,其邻接的三角形的个数用 N(Vl) |表示,其邻接边的条数用| L(Vl) |表示,即可得到边界点的定义如下:
[0030] %为边界点= {Vi| |N(vi) | 辛 |L(Vi) | }
[0031] 特别的,如果一个顶点的邻接三角形的个数和邻接边的条数相等,则这个点为内 点。否则,为边界点。于是,对分组内边界点的提取分以下几步进行:
[0032]第一步,新建一个存储边界点的容器,从分组中选取一个三角形,并把三角形三个 顶点坐标存储在边界点容器当中。
[0033]第二步,从该组未被处理的三角形当中选取一个三角形,如果该三角形的三个顶 点和边界点容器中存储的连续三个点相等,说明存在内点,则剔除内点,剔除内点的方法 为,将连续三个点中的第二个点从边界点容器中删除,这样边界点容器中的点按顺序将构 成一个新的闭合区域。如果该三角形中有且仅有两个顶点和边界点容器中存储的连续的两 个点相等,则把该三角形另外一个顶点插入到边界点容器当中,使边界点容器中的点按顺 序能够构成一个新的闭合区域。否则,说明该三角形与容器中存储的闭合区域不相邻,不予 处理。
[0034] 第三步,该组中若存在未被处理的三角形,则进入第二步,否则,边界点提取结束。
[0035] 与现有技术相比,本发明具有以下优点和有益效果:
[0036] 1)本发明基于法向量从st 1文件中读取三角形网格的信息,这样就可以通过法向 量来指定stl模型的平面。同时,从stl文件中读取的数据不包含除指定平面以外的数据信 息,可以提高数据处理的效率。
[0037] 2)运用相邻三角形公共边中点坐标相等的理论,对所有三角形进行分组,使得所 有属于同一闭合区域的三角形为一组,可以减少后续过程遍历的次数,提高提取算法运行 效率。本发明可以有效地提取stl文件中指定表面网格特征线,且效率高,占用资源少。 [0038] 3)在提取特征线时,提出的去除内点的方法,保证了提取边界点的可靠性。同时提 取到的边界点是按顺序进行存储的,这样特征线的生成只需将边界点依次连接就可得到, 解决了连接特征线时对边界点进行排序的问题。
【附图说明】
[0039]下面结合附图和实施例对本发明进一步说明。
[0040]图1是本发明的流程不意图。
[0041 ]图2是对三角形进行分组的流程示意图。
[0042]图3是提取闭合区域边界点的流程示意图。
[0043]图4是边界点和内点示意图。
[0044] 图5是本发明实施例stl格式的轴承模型。
[0045] 图6是本发明对轴承模型上表面(法向量平行于z轴正方向的)第一特征线提取效 果图。
[0046] 图7是本发明对轴承模型上表面(法向量平行于z轴正方向的)第二特征线提取效 果图。
[0047]图8是本发明对轴承模型上表面(法向量平行于z轴正方向的)第三特征线提取效 果图。
【具体实施方式】
[0048] 以下将结合附图,对本发明的优选实施例进行详细的描述。
[0049] 图1是本发明基于stl文件的对指定平面网格特征线的提取方法的流程示意图。具 体步骤如下:
[0050] (1)对81:1文件进行预处理。遍历81:1文件中1,7,2坐标的最小值11;[11,5^;[11,2]\1;[11, 若最小值在原点处,则不予处理。若最小值不在原点位置,则将Stl文件中所有点的x,y,z坐 标分别平移 |xMin|,|yMin|,|zMin|,使(xMin,yMin,zMin) = (0,0,0)。
[0051] (2)确定所要处理的表面在stl文件中的法向量表示,然后以法向量为判断条件, 从stl文件中读取与指定表面具有相同法向量的所有三角形网格。
[0052] ( 3)声明一个结构体triangle,该结构体包含三角形三个顶点坐标pointi, point2,point3,三条边的中点坐标mid_12,mid_23,mid_13,以及一个标识位flat。将读取 的三角形网格以三角形为单位存储在结构体变量当中。
[0053] (4)以相邻三角形存在相等的边中点坐标为依据,对三角形进行分组。使得构成一 个闭合区域的所有三角形分为一组。对每个分组声明一个容器vector〈triangle>group,用 来存储每个分组的所有三角形,声明另一个容器¥6(:1:01'〈¥6(31:01'〈1:1^31^16>>311_81'0卯,用 来存储所有的group。
[0054] (5)提取出闭合区域的边界点,将边界点按顺序存储在边界点容器中。对每个闭合 区域声明一个容器vector〈point>area,用来存储每个闭合区域的边界点。再声明一个容器 vector〈vector〈point>>all_area,用来存储所有的area。依次连接area中的点,并将area 中最后一个点和第一个点连接,得到特征线。
[0055]图2为对三角形进行分组的算法流程示意图。具体步骤如下:
[0056] (1)根据标识位flat判断是否有未参与分组的三角形,如果有,则进入步骤(2)。如 果没有,则分组完毕。
[0057] (2)根据flat选取一个有效三角形,将该三角形存入group中,然后将该三角形 flat设为无效。
[0058] (3)根据f 1 at从该分组中选取一个有效三角形,判断其与group中的三角形是否相 邻,若相邻,将该三角形加入到group当中,然后将flat设为无效。若不相邻,则不予处理。具 体判断方法为:该三角形的三个边中点mid_12,mid_23, mid_13分别与group中存储的三角 形各个中点比较,看是否存在相同的点,若存在,说明相邻。否则,不相邻。
[0059] (4)判断是否还存在属于该组的三角形,若有,进入步骤(3),否则,将group存入 all_group,并将group清空,进入步骤(1)。
[0060] 图3是对闭合区域提取边界点的流程示意图。具体步骤如下:
[0061] (1)判断是否有未被处理的分组,若有,进入(2)。否则,处理完毕。
[0062] (2)从要处理分组中选取一个三角形,将该三角形三个顶点存入area,然后设置 flat为无效;
[0063] (3)根据flat从该分组中选取一个有效三角形,判断该三角形能否加入到area中 所存储的闭合区域中,若能,进行添加,然后把flat设为无效。否则不予处理。具体方法为: [0064] 首先用图示说明过程,如图4所示,A、G、F、E、D、C为边界点且构成闭合区域,B为内 点,易知,闭合区域AGFEDC中不应含有内点B。即如果容器中已存有构成闭合区域的点 ABFEDC,当遍历到三角形GFB时,则将顶点G插入到容器中,构成新的闭合区域ABGFEDC。然后 再遍历到三角形AGB时,就需要将B点从容器中删除,即得到新的闭合区域AGFEDC。于是具体 步骤为:
[0065]第一步,如果area中存在连续的三个点与该三角形的三个顶点相等,说明存在内 点,将area三个点中第二个点删除,然后将flat设为无效。
[0066]第二步,如果area中存在连续的两个点与该三角形的两个顶点相等,则将三角形 另外一个顶点插入到容器中,然后将flat设为无效。否则,不予处理。
[0067] (4)该分组中是否还存在未被处理的三角形,若有,则进入(3)。若没有,则将area 存入al l_area,并将area清空,进入(1)。
[0068]图5为stl格式的轴承模型图,其表面由3108个三角形网格组成。该模型上表面(法 向量x = 0,y = 0,z>0)有三个厚度值(z坐标的值):3.999mm,4.0mm,6.999_。
[0069]图6为本发明对轴承模型上表面特征线的提取结果图。首先根据法向量x = 0,y = 0,z>0从stl文件中读取了840个三角形网格,对三角形分组可以得到15个闭合区域。其中厚 度为6.999mm的闭合区域有1个,第一特征线提取的结果如图6(a)所示。厚度为4.0mm的闭合 区域有4个,提取第二特征线后的结果如图7(b)所示。厚度为3.999mm的闭合区域有10个,提 取第三特征线后的结果如图8(c)所示。
【主权项】
1. 一种基于Stl文件提取指定表面网格特征线的方法,其特征在于采用以下几个步骤: 步骤1,首先对stl文件进行预处理,判断stl文件x,y,z坐标的最小值是否在原点,若不 在原点,则对stl模型进行平移; 步骤2,从stl文件中读取指定表面的所有三角形网格,以三角形为单位存储,并同时存 储其三条边中点的坐标; 步骤3,对存储的三角形分组,使属于同一闭合区域的三角形为一组; 步骤4,对每个分组提取闭合区域的边界点,并按顺序存储,连接边界点得到特征线。2. 根据权利要求1所述的一种基于stl文件提取指定表面网格特征线的方法,其特征在 于步骤1采用的方法:找出st 1文件X,y,Z坐标最小值xMin,yMin,zMin,若(xMin,yMin,zMin) 辛(0,0,0),对stl模型进行平移使(xMin,yMin,zMin) = (0,0,0);否则,不予处理。3. 根据权利要求1所述的一种基于stl文件提取指定表面网格特征线的方法,其特征在 于步骤2采用的方法:确定所要处理的表面在stl文件中的法向量表示,然后以法向量为依 据,从stl文件中读取与指定表面具有相同法向量的所有三角形网格;声明一个结构体,将 每个三角形的三个顶点坐标,连同三条边中点坐标存储到结构体变量当中。4. 根据权利要求1所述的一种基于stl文件提取指定表面网格特征线的方法,其特征在 于步骤3采用的方法:对存储的三角形分组:需判断三角形是否相邻,判断三角形相邻时,运 用了相邻三角形公共边中点坐标相等的理论,即若两个三角形存在相同的边中点坐标,则 两个三角形必有公共边;基于此理论,使所有相邻的三角形分为一组,这些三角形构成一个 闭合区域;具体步骤为: 1) 判断是否还有未参与分组的三角形,如果有,进入2);否则,分组完毕; 2) 新建一个分组,并选取一个未参与分组的三角形放入该分组; 3) 从未参与分组的三角形中选取一个三角形,判断其与该分组当中的三角形是否相 邻,若相邻,加入该分组;否则,不予处理;判断相邻的具体方法为:设未参与分组的三角形 中的三个边的中点坐标为mid_12,mid_23,mid_13,分别与分组中所有三角形边中点做比 较,看是否存在相等的点;若存在,说明相邻;否则,不相邻; 4) 判断是否还存在属于该组的三角形,若存在,进入3),否则,保存该分组,进入1)。5. 根据权利要求1所述的一种基于stl文件提取指定表面网格特征线的方法,其特征在 于步骤4采用的方法:对于每个分组的边界点的提取分以下几步进行: 1) 新建一个存储边界点的容器,从分组中选取一个三角形,并把三角形三个顶点坐标 存储在边界点容器当中; 2) 从该组未被处理的三角形当中选取一个三角形,如果该三角形的三个顶点和边界点 容器中存储的连续三个点相等,说明存在内点,则剔除内点,剔除内点的方法为,将连续三 个点中的第二个点从边界点容器中删除,这样边界点容器中的点按顺序将构成一个新的闭 合区域;如果该三角形中有且仅有两个顶点和边界点容器中存储的连续的两个点相等,则 把该三角形另外一个顶点插入到边界点容器当中,使边界点容器中的点按顺序能够构成一 个新的闭合区域;否则,说明三角形不与容器中存储的闭合区域相邻,不予处理; 3) 该组中若存在剩余三角形,则进入2),否则,边界点提取结束。
【文档编号】G06F17/50GK106096620SQ201610464163
【公开日】2016年11月9日
【申请日】2016年6月24日
【发明人】姜月秋, 张文廷, 高宏伟, 胡寒
【申请人】沈阳理工大学