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这些点,限制点不超出矩形范围。