顶点源是一种可以产生多边形所需要的“带命令的顶点”的对象。比如三角形顶点源,就应该会产生一个带“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;
conv_stroke<VertexSource, vcgen_markers_term> csVS(VS);
...draw_term
conv_marker<vcgen_markers_term, arrowhead> arrow(csVS.markers(), ah);
ras.add_path(csVS);
ras.add_path(arrow);
...render
ah.head()和ah.tail()方法中的d1,d2,d3,d4参数的意义见下图
例,画一条简单的箭头直线(基于此处代码)
在on_draw()方法最后加上下列代码:
-
agg::arrowhead ah;
-
ah.head(0,10,5,5);
-
ah.tail(10,10,5,5);
-
-
agg::path_storage ps;
-
ps.move_to(160,60);
-
ps.line_to(100,100);
-
-
agg::conv_stroke<agg::path_storage, agg::vcgen_markers_term> csps(ps);
-
agg::conv_marker<agg::vcgen_markers_term, agg::arrowhead>
-
arrow(csps.markers(), ah);
-
-
ras.add_path(csps);
-
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,0,0));
-
-
ras.add_path(arrow);
-
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));
得到的图形是:
注意要加头文件:
#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类 型,定义如下:
-
enum path_commands_e
-
{
-
path_cmd_stop = 0,
-
path_cmd_move_to = 1,
-
path_cmd_line_to = 2,
-
path_cmd_curve3 = 3,
-
path_cmd_curve4 = 4,
-
path_cmd_curveN = 5,
-
path_cmd_catrom = 6,
-
path_cmd_ubspline = 7,
-
path_cmd_end_poly = 0x0F,
-
path_cmd_mask = 0x0F
-
};
path_commands_e还 能和path_flags_e组 合:
-
enum path_flags_e
-
{
-
path_flags_none = 0,
-
path_flags_ccw = 0x10,
-
path_flags_cw = 0x20,
-
path_flags_close = 0x40,
-
path_flags_mask = 0xF0
- };
vertex()返回的命令中含有path_cmd_stop时 表示结束。
-
-
class triangle{
-
public:
-
triangle(double cx, double cy, double r)
-
{
-
-
m_step = 0;
-
m_pt[0].x = cx; m_pt[0].y = cy-r;
-
m_pt[1].x = cx+r*0.866; m_pt[1].y = cy+r*0.5;
-
m_pt[2].x = cx-r*0.866; m_pt[2].y = cy+r*0.5;
-
-
}
-
void rewind(unsigned)
-
{
-
m_step = 0;
-
}
-
unsigned vertex(double* x, double* y)
-
{
-
switch(m_step++)
-
{
-
case 0:
-
-
*x = m_pt[0].x;
-
*y = m_pt[0].y;
-
return agg::path_cmd_move_to;
-
case 1:
-
case 2:
-
-
*x = m_pt[m_step-1].x;
-
*y = m_pt[m_step-1].y;
-
return agg::path_cmd_line_to;
-
case 3:
-
-
return agg::path_cmd_end_poly|agg::path_flags_close;
-
default:
-
-
return agg::path_cmd_stop;
-
}
-
}
-
private:
-
agg::point_d m_pt[3];
-
unsigned m_step;
-
};
在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;
得到的图形是:
除了文字输出功能(gsv_text只能输出ASCII文字),上面这些顶点源提供的图形丰富程度已经超过了系统API。文字输出功能 将以单独的篇幅讲述。
相关推荐
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图像引擎介绍
agg为开源的高效跨平台2D图形开发库,内部包含了大量的GDI图形绘制源码和示例!
AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高,而且它是跨平台的,其宣传可以在非常多的操作系统上运行,包含在Windows、Wince、Linux台平。 agg的特点 1、支持...
AGG与GDI两种图形库在MFC下的图形绘制,开发工具是vc2005,实现了AGG下的各种属性设置,透明度的设置,以及在两种不同库下的编辑图形和显示图形。
AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高(自称超过GDI+) 1.下载AGG库,它的家在http://www.antigrain.com,目前最高版本是AGG2.5 2.解压,后面以[AGG]表示AGG的...
保存&分享AGG图形库相关资料,文档+2.5源码
2d图形开发库AGG,跨平台渲染库,C源代码
它提供一套结合了亚像素(subpixel accuracy)技术与反走样(anti-aliasing)技术的图形算法,实现高效率、高质量的二维图形处理功能。AGG 的另一个特点在于它极大的灵活性。其作者将它描述为“创建其它工具的工具”...
agg二维绘图工具源码及入门例程及安装开发入门
AGG是一个开源、高效的跨平台2D图形库 这是它的离线文档
开源跨平台2d图形库,agg2.5源码+文档
AGG是一个开源的二维图形引擎,它提供了一个功能有限的SVG解析、渲染工具svg_viewer。我对svg_viewer做了如下改进: - 支持解析 、<ellipse> 元素,以及<rect> 的 rx、ry 属性(圆角矩形)。 - 支持格式为 rgb(ddd...
包括: 基于AGG算法库的通用图形接口设计.pdf AGG绝好资料.doc 介绍和推荐AGG.doc
一个很优秀的2D图形引擎. Anti-Grain Geometry (AGG) - Version 2.5 A high quality rendering engine for C++ Copyright (C) 2002-2006 Maxim Shemanarev
学习agg的好文档,详细介绍了AGG的图形变换流程,很好的学习手册
Agg在Windows下的编译与使用...AGG(Anti-Grain Geometry)是一个开源免费的图形库。 官网地址: www.antigrain.com 环境: Win10 x64 Visual Studio 2013 字符集 Unicode 主要是编译称为Lib库,然后提供给其他程序使用
AGG测试,一个AGG的测试事例。一个GDI和AGG在MFC下使用的例子。
AGG在windows系统visual studio 2013平台编译及开发;已经上传了编译成功的AGG.lib, 使用时将include文件夹添加到链接库即可。
1,AGG官方用户手册 2,英文原版 3,精心编辑完整索引 4,mnorst出品,必属佳作