在整个实验的过程中,很多的例子都会使用agg::conv_contour这个部件,然后大家异口同声的说:进行轮廓变换!!构造参数为VertexSource width属性决定扩展或收缩轮廓。是在已有的例子中,即使去除该部件的转换,也没有看到有什么的异样!!就像选择一样,如果只有一个选择,不管该选择是对是错,你也只能认栽了!!专家并不是凭直觉解决问题,而是根据从实践中的完整的体系架构,并且养成分析问题的方法以及思考的习惯,解决问题。但是现在很少得到重视。
轮廓线是图形的轮廓边界,扩展轮廓线也就是在图形的中心位置不变的情况下,边界进行了放缩,和affine的仿射缩放不同,后者是中心位置也会产生偏移,针对于圆形非常好理解,可以尝试对一个圆形分别进行agg::conv_contour和agg::trans_affine处理,可以看到明显的效果:
agg::conv_contour原地膨胀
agg::trans_affine圆心偏移,并且放缩
agg::conv_contour提供的width函数中参数如果是正数,进行拉伸dilate,如果是负数,进行压缩shrink
3.3 例子回放
//Vertex Source
agg::ellipse ell(100,100,50,50);
// Coordinate conversion pipeline
typedef agg::conv_contour<agg::ellipse> ell_cc_type;
ell_cc_type ccell(ell);
typedef agg::conv_stroke<ell_cc_type> ell_cc_cs_type;
ell_cc_cs_type csccell(ccell);
// Draw
renb.clear(agg::rgba8(255,255,255));
for(int i=0; i<3; i++)
{
ccell.width(i*50);//看清楚,这是对轮廓线的实例进行的操作,而不是stroke实例
ras.add_path(csccell);
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));
}
分析:当i = 0的时候,并没有进行轮廓的放缩,可以清晰的了解到,进行轮廓放缩的时候,圆形变大了,实际上是圆形的轮廓边界放大的缘故,但是圆心不变!!
网上提供的一般逻辑:
矩阵变换agg::conv_transform
轮廓边界扩展(实际上是边界缩放)agg::conv_contour
转换成多义线(显示轮廓线)agg::conv_stroke
再次重申:agg::conv_contour和agg::conv_stroke作为“坐标转换管道Coordinateconversion pipeline”,conv_contour扩展轮廓线,conv_stroke只显示轮廓线(如果没有conv_stroke就会显示实心圆,可以去掉试试)。
conv_contour实际上是由vcgen_contour
真正实现的!!几乎所有的实现都是调用了vcgen_contour
的generator函数
一个简单的测试例子:
agg::ellipse ell(100,100,50,50);
agg::trans_affine mtx;
mtx.scale(2,1);
typedef agg::conv_transform<agg::ellipse> ell_ct_type;
ell_ct_type ctell(ell, mtx);
/************/
typedef agg::conv_contour<ell_ct_type> ell_cc_type;
ell_cc_type ccell(ctell); // 轮廓变换
ccell.width(6);//nothing happen
/************/
typedef agg::conv_stroke<ell_cc_type> ell_cc_cs_type;
ell_cc_cs_type csccell(ccell);
//csccell.width(6);
ras.add_path(ccell);
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));