AGG入门(七) - 顶点源

一、修改模板

现在终于进入了真正的矢量绘图阶段,我们的模版也需要有所改变;至于为什么,有什么作用,以后会说到;
包含下面的头文件,并且在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

posted on 2012-07-24 16:30 Shihira 阅读(4986) 评论(4)  编辑 收藏 引用 所属分类: 图形编程

评论

# re: AGG入门(七) - 顶点源 2012-07-25 03:54 testcairo

N多年前研究过AGG,从矢量图形算法的角度说也没什么特别。架构上,把模板技术搞的太过,既然用C++又完全不利用标准库重新造轮子还不如用C。
从应用方面说,纯C的cairo的比它强太多,跨平台能力更强  回复  更多评论   

# re: AGG入门(七) - 顶点源 2012-07-25 13:38 Shihira

@testcairo
嘛……我就是觉得他的模板太多了,搞得结构很混乱。看你名字叫testcairo吧,我也觉着cairo是件好东西,就是体积庞大了点
我有空打算自己写一个像样的vector库,直接用C  回复  更多评论   

# re: AGG入门(七) - 顶点源[未登录] 2012-08-01 11:02 avlee

不可否认,AGG是纯软件矢量渲染(通常用在服务器端)方面不可多得的开源实现。  回复  更多评论   

# re: AGG入门(七) - 顶点源 2012-08-03 15:01 Shihira

@avlee
没错,我最欣赏它的就是它把绘图内容、像素什么的用数组表现出来,而不是像GDI一样画什么只给个句柄给你,要获取里面的内容又要一大段工序~~  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

公告

留言簿(2)

随笔分类

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜