path storage 是用來管理路徑、畫復(fù)雜圖形的。在上面可以任意添加直線、曲線、其他路徑。
創(chuàng)新互聯(lián)專注于鷹潭網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供鷹潭營(yíng)銷型網(wǎng)站建設(shè),鷹潭網(wǎng)站制作、鷹潭網(wǎng)頁設(shè)計(jì)、鷹潭網(wǎng)站官網(wǎng)定制、成都微信小程序服務(wù),打造鷹潭網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供鷹潭網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。#include
typedef path_base
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)和命令
說明: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);
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));
聲明:在MFC中繪制線段,簡(jiǎn)單的使用MoveTo和LineTo搞定,但是使用AGG的path_storage必須通過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
stroke(ps);
ras.add_path(stroke);
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(255,0,0));
ras.reset();
說明:需要描繪填充顏色的圖形,必須是閉合的,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();
path_storage至少會(huì)分配一塊內(nèi)存存儲(chǔ)256個(gè)頂點(diǎn)源,所以創(chuàng)建大量的path_storage是相當(dāng)
昂貴的內(nèi)存開銷,并且容易造成內(nèi)存碎片。建議一個(gè)類持有一個(gè)靜態(tài)的成員,通過函數(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
適配器。
代碼說明
m_coord_blocks 保存坐標(biāo)
m_cmd_blocks 保存坐標(biāo)的指令
template
inline unsigned vertex_block_storage
double* x, double* y) const
{
unsigned nb = idx >> block_shift;
//一個(gè)塊block存儲(chǔ)256個(gè)端點(diǎn)源,通過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ù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。