conv_contour扩展轮廓线

3.1误区

在整个实验的过程中,很多的例子都会使用agg::conv_contour这个部件,然后大家异口同声的说:进行轮廓变换!!构造参数为VertexSource width属性决定扩展或收缩轮廓。是在已有的例子中,即使去除该部件的转换,也没有看到有什么的异样!!就像选择一样,如果只有一个选择,不管该选择是对是错,你也只能认栽了!!专家并不是凭直觉解决问题,而是根据从实践中的完整的体系架构,并且养成分析问题的方法以及思考的习惯,解决问题。但是现在很少得到重视。

3.2 分析

       轮廓线是图形的轮廓边界,扩展轮廓线也就是在图形的中心位置不变的情况下,边界进行了放缩,和affine的仿射缩放不同,后者是中心位置也会产生偏移,针对于圆形非常好理解,可以尝试对一个圆形分别进行agg::conv_contouragg::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的时候,并没有进行轮廓的放缩,可以清晰的了解到,进行轮廓放缩的时候,圆形变大了,实际上是圆形的轮廓边界放大的缘故,但是圆心不变!!

3.3 图形处理流程

网上提供的一般逻辑:

矩阵变换agg::conv_transform

轮廓边界扩展(实际上是边界缩放)agg::conv_contour

转换成多义线(显示轮廓线)agg::conv_stroke

再次重申:agg::conv_contouragg::conv_stroke作为“坐标转换管道Coordinateconversion pipeline”,conv_contour扩展轮廓线,conv_stroke只显示轮廓线(如果没有conv_stroke就会显示实心圆,可以去掉试试)。

 

3.4代码分析

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));


你可能感兴趣的:(agg)