前言:
path_storage是一个非常重要的顶点容器,并且也提供了很多的形状,在这里,我们看看path_storage是否可以描绘圆形,没有找到任何相关的函数支持直接画圆形,由于项目中并没有使用到任何贝塞尔曲线,所以也并不展开讨论相关的话题。因此引入了其他的顶点源,agg::ellipse去描绘一个圆形。该实例代码并没有引入坐标转换管道,该专业术语将会在一章描述。
//Vertex Source顶点源,我更喜欢称之为端点集合,或者点集合矩阵 //第一个参数是圆形圆心的X坐标,第二个参数是圆形圆心的Y坐标 //第三个参数是圆形的X半径,第四个参数是圆形的Y半径,当X半径不 //等于Y半径的时候,渲染出来的实际上是一个椭圆,具体可调整参数 //根据第三和第四个参数可以了解到圆形可以是一个扁平的圆形, //不一定就是一个规规矩矩的圆形 agg::ellipse ell(200,200,50,100); //选择画笔,当前可以尝试使用虚线去渲染,后面描述到!! typedef agg::conv_stroke<agg::ellipse> ell_cc_cs_type; ell_cc_cs_type csccell(ell); //尝试使用虚线来渲染,替换上面的实线,但是什么也没有看到,白板啊,白板啊! //typedef agg::conv_dash<agg::ellipse> ell_cc_cs_type; //ell_cc_cs_type csccell(ell); ras.add_path(csccell); rensl.color(agg::rgba8(255,0,0)); agg::render_scanlines(ras,sl,rensl); ras.reset();
在很多的教材中在这里就已经直接引入坐标转换管道,将代码存在选择画笔之前,初学者会以为必须引入方可描绘圆弧,其实不然,本例子尽可能不调用一些额外的函数,就描绘了圆形,可对比揣摩下面的代码: //Vertex Source顶点源,我更喜欢称之为端点集合,或者点集合矩阵 //第一个参数是圆形圆心的X坐标,第二个参数是圆形圆心的Y坐标 //第三个参数是圆形的X半径,第四个参数是圆形的Y半径 //根据第三和第四个参数可以了解到圆形可以是一个扁平的圆形, //不一定就是一个规规矩矩的圆形 agg::ellipse ell(200,200,50,100); //Coordinate conversion pipeline坐标转换通道,晦涩难懂, //在这里设想一下add_path添加的都是直线什么的,并不支持 //圆形这种半弧形,因此将弧形分拆成线段由线段组合成弧形 //个人观点,欢迎指正!! 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); ccell.width(20); ras.add_path(csccell); rensl.color(agg::rgba8(255,0,0)); agg::render_scanlines(ras,sl,rensl); 下一章将会通过坐标转换管道,来进行椭圆的缩放变换。 注:接下来也会从源码的角度剖析agg::path_storage是如何构建容器存储线段的数据,比如起点和终点,并且项目中遇到agg渲染崩溃的问题,可能和容器的大小有关,查看是否是一个可扩展的数组。 typedefpath_base<vertex_block_storage<double> > path_storage;
时间: 2024-12-29 23:22:42