Slic3r填充代码解析

Fill

 

 

 

首先通过new_from_type函数,将Infillpattern的类型与填充函数一一对应,对于不存在的类型默认返回null。

fill_surface函数,输入surface类型,生成每一区域的infills,polylines_out.如果密度为0,则返回Polylines()。

然后_infill_direction函数计算填充的方向以及参考点(正常打印情况下是STL的几何中心),设置填充角度(默认为0)。

 

FillPlanePath

 

 

_fill_surface_single函数首先将expolygon旋转一定的角度,由min_spacing除以密度求取层间的距离,使用bounding box对齐填充图层(对bounding box以及expolygon进行旋转)。限定打印区域的范围(x.min,x.max,y.min,y.max),将范围内的所有点都存储在polylines.points中,并向开始和结尾延伸polylines以确保与周边重叠。然后再将每一个点的位置还原到原始的坐标系中(旋转和平移),最后将polylines中所有的点拷贝到polylines_out中。

FillArchimedeanChords

根据输入的x.min, x.max, y.min, y.max生成阿基米德螺线的填充方式。

在极坐标系中r=a+b\theta.

首先根据公式sqrt(coordf_t(max_x)*coordf_t(max_x)+coordf_t(max_y)*coordf_t(max_y)) * std::sqrt(2.) + 1.5求取半径rmax(???),然后每次theta增加1/2×pi,r为1+b×theta,r最大不超过rmax,求取所有的二维坐标系中的点,将所有点存储在out中。

hilbert_n_to_xy

根据输入的整数n生成一系列hibernate填充方式的填充的点,根据点在坐标系中绘制出如下的路径:

 

 

三种state如下:

 

 

 

FillHilbertCurve   (x.min, x.max, y.min, y.max)

根据hilbert_n_to_xy函数生成路径的方式,产生在(x.min, x.max, y.min, y.max)范围内的hibernate填充路径

 

FillOctagramSpiral      八角星型填充路径(x.min, x.max, y.min, y.max)

首先根据公式求取rmax

rmax=std::sqrt(coordf_t(max_x)*coordf_t(max_x)+coordf_t(max_y)*coordf_t(max_y)) * std::sqrt(2.)+1.5;

然后生成八角星形状的填充路径,每次增加sqrt(2)的长度,螺旋增加。

 

 

 


 

fillRectilinear:

 

 

首先移除共线的点,旋转polygons,然后求取line_spacing,忽略小于min_spacing的expolygons;

根据密度定义流间距,延长bounding box使之与之前的层对齐,将reference point转换到旋转后的坐标系。将所有与直线垂直线相交的polyline的点存入map中,map可以根据xy的值自动排序;对于每个交点,其位置存储为上/下的形式,上表示交叉线的上端。将原始多边形中的位于两个交点之间的顶点记录为后者的skipped成员。

Skipped包含位于前一个交汇点与当前交汇点之间的polygon points,next包含多边形的一部分,连接当前点与接下来的(在任何方向的)第一个交汇点x > this->x || (x == this->x && y > this->y

skipped_points这个向量存储在最后一个交点之后的原始多边形的顶点;            Points ips这个向量存储交点的坐标。在grid中,将两种类型都一样的交点保存,不一样的先暂存,稍后会移除。分别找到最左边的交点以及最右边的交点的坐标,分别对比p, p-pre,p-next和p,p-next,p-next2,去除方向不一致的点(不在一个方向的三个点),然后计算交点的y坐标。将skipped多边形的顶点存储在ip中,然后移除skipped_points这个向量。

在垂直交叉点之间创建连接,在每一个交叉点与沿着原多边形发现的有较大x或者相同x坐标,按照从左到右的方向创建连接。完成之后,在第一个与最后一个交点之间存在着多边形的所有顶点。

移除所有skipped点,并且移除中间的交点。将svg绘制出来,lower为蓝色,middle为黄色,upper为红色,并存储其number,循环遍历所有垂直的线,获取第一个x坐标,将所有没有y坐标的点移除,对于每一个x应该有偶数个y坐标,因为upper/lower。对于任意一个x,起始的类型应该是lower,如果某一个x坐标的第一个点的类型不是lower,说明是一个变异的多边形,将此x删除。移除一系列不符合的点。

将y坐标添加至连接线,   然后检查是否有overextrusion。路径最后再旋转平移变换至原始的坐标系中

FillConcentric

 

 

 

在这种infill模式下不需要旋转,从最外层向最内层进行,以避免第一个中心小环的粘连问题。使用最近邻搜索分割path,从(0,0)开始,遍历搜索当前点的最近邻,并依次添加在polylines_out的后边。对后添加的polylines_out的点进行裁剪,避免挤压口正好在第一个点处,通过is_valid()判断是否合理,对于不合理的全部去除。

 

 

 

 

 

 

FillHoneycomb

 

 

 

存储正六边形,在正六边形中,存在如下的长度关系:

 

 

 

 

 

 

 

 

 

调整实际的bounding box使其成为正六边形的整倍数,并且使其层间对其。

根据填充方向,以六边形的中心为旋转中心旋转bounding box。

然后一个点一个点的填充正六边形,首先描绘左半边的点,然后对称的右半边,然后向内,重复上述过程。点的描绘大致如下图所示:

 

 

最后再根据正六边形的中心旋转回原始的坐标系。

对上述的点进行删改,删除最后的一段,避免与开始的一段重复。删除与expolygon boundaries相交的点,最后将这些点存储在output中。

 

 

 

Fill3DHoneycomb

 

 

 

正八面体最初应该是竖着放置的,使得方形面与水平面是平行的,方形面的边与x,y轴平行

 

 

 

首先将bounding box与honeycomb的网格对齐,然后使用makeGrid函数水平方向的grid切面,相邻切面的网格是相互垂直的。将网格移到正确的位置,然后连成线,连线的时候需要注意不能连到边界内部的点。

 

colinearPoints函数在特定的高度产生一个由一组有顺序的数组成的向量,与basic打印路径方向相同(NOTE:一个负的offset仅仅引起垂直方向的变化)。

 

 

perpendPoints函数在特定的高度产生与basic打印路径方向垂直的数组成的向量。

 

 

Trim函数将一个数组限定在特定的矩形内,位于边界外的点设为在边界上。

Zip函数将两个向量内的数一一对应存储为一个点的形式(x,y),并返回一个点集。

makeNormalisedGrid使用上述的函数,分别产生组成x轴,y轴的坐标的向量,然后zip成为一个point的形式,形成二维坐标系内的点集,然后trim这些点,限制点不超出矩形范围。

转载于:https://www.cnblogs.com/niufeifei/p/6927916.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值