一、修改模板
现在终于进入了真正的矢量绘图阶段,我们的模版也需要有所改变;至于为什么,有什么作用,以后会说到;
包含下面的头文件,并且在the_application类中添加两个成员。
//扫描线和扫描线光栅器
#include <agg_scanline_u.h>
#include <agg_rasterizer_scanline_aa.h>
private:
//扫描线和扫描线光栅器
agg::scanline_u8 scanline;
agg::rasterizer_scanline_aa<> rasterizer;
二、顶点源
顶点源(Vertex Source)不是一个类,而是一种类的模式。这种类里面有rewind()函数和vertex()函数给AGG内部调用(没错,这就是它的定义)。类如其名,顶点源就是为绘图系统提供顶点信息的,大家能想象得出这两个函数的作用了吗?
rewind():回到最开始个步骤;
vertex(double* x, double* y):每调用一次,跳一个步骤(点),每一个步骤都输出顶点的x,y坐标(灰色字),以及这个坐标的绘图命令(紫色字);
三、内置顶点源
AGG内置了大量的顶点源,我们可以直接调用,他们包括:
agg::path_storage
agg::arc
agg::rounded_rect
agg::ellipse
agg::curve3
agg::curve4 ......
等等,为什么没有线、点顶点源?其实,path_storage已经内置了画线函数、画弧函数、画贝塞尔曲线函数,你可以用path_storage创造几乎任何的图形。至于画点,copy_pixel()或者用椭圆吧……
四、路径储存器
Path storage 是用来管理路径、画复杂图形的。在上面可以任意添加直线、曲线、其他路径。
头文件
#include <agg_path_storage.h>
类型定义
typedef path_base<vertex_block_storage<double> > path_storage;
基本成员函数
- move_to()
添加命令为 path_cmd_move_to 的顶点,意为下一条线从这个点开始画;
- line_to()
添加命令为 path_cmd_line_to 的顶点,意为画线到这个点;
- arc_to(double rx, double ry, double angle, bool large_arc_flag, bool sweep_flag, double x, double y)
添加一条弧路径,画轴长为rx, ry,角度为angle,优/劣弧,顺逆时针,终点在(x,y)。
- curve3_to()
添加贝塞尔曲线,参数为一个控制点和终点的坐标
- curve4_to()
添加贝塞尔曲线,参数为两个控制点和终点的坐标
- join_path()
添加一个顶点源,即组合
- vertex(unsigned idx, double* x, double* y)
last_vertex(double* x, double* y)
vertex(double* x, double* y)
取顶点位置,前者为已知步骤,后两者为顺序或倒序获取
- modify_vertex()
modify_command()
修改步骤为idx的顶点坐标和命令
五、其他顶点源
其他顶点源就不一一介绍了,只列出其头文件和构造函数:
- #include <agg_ellipse.h>
ellipse(double x, double y, double rx, double ry, unsigned num_steps=0, bool cw=false)
圆心(x, y)和长短半轴分别为rx, ry,步骤数位num_steps(无用),cw决定相交地方是否空出
- #include <agg_arc.h>
arc(double x, double y, double rx, double ry, double a1, double a2, bool ccw=true)
圆心为(x, y)和长短半轴分别为rx, ry,初始角度和终结角度为a1, a2
- #include <agg_curves.h>
curve3(double x1, double y1, double x2, double y2, double x3, double y3)
三个点,分别为:初始点,控制点一,终结点
- #include <agg_curves.h>
curve4(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
四个点,分别为:初始点,控制点一,控制点二,终结点
- #include <agg_rounded_rect.h>
rounded_rect(double x1, double y1, double x2, double r)
对角点的坐标和圆角半径
至于怎样把他们画在渲染内存上呢,我们下一篇会讲到。
头文件也渐渐地多了起来,包含头文件时的工作量有点大;我特地列了一个头文件,里面已经包含了所有的AGG头文件,以后大家只需要包含它就好了。
下载处:http://www.cppblog.com/Files/Shihira/agg.h.zip