AGG内置了大量的顶点源,我们可以直接调用,他们包括:
agg::path_storage
agg::arc
agg::rounded_rect
agg::ellipse
agg::curve3
agg::curve4 ......
1)针对agg::path_storage
现在尝试查看agg::path_storage直接传递给scanline rasterizer之后的效果:
//现在我们尝试描绘一条线段,这里有一个问题不通过agg::conv_stroke,怎么
//设置线段的宽度,默认值也没有
//什么也没有,根本无法画线,看来还是需要传递给agg::conv_stroke??
agg::path_storage ps1;
ps1.move_to(130,130);
ps1.line_to(140,140);
ras.add_path(ps1);
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));
ras.reset();
//难道不能够直接描绘,还是我们描绘的方式不正确!!
//如果再次添加一条线段,现在可以构成一个闭区间,又会如何:
agg::path_storage ps1;
ps1.move_to(130,130);
ps1.line_to(140,140);
ps1.line_to(150,130);
ras.add_path(ps1);
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));
ras.reset();
//出来了,终于出来了,这是一个实心的三角形,填充颜色为红色。
简单的结论:当我们不经过agg::conv_stroke的时候,实际上这些顶点源可能没有方向,不可能啊!!line_to是干啥的!!
2)针对agg::ellipse
可对比如下的两份代码:
1)
agg::ellipse ellipse(250, 125, 125, 125);
ras.reset();
ras.add_path(ellipse);
//实心圆
2)
agg::ellipse ellipse(250, 125, 125, 125);
agg::conv_stroke<agg::ellipse> stroke(ellipse);
ras.reset();
ras.add_path(stroke);
//空心圆
所以我们终于知道,当我们将顶点源传递给stroke是画线,如果直接add_path实际上
是渲染一个形状,现在假设当agg::ellipse传递给agg::conv_stroke的时候,实际上
将圆的顶点全部传递给了线段容器,线段容器,这个时候线段容器当然是把圆的弧线
进行了端点的相连,但是不会填充颜色,因为看成是线段
但是直接传递给ras的时候,是一系列的顶点,而Scanline Rasterizer能够把顶点数据转换成
一组水平扫描线,扫描线由一组线段(Span)组成,这个时候,实际上就是圆同一水平线的
两点之间进行了扫描连接.
总结:顶点源如果能够形成一个闭区间,完全能够传递给ras,描绘一个实体,如果不能,
将不会渲染任何的东西,当通过agg::conv_stroke传递给ras,描绘的是线段。
/*
两种不同的方案,一种是当做是标志,而不是一个填充的实体,上面是一个空心
的
三角形,而下面是一个填充的三角形。在这里可以详细的描述一点:任何的多边
形都可以
使用三角形来拆分,所以
*/
//agg::conv_stroke<agg::path_storage> stroke(ps);
//ras.add_path(stroke);
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,0,0));
由于画太极图的需要,我需要进行圆形的填充,GDI提供了Pie函数,而AGG并没有提供任何的函数
因此提出的一种方案:
填充颜色,对圆进行填充颜色,真的非常麻烦,没有提供什么接口,也找不到任何
的资料,我打算提供每一行的圆的两点,然后画直线的方式填充。经过上面的讨论
终于找到解决的方案。