一、修改模板
現(xiàn)在終于進(jìn)入了真正的矢量繪圖階段,我們的模版也需要有所改變;至于為什么,有什么作用,以后會(huì)說(shuō)到;
包含下面的頭文件,并且在the_application類(lèi)中添加兩個(gè)成員。
//掃描線(xiàn)和掃描線(xiàn)光柵器
#include <agg_scanline_u.h>
#include <agg_rasterizer_scanline_aa.h>
private:
//掃描線(xiàn)和掃描線(xiàn)光柵器
agg::scanline_u8 scanline;
agg::rasterizer_scanline_aa<> rasterizer;
二、頂點(diǎn)源
頂點(diǎn)源(Vertex Source)不是一個(gè)類(lèi),而是一種類(lèi)的模式。這種類(lèi)里面有rewind()函數(shù)和vertex()函數(shù)給AGG內(nèi)部調(diào)用(沒(méi)錯(cuò),這就是它的定義)。類(lèi)如其名,頂點(diǎn)源就是為繪圖系統(tǒng)提供頂點(diǎn)信息的,大家能想象得出這兩個(gè)函數(shù)的作用了嗎?
rewind():回到最開(kāi)始個(gè)步驟;
vertex(double* x, double* y):每調(diào)用一次,跳一個(gè)步驟(點(diǎn)),每一個(gè)步驟都輸出頂點(diǎn)的x,y坐標(biāo)(灰色字),以及這個(gè)坐標(biāo)的繪圖命令(紫色字);

三、內(nèi)置頂點(diǎn)源
AGG內(nèi)置了大量的頂點(diǎn)源,我們可以直接調(diào)用,他們包括:
agg::path_storage
agg::arc
agg::rounded_rect
agg::ellipse
agg::curve3
agg::curve4 ......
等等,為什么沒(méi)有線(xiàn)、點(diǎn)頂點(diǎn)源?其實(shí),path_storage已經(jīng)內(nèi)置了畫(huà)線(xiàn)函數(shù)、畫(huà)弧函數(shù)、畫(huà)貝塞爾曲線(xiàn)函數(shù),你可以用path_storage創(chuàng)造幾乎任何的圖形。至于畫(huà)點(diǎn),copy_pixel()或者用橢圓吧……
四、路徑儲(chǔ)存器
Path storage 是用來(lái)管理路徑、畫(huà)復(fù)雜圖形的。在上面可以任意添加直線(xiàn)、曲線(xiàn)、其他路徑。
頭文件
#include <agg_path_storage.h>
類(lèi)型定義
typedef path_base<vertex_block_storage<double> > path_storage;
基本成員函數(shù)
- move_to()
添加命令為 path_cmd_move_to 的頂點(diǎn),意為下一條線(xiàn)從這個(gè)點(diǎn)開(kāi)始畫(huà);
- line_to()
添加命令為 path_cmd_line_to 的頂點(diǎn),意為畫(huà)線(xiàn)到這個(gè)點(diǎn);
- arc_to(double rx, double ry, double angle, bool large_arc_flag, bool sweep_flag, double x, double y)
添加一條弧路徑,畫(huà)軸長(zhǎng)為rx, ry,角度為angle,優(yōu)/劣弧,順逆時(shí)針,終點(diǎn)在(x,y)。
- curve3_to()
添加貝塞爾曲線(xiàn),參數(shù)為一個(gè)控制點(diǎn)和終點(diǎn)的坐標(biāo)
- curve4_to()
添加貝塞爾曲線(xiàn),參數(shù)為兩個(gè)控制點(diǎn)和終點(diǎn)的坐標(biāo)
- join_path()
添加一個(gè)頂點(diǎn)源,即組合
- vertex(unsigned idx, double* x, double* y)
last_vertex(double* x, double* y)
vertex(double* x, double* y)
取頂點(diǎn)位置,前者為已知步驟,后兩者為順序或倒序獲取
- modify_vertex()
modify_command()
修改步驟為idx的頂點(diǎn)坐標(biāo)和命令
五、其他頂點(diǎn)源
其他頂點(diǎn)源就不一一介紹了,只列出其頭文件和構(gòu)造函數(shù):
- #include <agg_ellipse.h>
ellipse(double x, double y, double rx, double ry, unsigned num_steps=0, bool cw=false)
圓心(x, y)和長(zhǎng)短半軸分別為rx, ry,步驟數(shù)位num_steps(無(wú)用),cw決定相交地方是否空出
- #include <agg_arc.h>
arc(double x, double y, double rx, double ry, double a1, double a2, bool ccw=true)
圓心為(x, y)和長(zhǎng)短半軸分別為rx, ry,初始角度和終結(jié)角度為a1, a2
- #include <agg_curves.h>
curve3(double x1, double y1, double x2, double y2, double x3, double y3)
三個(gè)點(diǎn),分別為:初始點(diǎn),控制點(diǎn)一,終結(jié)點(diǎn)
- #include <agg_curves.h>
curve4(double x1, double y1, double x2, double y2, double x3, double y3, double x4, double y4)
四個(gè)點(diǎn),分別為:初始點(diǎn),控制點(diǎn)一,控制點(diǎn)二,終結(jié)點(diǎn)
- #include <agg_rounded_rect.h>
rounded_rect(double x1, double y1, double x2, double r)
對(duì)角點(diǎn)的坐標(biāo)和圓角半徑
至于怎樣把他們畫(huà)在渲染內(nèi)存上呢,我們下一篇會(huì)講到。
頭文件也漸漸地多了起來(lái),包含頭文件時(shí)的工作量有點(diǎn)大;我特地列了一個(gè)頭文件,里面已經(jīng)包含了所有的AGG頭文件,以后大家只需要包含它就好了。
下載處:http://www.shnenglu.com/Files/Shihira/agg.h.zip