适用于生物材料3D打印的模型分层以及轨迹填充方法与流程

文档序号:18002225发布日期:2019-06-25 22:58阅读:351来源:国知局
适用于生物材料3D打印的模型分层以及轨迹填充方法与流程

本发明涉及一种用于生物材料3d打印的,stl文件格式3d模型的读取,切片以及轨迹生成方法。



背景技术:

3d打印模型文件目前最常用的就是stl格式,它可以由cad,solidworks等常用软件直接生成。.stl文件是在计算机图形应用系统中,用于表示三角形网格的一种文件格式。它的文件格式非常简单,应用很广泛。stl是最多快速原型系统所应用的标准文件类型。stl是用三角网格来表现3dcad模型。快速原型即3d打印技术,就是填充该平面图形,沿高度方向逐层迭加,最后形成物理模型。

三角形面片网格在stl文件中是散乱分布的,只有对这些网格以某种关系进行组织,然后求出截平面与三角形网格棱边的交点,构成有序点集,才能成为有意义的平面边界。常见的stl文件切片方法通常为z高度下逐层切片,然后这需要大量的重复计算。通常的优化算法是通过建立三角形面片表,使得切割完一个三角形网格后,能利用毗邻资料查找到下一个待切割的三角形网格最终返回起点,得到一个有序切割点列。但是该类方法未考虑当截平面切割到三角形网格顶点时的情形,在该情形下,无法搜索到下一个待切割的网格,将造成切片算法失败。



技术实现要素:

针对上述技术不足,本发明的目的提供一种适用于生物材料3d打印的模型分层以及轨迹填充方法。该方法可以在复杂的轨道环境中,快速的提供给天车最短的移动路线。

本发明解决其技术问题所采用的技术方案是:一种适用于生物材料3d打印的模型分层以及轨迹填充方法,包括以下步骤:

1)将stl数据按照几何逻辑结构建立三种索引数据结构:点,边,三角形;

2)根据索引数据结构的拓扑关系建立起点与点之间,边与边之间,面片与面片之间的临接关系,获得连续的切片轨迹数据;

3)对切片轨迹进行填充。

所述步骤1)包括:

对读取的stl散点数据利用去冗余算法进行数据预处理;

读取的三个散点按照顺时钟顺序依次提取一对散点,并将两个散点中索引较小的存入edge类型边l[k]的散点索引l[k].xyindex[0],较大的存入l[k].xyindex[1],并将三条边的faceindex[0]赋值为所在三角形v[j].index;k表示边缓存数组下标;

循环存入l[k]到set类型容器setedge,通过find函数判断如果setedge中已存在这条边,则将l[k].faceindex[1]赋值为find返回迭代器指向元素的faceindex[0];

将三条边l[k]按照顺时钟顺序赋予triangle类型的三角形数据结构v[j]的三个临边索引v[j].lineindex[i];最终将setedge容器中的边存入vector容器vecedge中等待使用;i表示散点缓存数组下标;j表示三角形缓存数组下标;

根据三角形的三个边,以及边的邻接关系生成三角形的邻接三角形索引,最终生成顶点,边,三角形的索引字典表。

所述利用去冗余算法进行数据预处理具体为:

依次读取一个三角形的三个散点坐标到三个xyz类型变量p[3],将一个散点p[i]存入vector容器vectri之前先存入一个set容器settri,通过find函数判断如settri中已存在相同元素,则只索引容器中的位置即p[i].index置为find函数返回迭代器指向元素的索引标号,如果p[i]是一个新的点则插入vectri容器末尾并赋予新的索引编号,p[i].index=settri.size();依次将三个散点存入一个triangle类型的三角形v[j]的xyzindex[i];每读取一个新的三角形,将三角形的索引v[j].index赋值为j,然后将j递增加一;j表示三角形缓存数组下标。

修改去冗余算法的边界条件:如果计算任意两个点之间的直线距离小于一个固定值,则认为这两个点是同一个点。

所述三种索引数据结构形式为:

散点数据结构xyz:包含三个float型成员x,y,z代表三角形的三个散点坐标,包含一个int型成员index,代表三角形索引值;

边数据结构edge:包含二个元素的int型成员数组xyindex[2]代表边的三个散点索引,包含二个元素的int型成员数组faceindex[2]代表边的两条边索引,包含一个int型成员index,代表边索引值;

三角形数据结构triangle:包含三个元素的int型成员数组xyzindex[3]代表三角形的三个散点索引;包含三个元素的int型成员数组lineindex[3]代表三角形的三条边索引;包含三个元素的int型成员数组faceindex[3]代表三角形的三个邻接三角形索引;包含一个int型成员index,代表三角形索引值。

所述步骤2)中,当索引数据结构中某散点与层切片高度相等时,将与切片某一层高等高的散点统一增加一个固定的高度,且该高度小于层高的一半。

所述步骤3)具体如下:

(1)以一个方向即y方向对每层轮廓线等间隔求交点,保证每次扫描线与轮廓的交点为偶数个;

(2)利用蛇形查找算法,获得每层的一个或多个填充线;具体为:

(2.1)首先选择一个层高度z,根据该层获得所有扫描求交后的点,并确定扫描线平移的方向,设步骤(1)中扫描方向固定为y方向;

(2.2)保存蛇形轨迹如下:

首先定义x为交点的x坐标,y为交点的y坐标,则一条扫描线与轮廓相交,则该扫描线产生的所有交点具有相同的y值;

当操作次数为偶数次时,提取一条扫描线的求交结果缓存中下标最小的,且未被使用的两个交点,并存入当前蛇形轨迹的缓存容器中,然后标记这两个点为已使用;

当操作次数为奇数次时,沿y递增方向,如果存在下一条扫描线的交点,提取一条扫描线的求交结果缓存中下标最小的,且未被使用的两个交点,并存入当前蛇形轨迹的缓存容器中,然后标记这两个点为已使用;如果不存在下一条扫描线,则认为本条蛇形线已经终止,并沿着y递增方向遍历扫描线交点,寻找y最小的,同时x最小的未使用的两个点作为下一条蛇形线的起点;

遍历一层中所有扫描线交点,直到获得该层所有的蛇形线轨迹。

(2.3)z坐标方向递增,遍历所有层的扫描线交点,获得所有层的蛇形线轨迹。

如果蛇形连续填充轨迹中,某两点间距离小于设定长度则判断该部分填充轨迹是短边;如果判断短边长于若干倍的扫描线间距,则立即截止本条连续的蛇形填充线,跳出本次循环并重新查找新的没有使用过的截点,直到遍历所有截点获得全部蛇形填充线;所述短边指切换扫描线时,两条填充线之间的过渡轨迹。

本发明具有以下有益效果及优点:

1.本发明基于临边表搜索,建立起点,边,面的三角形索引。已知三角形索引表就能够遍历到三个邻接三角形的索引,三条边的索引,和三个点的索引;已知边索引表,就能够遍历到两个临接三角形索引,和两个点的索引。

2.同时发明对数据散点的特殊情况进行了补偿处理,提供了一种低模型精度损失量的简单补偿方法。发明同时提供了专门适用于生物材料3d打印的高通透度填充方法,以及轨迹g代码生成方法,极大地提高了生物医学应用价值。

附图说明

图1是本发明的类结构图;

图2是一个散点绕某轴v旋转a角度的过程流程图;

图3是蛇形线方法流程图。

图4a是存在轨迹的不恰当的过渡线示意图。

图4b是是解决不恰当过渡线的方法示意图。

具体实施方式

下面结合实施例对本发明做进一步的详细说明。

一种适用于生物材料3d打印的模型分层以及轨迹填充方法,适用于高分子生物材料,比如明胶,胶原等。方法包含了模型的数据拓扑重建,切片算法,填充算法,机器语言g代码生成算法。

数据拓扑重建算法是基于点,边,三角形的严格邻接关系。数据拓扑重建算法提供了模型容错的方法用来提供程序的鲁棒性。数据拓扑重建算法提供了去冗余的方法用来简化计算量。

切片算法是基于数据拓扑重建算法提供的数据,对z高度进行等高度切片。切片算法带有数据预处理补偿。

填充算法包含有一个蛇形线轨迹填充方法。填充算法解决不恰当过渡线的方法是判断蛇形线短边的时候,判断短边与本条填充线的角度不小于45度,即短边的长度不得长于1.414倍的扫描线间距。填充算法的旋转方法是对某一层所有点依次进行四元数旋转处理。

机器语言g代码生成算法,机器的运动速度是按照移动距离变化。

方法的程序结构,其实现方式为四个类以及相应的方法。

方法是一个c++实现的程序,其类结构图如图1所示。

step1.stl数据拓扑重建(ctriangulate类实现)

首先读取一个stl文件到file中,通过查找读取vertex字符串提取文本类型的散点数据;如果读取文本类型失败,则按照二进制stl文件的数据存储位置读取散点数据。判断读取文本文件是否成功的方法为判断读取散点数据缓存的长度是否为0,如为0则失败。将stl数据按照几何逻辑结构建立三种索引数据结构:点,边,三角形;

三种数据结构要求:

1.已知三角形索引表就能够遍历到三个邻接三角形的索引,三条边的索引,和三个点的索引;

2.已知边索引表,就能够遍历到两个临接三角形索引,和两个点的索引;三种数据结构的形式为:

散点数据结构xyz:包含三个float型成员x,y,z代表三角形的三个散点坐标。包含一个int型成员index,代表三角形索引值。

边数据结构edge:包含二个元素的int型成员数组xyindex[2]代表边的三个散点索引。包含二个元素的int型成员数组faceindex[2]代表边的两条边索引。包含一个int型成员index,代表边索引值。

三角形数据结构triangle:包含三个元素的int型成员数组xyzindex[3]代表三角形的三个散点索引。包含三个元素的int型成员数组lineindex[3]代表三角形的三条边索引。包含三个元素的int型成员数组faceindex[3]代表三角形的三个邻接三角形索引。包含一个int型成员index,代表三角形索引值。

一个数据拓扑重建的过程为:

对读取的stl散点数据利用去冗余算法进行数据预处理,所述预处理方法为依次读取一个三角形的三个散点坐标到三个xyz类型变量p[3],将一个散点p[i]存入vector容器vectri之前先存入一个set容器settri,通过find函数判断如settri中已存在相同元素,则只索引容器中的位置并将p[i].index置为find函数返回迭代器指向元素的索引标号,如果p[i]是一个新的点则添加到容器尾巴并赋予新的索引编号,p[i].index=settri.size();依次三个散点存入一个triangle类型的三角形v[j]的xyzindex[i]。每读取一个新的三角形,将三角形的索引v[j].index赋值为j。

读取的三个散点按照顺时钟顺序依次提取一对散点,并将两个散点中索引较小的存入edge类型边l[k]的散点索引l[k].xyindex[0],较大的存入l[k].xyindex[1],并将三条边的faceindex[0]赋值为所在三角形v[j].index;

循环存入l[k]到set类型容器setedge,通过find函数判断如果setedge中已存在这条边,则将l[k].faceindex[1]赋值为find返回迭代器指向元素的faceindex[0];

将三条边l[k]按照顺时钟顺序赋予triangle类型的三角形数据v[j].lineindex[i]。最终将setedge容器中的边存入存入vector容器vecedge中等待使用。

根据三角形的三个边,以及边的邻接关系生成三角形的邻接三角形索引,最终生成顶点,边,三角形的索引字典表。

其中i:表示散点缓存数组下标,k:表示边缓存数组下标,j:表示三角形缓存数组下标。

本发明中的拓扑重建算法提供了模型容错的方法。由于stl文件生成不严谨,很有可能出现模型文件的不封闭,即某个三角形的某条边不存在临接三角形。本发明通过修改去冗余算法的边界条件来达到容错的目的。容错的边界条件是在去冗余的过程中,如果计算任意两个点之间的直线距离小于一个可调整的固定值,比如0.001mm,则认为这两个点是同一个点。具体方法为重载set容器的小于符号。所述重载小于号的描述为:首先定义set容器中已有的散点p1和待判断散点p2:定义一个给定值tolerance(可等于0.0001)。然后计算:

如果p1.z<(p2.z–tolerance),返回true;

如果p1.z>(p2.z+tolerance),返回false;

如果p1.y<(p2.y–tolerance),返回true;

如果p1.y>(p2.y+tolerance),返回false;

如果p1.x<(p2.x–tolerance),返回true;

如果p1.x>(p2.x+tolerance),返回false;

其他情况返回false。

step2切片算法(callcoutour类实现)

根据第一步生成的几何拓扑关系,可以得到stl文件数据结构有序的拓扑关系。根据这种拓扑关系可以很方便地建立起点与点之间,边与边之间,面片与面片之间的临接关系。继而可以根据一些方法获得连续的切片轨迹数据。

本方法根据z方向高度增量依次求交:

以一个高度的单层切片算法为例(conecoutour类实现):

1.声明bool数组,表示所有边都没有被切过;

2.假设当前切平面高度为zvalue,找到一个与当前切平面相交的边,求交并标注已被切过;所述相交的边表示为line,其关于是否相交的判断方法为判断索引为line.xyindex[0]和line.xyindex[1]的两个散点pt1和pt2,其z值如果满足pt1.z<zvalue<pt2.或者pt1.z>zvalue>pt2,则认为该边与切平面相交,交点为属于该边两点的直线与该平面的几何交点。

stl模型有些散点会存在与层切片高度一致的情况,通常的算法是忽略他们,然而这样做会导致模型牺牲了一些几何特征。本发明为对stl文件的散点做统一预处理。所述预处理为数值补偿的方法,即将与切片某一层高等高的散点统一增加一个固定的高度(该高度小于层高的一半)。

3.通过建立边,角,三角形的几何拓扑关系,可以通过可以预测的时间复杂度o(n)来根据一条边快速找到包含的顶点以及它所临接的两个三角形面片;根据一个三角形面片快速找到包含的边以及它的所有临接三角形;由拓扑关系遍历这条边所有的2个临接三角形的5条非己边,按一个固定顺序(比如顺时钟)选取第一条有效边作为下一条边,如此循环迭代直到获得一个封闭轮廓曲线。所述非己边指对于某条正在使用的边lc,它的两个邻接三角形的六条边中排除lc的剩余五条边。所述有效边的判断依据为未被操作过,同时其满足所述的相交条件;

4.由于某些结构存在空腔,需要判断是否存在没有使用过的边,直到将该层所有边全都求交完毕;

对一个模型的切片算法即利用上述四个步骤,对高度量z递增,直到每层都获得一个或多个连续的封闭轮廓;

step3填充算法(cpointpath类实现)

定义:

1.填充线:指沿同一条扫描线切割轮廓后产生的点,两两连接产生的封闭线段。

2.短边:指切换扫描线的时候,两条填充线之间的过度轨迹。

填充流程如下:

1.对每层扫描求交,应保证每次扫描线与轮廓的截点是偶数个。方法为采用预处理的方法。所述预处理方法的方法,即将对所有与扫描线共线的该层轮廓点统一平移一个固定的距离。(该距离小于扫描线间距的一半)。

所述对一层进行的扫描过程为对xyz坐标系,选择x方向或者y方向作为扫描起始方向,定义一条平行于扫描起始方向的直线scan_line,然后按照固定的扫描线间隔gap(工艺参数,可选0.16mm)对扫描线scan_line进行平移,每平移一次计算该scan_line与扫描层的轮廓线的交点,每次扫描线求得的轮廓交点按照坐标的x值由小到大保存。

同时由于生物材料,特别是针对于生物支架要求其具备一定的孔隙,孔隙具备通透性。这是因为孔隙结构直接影响着细胞的生长和生长因子的扩散速度。因而填充轨迹要求层与层之间是严格对齐的,这样的做法可以使得孔隙具备完全的通透性。这种要求下,需要对每层的扫描求交结果做对齐处理。对齐处理的算法是将各扫描线结果取扫描线间隔的整数倍近似处理。

求交的方式可以是任意角度的。实现任意角度填充的方法是对于每层的所有轮廓点进行旋转操作。所述旋转操作的方法是通过四元数方法来提高旋转点阵的速度。

一个散点w=(wx,wy,wz)绕某轴v旋转a角度的过程具体表示如图2所示。

2.利用蛇形查找算法,获得每层的一个或多个填充线。算法具体描述为:首先选择一个层高度z,根据该层获得所有扫描求交处理后的点,并确定扫描线平移的方向,假设上一部中扫描方向固定位y方向。

保存条蛇形轨迹按照提取顺序分为两中操作:

首先定义x为交点的x坐标,y为交点的y坐标。则一条扫描线与轮廓相交,则该扫描线产生的所有交点具有相同的y值。

当操作次数为偶数次时,提取一条扫描线的求交结果缓存中下标最小的,且未被使用的两个交点,并存入当前蛇形轨迹的缓存容器中,然后标记这两个点为已使用。

当操作次数为奇数次时,沿y递增方向,如果存在下一条扫描线的交点,提取一条扫描线的求交结果缓存中下标最小的,且未被使用的两个交点,并存入当前蛇形轨迹的缓存容器中,然后标记这两个点为已使用。如果不存在下一条扫描线,则认为本条蛇形线已经终止,并沿着y递增方向遍历扫描线交点,寻找y最小的,同时x最小的未使用的两个点作为下一条蛇形线的起点。

遍历一层中所有扫描线交点,直到获得该层所有的蛇形线轨迹。

z坐标方向递增,遍历所有层的扫描线交点,获得所有层的蛇形线轨迹。

蛇形线方法如图3所示。

由于模型结构可能有空腔的存在,在按照扫描线顺序等间隔填充过程中必然会出现截断,得到多条蛇形线;同时由于腔室的存在,可能存在轨迹的不恰当的过渡线,如图4a所示。解决不恰当过渡线的方法是如图4b所示。判断蛇形线短边的时候,判断短边与本条填充线的角度不小于45度,即短边的长度不得长于1.414倍的gap。如果判断短边长于1.414倍的扫描线间距,则立即截止本条连续的蛇形填充线,跳出本次循环并重新查找新的没有使用过的截点,直到遍历所有截点获得全部蛇形填充线。

符号说明gap:扫描线间距

step4机器语言g代码生成算法(cgcode类)

依次提取一个连续的填充线缓存,对该缓存中连续的两个点p1,p2转为.g1点定位指令,其中g1指令形式为:f%.4fg1x%.4fy%.4fz%.4fe%.4f。

f代表运动速度,g1代表标准g代码直线插补运算,x,y,z分别代表运动的三维坐标的目标位置。e代表材料进给量。

由于填充算法中短边的存在,短边不宜运动过慢,大量试验经验表面过慢会导致材料堆积。因而运动速度f按照移动距离dis变化,具体变化方式为:

f=vs(如果dis大于1.414*gap)

f=a*vs(如果dis小于或等于1.414*gap)

其中vs为预设定速度,

其中a为大于1的经验数据。

其中计算两点间距离的公式如下:

dis=sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y))

对于不同轨迹衔接方式:先z方向抬高1cm,然后直接运动到下一个轨迹的首点。

p1.x、p2.x分别为两点的x坐标,p1.y、p2.y分别为两点的y坐标。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1