`

用AGG实现高质量图形输出(二)

 
阅读更多

用AGG实现高质量图形输出(二)

来自http://www.cppprog.com/2009/0821/150.html

上次讲了AGG的显示原理并举了一个简单的例子,这一篇文章开始讲AGG工作流程里的每个环节。为了方便对照,再放一次AGG显示流程 图

 

agg显示流程

 

另外,上 一篇文章里的例 程也 很重要,后面的例子都将基于这个代码。

下面,我们来考察AGG显示流程中的每个环节。理解每个环节最好的方法是编写实验代码,建议先参照这里建 立一个可以运行的AGG实验环境。

顶点源(Vertex Source)

<!--基本属性-->

顶点源(Vertex Source)

顶点源是一种可以产生多边形所需要的“带命令的顶点”的对象。比如三角形顶点源,就应该会产生一个带“MoveTo”命令的点,另外二 个带"LineTo"命令的点和最终闭合的“ClosePoly”命令。

头文件

#include <agg_path_storage.h> //path_storage
#include <agg_ellipse.h>  // ellipse
#include <agg_arc.h> // arc
#include <agg_arrowhead.h> // arrowhead
#include <agg_curves.h> // curve3, curve4
#include <agg_gsv_text.h> // gsv_text, gsv_text_outline
#include <agg_rounded_rect.h> // rounded_rect
...

类型

自定义类 所有实现了void rewind(unsigned path_id);和unsigned vertex(double* x, double* y);的类。
ellipse 圆,输入为中心点坐标和XY轴半径,本文所用的例子就 使用了这个顶点源
arc 弧线,输入为中心点坐标和XY轴半径,以及起始和终止角(rad),顺时针/逆时针方向
curve3 贝塞尔曲线,输入为起点坐标、第一控制点坐标、终点点坐标
curve4 贝塞尔曲线,输入为起点坐标、第一控制点坐标、第二控制点坐标、终点坐标
gsv_text 使用AGG自带字模的文字输出(只支持ASCII码),使用start_point方法指定文字位置,text方法指定 文字,flip指定是否上下倒转,size指定文字大小,适合与conv_stroke或gsv_text_outline配合。
gsv_text_outline<> 可变换文字,输入为gsv_text和变换矩阵(默认为trans_affine,后文会提到)。width方法设置文 字宽度
rounded_rect 圆角方形,输入为左上角右下角坐标和圆角半径
path_storage 路径存储器,可以用join_path方法加入多个顶点源。而且path_storage本身支持move_to, line_to,curve和arc_to等画线功能
arrowhead 箭头,它是作为标记点来用的

其中的arrowhead颇为特殊,它一般作为线段的标记点,具体用法是这样的:

arrowhead ah;
ah.head(d1,d2,d3,d4); //定义箭头
ah.tail(d1,d2,d3,d4); //定义箭尾
VertexSource VS; //其它顶点源
// 使用顶点转换器,并指定Markers类型为vcgen_markers_term
// 顶点转换器可以是conv_dash、conv_stroke或conv_marker_adaptor,见后文《坐标转换管道》
// vcgen_markers_term:以端点作为标记点
conv_stroke<VertexSource, vcgen_markers_term> csVS(VS);
...draw_term
// 用conv_marker指定ah作为线段marker点的标记
conv_marker<vcgen_markers_term, arrowhead> arrow(csVS.markers(), ah);
ras.add_path(csVS);
ras.add_path(arrow); //marker要紧随其后加入
...render

ah.head()和ah.tail()方法中的d1,d2,d3,d4参数的意义见下图

arrowhead

例,画一条简单的箭头直线(基于此处代码)

在on_draw()方法最后加上下列代码:

  1. agg::arrowhead ah;
  2.  ah.head(0,10,5,5);
  3.  ah.tail(10,10,5,5);
  4.  // 用path_storage生成一条直线
  5.  agg::path_storage ps;
  6.  ps.move_to(160,60);
  7.  ps.line_to(100,100);
  8.  // 转换
  9.  agg::conv_stroke<agg::path_storage, agg::vcgen_markers_term> csps(ps);
  10.  agg::conv_marker<agg::vcgen_markers_term, agg::arrowhead>
  11.      arrow(csps.markers(), ah);
  12.  // 画线
  13.  ras.add_path(csps);
  14.  agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,0,0));
  15.  // 画箭头
  16.  ras.add_path(arrow);
  17.  agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));
得到的图形是:
arrow demo

注意要加头文件:

#include "agg_conv_marker.h"
#include "agg_arrowhead.h"
#include "agg_path_storage.h"
#include "agg_vcgen_markers_term.h"

试验代码,自定义一个顶点源(基于此处代码)

为了对顶点源有更深入的了解,我们要自己实现一个顶点源,这个顶点源只是很简单的一个三角形。

前面说过,只要实现了 void rewind(unsigned path_id); 和 unsigned vertex(double* x, double* y); 方法就可以作为顶点源。

rewind方 法指示顶点源回到第一个顶点;vertex方 法取出当前顶点然后把当前顶点下移,返回值是当前顶点所带的命令。所谓的命令是一个enum path_commands_e类 型,定义如下:

  1. enum path_commands_e
  2. {
  3.     path_cmd_stop     = 0,        //----path_cmd_stop   
  4.     path_cmd_move_to  = 1,        //----path_cmd_move_to
  5.     path_cmd_line_to  = 2,        //----path_cmd_line_to
  6.     path_cmd_curve3   = 3,        //----path_cmd_curve3 
  7.     path_cmd_curve4   = 4,        //----path_cmd_curve4 
  8.     path_cmd_curveN   = 5,        //----path_cmd_curveN
  9.     path_cmd_catrom   = 6,        //----path_cmd_catrom
  10.     path_cmd_ubspline = 7,        //----path_cmd_ubspline
  11.     path_cmd_end_poly = 0x0F,     //----path_cmd_end_poly
  12.     path_cmd_mask     = 0x0F      //----path_cmd_mask   
  13. };

path_commands_e还 能和path_flags_e组 合:

  1. enum path_flags_e
  2. {
  3.     path_flags_none  = 0,         //----path_flags_none
  4.     path_flags_ccw   = 0x10,      //----path_flags_ccw 
  5.     path_flags_cw    = 0x20,      //----path_flags_cw  
  6.     path_flags_close = 0x40,      //----path_flags_close
  7.     path_flags_mask  = 0xF0       //----path_flags_mask
  8. }; 

vertex()返回的命令中含有path_cmd_stop时 表示结束。

  1. // 等边三角形
  2. class triangle{
  3. public:
  4.     triangle(double cx, double cy, double r)//中心点,r为中心点到边的长度
  5.     {
  6.         // 直接准备好三个点
  7.         m_step = 0;
  8.         m_pt[0].x = cx; m_pt[0].y = cy-r;
  9.         m_pt[1].x = cx+r*0.866; m_pt[1].y = cy+r*0.5;
  10.         m_pt[2].x = cx-r*0.866; m_pt[2].y = cy+r*0.5;
  11.         //AGG把方向作为区分多边形内部和外部的依据,可以试试m_pt[1]和m_pt[2]对调
  12.     }
  13.     void rewind(unsigned)
  14.     {
  15.         m_step = 0;
  16.     }
  17.     unsigned vertex(double* x, double* y)
  18.     {
  19.         switch(m_step++)
  20.         {
  21.         case 0:
  22.             //第一步,move_to
  23.             *x = m_pt[0].x;
  24.             *y = m_pt[0].y;
  25.             return agg::path_cmd_move_to;
  26.         case 1:
  27.         case 2:
  28.             //第二、三步,line_to
  29.             *x = m_pt[m_step-1].x;
  30.             *y = m_pt[m_step-1].y;
  31.             return agg::path_cmd_line_to;
  32.         case 3:
  33.             // 第四步,闭合多边形
  34.             return agg::path_cmd_end_poly|agg::path_flags_close;
  35.         default:
  36.             // 第五步,结束
  37.             return agg::path_cmd_stop;
  38.         }
  39.     }
  40. private:
  41.     agg::point_d m_pt[3];
  42.     unsigned m_step;
  43. };

在on_draw()方法里把

    agg::ellipse ell(100,100,50,50); 改成triangle ell(100,100,50);
    typedef agg::conv_contour<agg::ellipse> ell_cc_type;改成typedef agg::conv_contour<triangle> ell_cc_type;
得到的图形是:

triange demo


除了文字输出功能(gsv_text只能输出ASCII文字),上面这些顶点源提供的图形丰富程度已经超过了系统API。文字输出功能 将以单独的篇幅讲述。

  • 大小: 5.4 KB
  • 大小: 2.5 KB
  • 大小: 11.3 KB
  • 大小: 9.4 KB
分享到:
评论
1 楼 liyiwen007 2010-04-21  
学习了!
很受益!

相关推荐

    用AGG实现高质量图形输出.pdf

    2 AGG图形显示原理见下图: 1 3 要理解AGG的工作原理,先看一段代码: 2 4 顶点源(Vertex Source) 5 4.1 头文件 5 4.2 类型 5 4.3 画一条简单的箭头直线(基于此处代码) 6 4.4 自定义一个顶点源(基于此处代码) 7 5 ...

    用AGG实现高质量图形输出.zip

    用AGG实现高质量图形输出.zip,AGG图像引擎介绍

    agg-2.5 2D图形库

    agg为开源的高效跨平台2D图形开发库,内部包含了大量的GDI图形绘制源码和示例!

    agg 开源的、高效的2D图形库

    AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高,而且它是跨平台的,其宣传可以在非常多的操作系统上运行,包含在Windows、Wince、Linux台平。 agg的特点 1、支持...

    AGG与GDI两种图形库在MFC下的图形绘制

    AGG与GDI两种图形库在MFC下的图形绘制,开发工具是vc2005,实现了AGG下的各种属性设置,透明度的设置,以及在两种不同库下的编辑图形和显示图形。

    agg-2.5 AGG是一个开源、高效的跨平台2D图形库

    AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高(自称超过GDI+) 1.下载AGG库,它的家在http://www.antigrain.com,目前最高版本是AGG2.5 2.解压,后面以[AGG]表示AGG的...

    AGG图形库资料

    保存&分享AGG图形库相关资料,文档+2.5源码

    2d图形开发库agg

    2d图形开发库AGG,跨平台渲染库,C源代码

    Agg的.NET移植Agg-Sharp.zip

    它提供一套结合了亚像素(subpixel accuracy)技术与反走样(anti-aliasing)技术的图形算法,实现高效率、高质量的二维图形处理功能。AGG 的另一个特点在于它极大的灵活性。其作者将它描述为“创建其它工具的工具”...

    agg二维开发入门例程

    agg二维绘图工具源码及入门例程及安装开发入门

    AGG是一个开源、高效的跨平台2D图形库 这是它的离线文档

    AGG是一个开源、高效的跨平台2D图形库 这是它的离线文档

    agg2.5源码+文档

    开源跨平台2d图形库,agg2.5源码+文档

    agg_svg_viewer补丁包

    AGG是一个开源的二维图形引擎,它提供了一个功能有限的SVG解析、渲染工具svg_viewer。我对svg_viewer做了如下改进: - 支持解析 、&lt;ellipse&gt; 元素,以及&lt;rect&gt; 的 rx、ry 属性(圆角矩形)。 - 支持格式为 rgb(ddd...

    Agg学习资料

    包括: 基于AGG算法库的通用图形接口设计.pdf AGG绝好资料.doc 介绍和推荐AGG.doc

    agg-2.5.zip

    一个很优秀的2D图形引擎. Anti-Grain Geometry (AGG) - Version 2.5 A high quality rendering engine for C++ Copyright (C) 2002-2006 Maxim Shemanarev

    agg学习手册

    学习agg的好文档,详细介绍了AGG的图形变换流程,很好的学习手册

    Agg在Windows下的编译 字符集 Unicode

    Agg在Windows下的编译与使用...AGG(Anti-Grain Geometry)是一个开源免费的图形库。 官网地址: www.antigrain.com 环境: Win10 x64 Visual Studio 2013 字符集 Unicode 主要是编译称为Lib库,然后提供给其他程序使用

    一个AGG的测试事例

    AGG测试,一个AGG的测试事例。一个GDI和AGG在MFC下使用的例子。

    agg在windows平台编译

    AGG在windows系统visual studio 2013平台编译及开发;已经上传了编译成功的AGG.lib, 使用时将include文件夹添加到链接库即可。

    AGG 官方用户手册

    1,AGG官方用户手册 2,英文原版 3,精心编辑完整索引 4,mnorst出品,必属佳作

Global site tag (gtag.js) - Google Analytics