Stl三角网格模型的三维分段方法

文档序号:6430383阅读:883来源:国知局
专利名称:Stl三角网格模型的三维分段方法
技术领域
本发明属于快速成型技术领域,涉及一种STL三角网格模型的三维分段方法。
背景技术
采用分层离散方式进行堆积制造的快速成型工艺具有不可避免的原理性误差, 主要包括影响零件精度的台阶效应、零件强度不高、成型效率低等缺陷。分段注射/雕刻 (Decomposed Injection Sculpturing,DIS)是基于三维离散、堆积与去除相结合的快速成型工艺,通过结合堆积制造和数控加工的优点能够有效地克服以上缺陷。STL三角网格模型已成为快速成型领域的准工业标准,对STL三角网格模型的三维分段是开发DIS数据处理软件,实现DIS工艺自动化的关键技术之一。不同于典型快速成型中STL三角网格模型的分层切片,STL三角网格模型的三维分段是将该类模型分解为在三轴数控加工中无干涉的子STL模型,即任意平行Z轴的直线与每一个子模型的交点只有一个或只是一段垂直线段。因此STL模型的分层切片技术不能实现STL模型的三维分段。而如赵美利等在学术期刊《系统仿真技术》2008,4(1),P35-39 发表的学术论文“基于STL文件格式的实体分割及缺陷修复方法研究”、赵吉宾等在学术期刊《机械科学与技术》2005,24 (2),P131-134发表的学术论文“基于STL文件的实体分割算法研究”、黎步松等在学术期刊《华中科技大学学报(自然科学版)》2002,30C3),P40-42发表的学生论文“基于STL文件格式的实体分割算法研究与实现”等学术论文中提到的STL 模型实体分割采用平面或组合平面来切割STL模型,也不能获得复杂STL模型的无干涉子模型。黄常标在其博士论文“分段注射/雕刻快速原型制造工艺数据前置处理关键技术研究”中提出了用于STL模型三维离散的扩展Z-Buffer离散法、有向极值轮廓线法、两段分割法、平面截分法等方法。其中扩展Z-Buffer离散法是通过将STL模型离散成点云后再进行分段,该方法消耗内存资源较多;有向极值轮廓线法通过提取STL模型中的极值轮廓线, 并将非封闭的极值轮廓线连接成尽可能长的组合极值轮廓线,用处理后的极值轮廓线来分隔STL模型,该方法对非封闭极值轮廓线的连接处理需要迭代,而迭代是一个消耗比较大的算法;两段分割算法只能处理简单的、只需分解为上下两端的STL模型;平面截分法则只一种三维分段的前置处理方法,在大多的情况下还需要上述其他方法来配合才能完成三维分段。综上所述,针对现有STL三角网格模型的三维分段方法存在资源占有高而效率不高,且几何形状适应性不强等问题,有必要提出一种新的技术方案。

发明内容
本发明的目的在于提供一种STL三角网格模型的三维分段方法,可以高效、可靠地将STL模型分解为多个无干涉的子STL模型,具有高效、占用资源少、几何形状适应性强且三维分割可靠性强的特点。本发明一种STL三角网格模型的三维分段方法,具体包括以下几个步骤
步骤1、从STL文件读入STL三角网格模型到内存中,基于改进的翼边结构建立 STL模型内的面片、边和顶点的完整拓扑信息;步骤2、通过内存中的信息重复搜索获得原STL模型中的最高位置面片作为种子面片,以此为基础采用边界扩展方法搜索与种子面片具有相同法矢Z轴分量符号的邻接面片,获得多个有相同法矢ζ轴分量符号的子STL模型;步骤3、检查每个子STL模型的边界,识别并提取其中的被覆盖边界线,用被覆盖边界线定义的垂直平面来分割子STL模型,进一步产生无干涉的子STL模型。所述的步骤1的具体做法是读入一个STL三角网格模型文件时,每次读入一个三角面片的顶点,通过顶点归并后去除冗余点后建立起顶点到边、顶点到面片、边到顶点、边到面片、面片到顶点、面片到边的邻接拓扑信息,这些STL模型信息以改进的翼边数据结构形式存在于内存中。步骤1中改进的翼边结构是指,存储边信息的结点中包含有①边的两个端点在顶点动态数组中的位置索引值,边的起始端点为较小的索引值,终止端点为较大的索引值;②边的正方向定义为起点指向终点;③边的邻接面片信息根据边的正方向分为左邻接面片信息及右邻接面片信息,为面片动态数组中的索引值。所述的步骤2的具体做法是先寻找内存中原STL模型的最高顶点,检查与该最高顶点相连接的面片的法矢, 确定其法矢Z轴分量的符号,即大于等于0、小于0两种情况之一,将法矢Z轴分量大于等于 0的面片几何信息保存到一个新建的子STL模型中,并以该面片为种子面片,采用边界扩展法搜索与之相连接的、法矢Z轴分量大于等于0的面片,将所有符合条件的面片保存到该子 STL模型中,同时在原STL模型中删除被保存的面片,重复本过程,直到原STL模型为空。所述的边界扩展法搜索子STL模型的方法是①创建一个存储边索引值的动态数组,将种子面片的三条边索引值依次存储到动态数组,将该面片信息保存到分段STL子模型后从原STL模型中删除,并从对应边中删除拓扑信息,因此边索引动态数组中的边最多只有一个相邻面片;②遍历边索引动态数组,取出每条边的邻接面片,将法矢Z轴分量符号与种子面片一致的面片信息保存到分段STL子模型,在将该面片的其余边索引加入动态数组后从原 STL模型中删除,并从对应边中删除拓扑信息,最后从动态数组中删除本次处理的边索引;③重复步骤②直到边索引动态数组为空。所述的步骤3的具体做法是检查子STL模型中的边界,将只有一个邻接面片的边界边根据其端点索引值依次连接起来形成边界线,依次检查边界线中的边界边,识别其中的被覆盖边界线的起始边和终止边,从起始边开始连接边界边直到遇到终止边,构成相应的被覆盖边界线;由被覆盖边界线中每条边界边生成一个垂直带状平面,分别与子STL模型求交后,将子STL模型进一步分解为无干涉的子STL模型。所述的识别子STL模型中的被覆盖边界线的方法是①检查子STL模型的边数组,只有一个相邻面片的边为子STL模型的边界边,顺序连接边界边获得子STL模型边界线;

②遍历子STL模型边界线,找出所有被覆盖边界线的起始边和终止边,具体方法为对每一条边界边E,按左手原则确定边矢量£,若在包含边E的面片是垂直面的情况下,检查共用边出发顶点的另一边界边的邻接面片,如果为非垂直面片,则边E为被覆盖边界线的起始边;若在包含边E的面片不是垂直面的情况下,检查共用边出发顶点的另一边界边的邻接面片,如果是垂直面片,则边E为被覆盖边界线的终止边;若在包含边E的面片不是垂直面,且共用边出发顶点的另一边界边的邻接面片也不是垂直面的情况下,将g投影到XOY平面的矢量为云,取边出发顶点的每一个引用面片F, 边E的所属面片除外,面片F法矢为冗、F中从边起始顶点发出的两条边在XOY平面上的投影矢量分别为$和@,当叉积矢量i'xg和Z轴分量符号相反、且矢量点积云为正时,矢量点积及.云为负,则边E为被覆盖边界线的起始边;矢量点积为正, 则边E为被覆盖边界线的终止边;③从任一被覆盖边界线的起始边出发,依次连接边界边,直到遇到被覆盖边界线的终止边,获得一条被覆盖边界线; ④重复步骤③直到所有被覆盖边界线的起始边都构成一条被覆盖边界线。本发明与现有相关技术相比,具有以下优点(1)本发明提供的STL三角网格模型的三维分段方法能够有效实现STL三角网格模型的三维分段,且适应性强;(2)采用改进的翼边结构存储STL三角网格模型内的数据及其拓扑信息时,可以节省存储空间,且能够高效地去除冗余点和冗余边,建立面片、边、顶点之间的拓扑联系;(3)采用边界扩展法搜索子STL模型的方法和被覆盖边界线分割子STL模型的方法能够快速将STL模型分解为无干涉的子STL模型,在提高效率的同时,增强了三维分割的
可靠性。


图1是本发明的流程示意图;图2是本发明所建立的改进翼边数据结构示意图;图3是本发明采用的边界扩展法搜索子STL模型的流程示意图;图4是本发明的边界扩展法搜索子STL模型的示意图;图5是本发明提取子STL模型中被覆盖边界线的流程示意图;
图6是本发明实施实例STL模型线框图;图7是本发明实施实例STL模型的三维分段子STL模型之一;图8是本发明实施实例STL模型的三维分段子STL模型之二 ;图9是本发明实施实例STL模型的三维分段子STL模型之三;图10是本发明提取图7所示子模型中的被覆盖边界线;图11是被覆盖边界线分割图10所示子模型后获得的子模型之一;图12是被覆盖边界线分割图10所示子模型后获得的子模型之二。
以下结合具体实施例对本发明作进一步详述。 具体实施例如图1所示,本发明一种STL三角网格模型的三维分段方法,具体包括以下步骤步骤1、从STL文件读入STL三角网格模型到内存中,基于改进的翼边结构建立 STL模型内的面片、边和顶点的完整拓扑信息;读入一个STL三角网格模型文件时,每次读入一个三角面片的顶点,通过顶点归并后去除冗余点后建立起顶点到边、顶点到面片、边到顶点、边到面片、面片到顶点、面片到边的邻接拓扑信息,这些STL模型信息以改进的翼边数据结构形式存在于内存中。所述的改进的翼边结构是指存储边信息的结点中,包含有①边的两个端点在顶点动态数组中的位置索引值,边的起始端点为较小的索引值,终止端点为较大的索引值;②边的正方向定义为起点指向终点;③边的邻接面片信息根据边的正方向分为左邻接面片信息及右邻接面片信息,为面片动态数组中的索引值。如图2所示,本发明所建立的改进翼边数据结构能够保存读入STL模型时建立的顶点到边、顶点到面片、边到顶点、边到面片、面片到顶点、面片到边的邻接拓扑信息。数据结构包含三个动态数组分别保存所有的顶点结点、边结点、面片结点,通过索引值可以快速获得对应的结点信息。编程时顶点结点采用CVertex类、边结点采用CEdge类、面片结点采用CFacet类来实现。其中边结点动态数组中每个边结点保存有边的起始端点索引值和终止端点索引值、两个邻接面片的索引值,并规定边的起始端点索引值小于终止端点索引值、边的正方向定义为起点指向终点、边的邻接面片信息根据边的正方向分为左邻接面片信息及右邻接面片信息;面片结点动态数组中的每个面片结点分别按照左手规则保存三个顶点的索引值和三条边的索引值;顶点结点动态数组中的每个顶点结点中除了保存顶点坐标信息外还保存了引用该顶点的所有边索引值和面片索引值。动态数组采用MFC中的CArray类来实现,顶点结点数组定义为CArray < CVertex*, CVertex* > m_ArrVertex,边结点动态数组定义为 CArray < CEdge*,CEdge* > m_ArrCEdge,面片结点动态数组定义为 CArray < CFacet*, CFacet* > m_ArrCFacet0步骤2、通过内存中的信息重复搜索获得原STL模型中的最高位置面片作为种子面片,以此为基础采用边界扩展方法搜索与种子面片具有相同法矢Z轴分量符号的邻接面片,获得多个有相同法矢ζ轴分量符号的子STL模型;先寻找内存中原STL模型的最高顶点,检查与该最高顶点相连接的面片的法矢, 确定其法矢Z轴分量的符号(即大于等于0、小于0两种情况之一),将法矢Z轴分量大于等于0的面片几何信息保存到一个新建的子STL模型中,并以该面片为种子面片,采用边界扩展法搜索与之相连接的、法矢Z轴分量大于等于0的面片,将所有符合条件的面片保存到该子STL模型中,同时在原STL模型中删除被保存的面片,重复本过程,直到原STL模型为空。如图3所示,所述的边界扩展法搜索子STL模型的方法是
①创建一个存储边索引值的动态数组,将种子面片的三条边索引值依次存储到动态数组,将该面片信息保存到分段STL子模型后从原STL模型中删除,并从对应边中删除拓扑信息,因此边索引动态数组中的边最多只有一个相邻面片;②遍历边索引动态数组,取出每条边的邻接面片,将法矢Z轴分量符号与种子面片一致的面片信息保存到分段STL子模型,在将该面片的其余边索引加入动态数组后从原 STL模型中删除,并从对应边中删除拓扑信息,最后从动态数组中删除本次处理的边索引;③重复步骤②直到边索引动态数组为空。编程时首先创建一个动态数组CArray<int,int&>m_ArrEdgeIndex临时保存边索引值,创建一个空的STL模型对象来保存子STL模型的信息;然后检索STL模型获得位置最高的面片作为种子面片,将该面片信息保存到子STL模型中,在将种子面片的边索引值保存和将该面片索引值从对应边和顶点中删除拓扑信息后,将111_ ArrCFacet中相应位置面片信息删除并将该位置的指针值设为NULL ;遍历动态数组!11_ ArrEdgeIndex,通过边索引值Wm_ArrCEdge取出边,然后取出每条边的邻接面片,将法矢Z 轴分量符号与种子面片一致的面片保存到分段子模型,在将该面片的其余边索引加入动态数组后从原模型中删除,并从对应边中删除拓扑信息,最后从动态数组中删除本次处理的边索引;重复遍历动态数组nuArrEdgelndex直到该数组为空。图4中加粗折线显示了搜索子STL模型过程中的一个边界边动态数组中的边界。步骤3、检查每个子STL模型的边界,识别并提取其中的被覆盖边界线,用被覆盖边界线定义的垂直平面来分割子STL模型,进一步产生无干涉的子STL模型;检查子STL模型中的边界,将只有一个邻接面片的边界边根据其端点索引值依次连接起来形成边界线,依次检查边界线中的边界边,识别其中的被覆盖边界线的起始边和终止边,从起始边开始连接边界边直到遇到终止边,构成相应的被覆盖边界线;由被覆盖边界线中每条边界边生成一个垂直带状平面,分别与子STL模型求交后,将子STL模型进一步分解为无干涉的子STL模型。如图5所示,所述的识别子STL模型中的被覆盖边界线的方法是①检查子STL模型的边数组,只有一个相邻面片的边为子STL模型的边界边,顺序连接边界边获得子STL模型边界线;②遍历子STL模型边界线,找出所有被覆盖边界线的起始边和终止边,具体方法为对每一条边界边E,按左手原则确定边矢量£,若在包含边E的面片是垂直面的情况下,检查共用边出发顶点的另一边界边的邻接面片,如果为非垂直面片,则边E为被覆盖边界线的起始边;若在包含边E的面片不是垂直面的情况下,检查共用边出发顶点的另一边界边的邻接面片,如果是垂直面片,则边E为被覆盖边界线的终止边;若在包含边E的面片不是垂直面,且共用边出发顶点的另一边界边的邻接面片也不是垂直面的情况下,将云投影到XOY平面的矢量为云,取边出发顶点的每一个引用面片F, 边E的所属面片除外,面片F法矢为及、F中从边起始顶点发出的两条边在XOY平面上的投影矢量分别为 ^^Ρ ^,当叉积矢量和云><@的Z轴分量符号相反、且矢量点积云为正时,矢量点积及.云为负,则边E为被覆盖边界线的起始边;矢量点积 为正,则边E为被覆盖边界线的终止边;③从任一被覆盖边界线的起始边出发,依次连接边界边,直到遇到被覆盖边界线的终止边,获得一条被覆盖边界线;④重复步骤③直到所有被覆盖边界线的起始边都构成一条被覆盖边界线。编程时首先通过检查子模型的边结点数组,只有一个相邻面片的边为子模型的边界边,顺序连接边界边获得子STL模型边界线,保存到临时动态数组CArray<int,int&>m_ ArrboundaryEdgeIndex ;遍历数组m_ArrboundaryEdgeIndex,找出所有被覆H边界线的起始边和终止边;然后新定义动态数组CArray < int,int& > m_ArrOverlapEdgeIndex,并从 m_ArrboundaryEdgeIndex中的任一被覆盖边界线的起始边出发,依次连接边界边,直到遇到被覆盖边界线的终止边,获得一条被覆盖边界线的动态数组nuArrOverlapEdgehdex,数组中包含被覆盖边界线起始边索引值,但不包含被覆盖边界线终止边的索引值。如图6至图12所示,为本发明的实施实例。图6所示为测试STL三角网格模型, 读入内存后显示该STL模型共包含1684个三角面片,合并重复的顶点后由1684X3 = 5052 个顶点变成844个。实施本发明的边界扩展法搜索子STL模型的程序后,图6中的STL模型分解为3 个子STL模型,分别如图7-9所示。实施本发明的提取子STL模型中被覆盖边界线的程序后,识别出图7所示子STL 模型有被覆盖边界线,分别如图10 (对应图7所示子模型)中所示的粗实线。通过被覆盖边界线的裁剪,图10所示的子模型被分割为图11和图12所示的子 STL模型。至此,图6所示的STL模型被分解为4个无干涉的子STL模型。以上所述,仅是本发明较佳实施例而已,并非对本发明的技术范围作任何限制,故凡是依据本发明的技术实质对以上实施例所作的任何细微修改、等同变化与修饰,均仍属于本发明技术方案的范围内。
权利要求
1.一种STL三角网格模型的三维分段方法,其特征在于包括以下几个步骤步骤1、从STL文件读入STL三角网格模型到内存中,基于改进的翼边结构建立STL模型内的面片、边和顶点的完整拓扑信息;步骤2、通过内存中的信息重复搜索获得原STL模型中的最高位置面片作为种子面片, 以此为基础采用边界扩展方法搜索与种子面片具有相同法矢Z轴分量符号的邻接面片,获得多个有相同法矢Z轴分量符号的子STL模型;步骤3、检查每个子STL模型的边界,识别并提取其中的被覆盖边界线,用被覆盖边界线定义的垂直平面来分割子STL模型,进一步产生无干涉的子STL模型。
2.根据权利要求1中所述的一种STL三角网格模型的三维分段方法,该步骤1的具体做法是读入一个STL三角网格模型文件时,每次读入一个三角面片的顶点,通过顶点归并后去除冗余点后建立起顶点到边、顶点到面片、边到顶点、边到面片、面片到顶点、面片到边的邻接拓扑信息,这些STL模型信息以改进的翼边数据结构形式存在于内存中。
3.根据权利要求1、2所述的任一种STL三角网格模型的三维分段方法,其步骤1中所述的改进的翼边结构是指,存储边信息的结点中包含有①边的两个端点在顶点动态数组中的位置索引值,边的起始端点为较小的索引值,终止端点为较大的索引值;②边的正方向定义为起点指向终点;③边的邻接面片信息根据边的正方向分为左邻接面片信息及右邻接面片信息,为面片动态数组中的索引值。
4.根据权利要求1中所述的一种STL三角网格模型的三维分段方法,该步骤2的具体做法是先寻找内存中原STL模型的最高顶点,检查与该最高顶点相连接的面片的法矢,确定其法矢Z轴分量的符号,即大于等于0、小于0两种情况之一,将法矢Z轴分量大于等于0 的面片几何信息保存到一个新建的子STL模型中,并以该面片为种子面片,采用边界扩展法搜索与之相连接的、法矢Z轴分量大于等于0的面片,将所有符合条件的面片保存到该子 STL模型中,同时在原STL模型中删除被保存的面片,重复本过程,直到原STL模型为空。
5.根据权利要求1、4中所述的任一种STL三角网格模型的三维分段方法,所述的边界扩展法搜索子STL模型的方法是①创建一个存储边索引值的动态数组,将种子面片的三条边索引值依次存储到动态数组,将该面片信息保存到分段STL子模型后从原STL模型中删除,并从对应边中删除拓扑信息,因此边索引动态数组中的边最多只有一个相邻面片;②遍历边索引动态数组,取出每条边的邻接面片,将法矢Z轴分量符号与种子面片一致的面片信息保存到分段STL子模型,在将该面片的其余边索引加入动态数组后从原STL 模型中删除,并从对应边中删除拓扑信息,最后从动态数组中删除本次处理的边索引;③重复步骤②直到边索引动态数组为空。
6.根据权利要求1中所述的一种STL三角网格模型的三维分段方法,该步骤3的具体做法是检查子STL模型中的边界,将只有一个邻接面片的边界边根据其端点索引值依次连接起来形成边界线,依次检查边界线中的边界边,识别其中的被覆盖边界线的起始边和终止边,从起始边开始连接边界边直到遇到终止边,构成相应的被覆盖边界线;由被覆盖边界线中每条边界边生成一个垂直带状平面,分别与子STL模型求交后,将子STL模型进一步分解为无干涉的子STL模型。
7.根据权利要求1、6中所述的任一种STL三角网格模型的三维分段方法,所述的识别子STL模型中的被覆盖边界线的方法是①检查子STL模型的边数组,只有一个相邻面片的边为子STL模型的边界边,顺序连接边界边获得子STL模型边界线;②遍历子STL模型边界线,找出所有被覆盖边界线的起始边和终止边,具体方法为对每一条边界边E,按左手原则确定边矢量云,若在包含边E的面片是垂直面的情况下,检查共用边出发顶点的另一边界边的邻接面片,如果为非垂直面片,则边E为被覆盖边界线的起始边;若在包含边E的面片不是垂直面的情况下,检查共用边出发顶点的另一边界边的邻接面片,如果是垂直面片,则边E为被覆盖边界线的终止边;若在包含边E的面片不是垂直面,且共用边出发顶点的另一边界边的邻接面片也不是垂直面的情况下,将g投影到XOY平面的矢量为云,取边出发顶点的每一个引用面片F,边E 的所属面片除外,面片F法矢为及、F中从边起始顶点发出的两条边在XOY平面上的投影矢量分别为$和@,当叉积矢量i'xg和Z轴分量符号相反、且矢量点积云·;^ 为正时,矢量点积云为负,则边E为被覆盖边界线的起始边;矢量点积^SEJlJaE 为被覆盖边界线的终止边;③从任一被覆盖边界线的起始边出发,依次连接边界边,直到遇到被覆盖边界线的终止边,获得一条被覆盖边界线;④重复步骤③直到所有被覆盖边界线的起始边都构成一条被覆盖边界线。
全文摘要
本发明一种STL三角网格模型的三维分段方法,先从STL文件读入STL三角网格模型到内存中,基于改进的翼边结构建立STL模型内的面片、边和顶点的完整拓扑信息;然后通过内存中的信息重复搜索获得原STL模型中的最高位置面片作为种子面片,以此为基础采用边界扩展方法搜索与种子面片具有相同法矢Z轴分量符号的邻接面片,获得多个有相同法矢Z轴分量符号的子STL模型;最后检查每个子STL模型的边界,识别并提取其中的被覆盖边界线,用被覆盖边界线定义的垂直平面来分割子STL模型,进一步产生无干涉的子STL模型;本发明可以有效实现STL三角网格模型的三维分段,且适应性强,效率高,占用资源少。
文档编号G06T17/30GK102298795SQ20111022833
公开日2011年12月28日 申请日期2011年8月10日 优先权日2011年8月10日
发明者刘斌, 林俊义, 江开勇, 黄常标 申请人:华侨大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1