AGG第十六課agg::path_storage路徑存儲(chǔ)器

7.1 內(nèi)置函數(shù)參數(shù)說(shuō)明以及分析

    path storage 是用來(lái)管理路徑、畫復(fù)雜圖形的。在上面可以任意添加直線、曲線、其他路徑。

成都創(chuàng)新互聯(lián)長(zhǎng)期為上千客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為莆田企業(yè)提供專業(yè)的成都做網(wǎng)站、成都網(wǎng)站制作,莆田網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。

頭文件

#include <agg_path_storage.h>

類型定義

typedef path_base<vertex_block_storage<double> > path_storage;

基本成員函數(shù)

move_to()

    添加命令為 path_cmd_move_to 的頂點(diǎn),意為下一條線從這個(gè)點(diǎn)開始畫;

line_to()

    添加命令為 path_cmd_line_to 的頂點(diǎn),意為畫線到這個(gè)點(diǎn);

arc_to(double rx, double ry, double angle,bool large_arc_flag, bool sweep_flag, double x, double y)

    添加一條弧路徑,畫軸長(zhǎng)為rx, ry,角度為angle,優(yōu)/劣弧,順逆時(shí)針,終點(diǎn)在(x,y)。

curve3_to()

    添加貝塞爾曲線,參數(shù)為一個(gè)控制點(diǎn)和終點(diǎn)的坐標(biāo)

curve4_to()

    添加貝塞爾曲線,參數(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)和命令

7.2 頂點(diǎn)源的屬性修改

1)根據(jù)橫坐標(biāo)或者縱坐標(biāo)進(jìn)行翻轉(zhuǎn)

說(shuō)明:flip_y可能出現(xiàn)的地方非常多,這是對(duì)Y軸進(jìn)行翻轉(zhuǎn)的

       // Flip all vertices horizontally or vertically,

       // between x1 and x2, or between y1 and y2 respectively

       //--------------------------------------------------------------------

       void flip_x(double x1, double x2);

       void flip_y(double y1, double y2);

2)簡(jiǎn)單例子對(duì)比

   ras.reset();

   agg::path_storage path;

   path.move_to(40,350);

   path.line_to(80,350);

   path.line_to(80,670);

   path.line_to(40,670);

   path.end_poly();

   path.flip_y(350,450);

   ras.add_path(path);

   agg::path_storage comparepath ;

   comparepath.move_to(140,350);

   comparepath.line_to(180,350);

   comparepath.line_to(180,670);

   comparepath.line_to(140,670);

   comparepath.end_poly();

   ras.add_path(comparepath);

   agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));

 

7.3線段繪制規(guī)則圖形

1)空心圖形

聲明:在MFC中繪制線段,簡(jiǎn)單的使用MoveTo和LineTo搞定,但是使用AGG的path_storage必須通過(guò)agg::conv_stroke(顯示輪廓線),才能夠顯示線段。嘗試注釋agg::conv_stroke可以了解基本的操作流程。

ras.reset();

agg::path_storage ps;    

ps.move_to(200,200); 

ps.line_to(400,200);

ps.line_to(400,400);

agg::conv_stroke<agg::path_storage>  

stroke(ps);

ras.add_path(stroke);

agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));

ras.reset();

2)實(shí)心圖形(攜帶填充顏色)

說(shuō)明:需要描繪填充顏色的圖形,必須是閉合的,path_storage提供了幾個(gè)閉合的函數(shù),可以試著替換。

   ras.reset();

   agg::path_storage ps;   

   ps.move_to(200,200);  

ps.line_to(400,200); 

ps.line_to(400,400);

ps.end_poly();

   ras.add_path(ps);

   agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));

ras.reset();

 

7.4 注意事項(xiàng)

       path_storage至少會(huì)分配一塊內(nèi)存存儲(chǔ)256個(gè)頂點(diǎn)源,所以創(chuàng)建大量的path_storage是相當(dāng)

昂貴的內(nèi)存開銷,并且容易造成內(nèi)存碎片。建議一個(gè)類持有一個(gè)靜態(tài)的成員,通過(guò)函數(shù)

remove_all清空所有的頂點(diǎn)源和start_new_path包含一條新的路徑,將多條路徑存儲(chǔ)在

一個(gè)對(duì)象中。如果希望創(chuàng)建一個(gè)包含很多頂點(diǎn)源的path_storage,最好使用vertex_block_storage。

如果希望創(chuàng)建很多個(gè)path_storage,但是包含很小的頂點(diǎn)源,最好使用vertex_stl_storage

適配器。


代碼說(shuō)明

m_coord_blocks 保存坐標(biāo)

m_cmd_blocks 保存坐標(biāo)的指令


    template<class T, unsigned S, unsigned P>

    inline unsigned vertex_block_storage<T,S,P>::vertex(unsigned idx, 

                                                        double* x, double* y) const

    {

        unsigned nb = idx >> block_shift;

//一個(gè)塊block存儲(chǔ)256個(gè)端點(diǎn)源,通過(guò)idx>>8,獲取到第幾個(gè)分組

        const T* pv = m_coord_blocks[nb] + ((idx & block_mask) << 1);

//m_coord_blocks保存所有塊的頭指針,idx & 256 實(shí)際上取出是當(dāng)前nb塊的第幾個(gè)位置,移位1是因?yàn)槊恳粋€(gè)端點(diǎn)源占用了

//兩個(gè)空間

        *x = pv[0];

        *y = pv[1];

        return m_cmd_blocks[nb][idx & block_mask];

    }

網(wǎng)站題目:AGG第十六課agg::path_storage路徑存儲(chǔ)器
文章鏈接:http://muchs.cn/article18/jojigp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站品牌網(wǎng)站制作、網(wǎng)站營(yíng)銷、全網(wǎng)營(yíng)銷推廣、動(dòng)態(tài)網(wǎng)站、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司