AGG提供了很多額外的接口給SVG調用,是以很多的初學者像我,需要先學習SVG,然後了解接口的意義,才能夠真正的掌握該接口,例如miter_join的含義。
字面上了解就是填充的規則,不就是圖形的填充嗎?哪有什麼規則可言。對于單一的圖形沒有問題,如果是渲染圓環,兩個環之間的區域填充顔色,該怎麼辦?這個時候就需要指定一種規則,一種填充的規則。
AGG提供了兩種算法來判斷該點是否在填充區域内,如果該點在填充區域,然後填充該點。對于一個簡單的無交叉的路徑,是非常容易判斷的。但是,對于一個複雜的路徑,比如自交或者一個路徑包裹着另一個子路徑,内部就不是那麼好了解了。
nonzero
字面意思是“非零”。按該規則,要判斷一個點是否在圖形内,從該點作任意方向的一條射線,然後檢測射線與圖形路徑的交點情況。從0開始計數,路徑從左向右穿過射線則計數加1,從右向左穿過射線則計數減1。得出計數結果後,如果結果是0,則認為點在圖形外部,否則認為在内部。
evenodd
字面意思是“奇偶”。按該規則,要判斷一個點是否在圖形内,從該點作任意方向的一條射線,然後檢測射線與圖形路徑的交點的數量。如果結果是奇數則認為點在内部,是偶數則認為點在外部。
摘自:http://blog.csdn.net/cuixiping/article/details/7848369
void TestRasFillRule()
{
agg::rendering_buffer &rbuf = rbuf_window();
agg::pixfmt_bgr24 pixf(rbuf);
typedef agg::renderer_base<agg::pixfmt_bgr24> renderer_base_type;
renderer_base_type renb(pixf);
typedef agg::renderer_scanline_bin_solid<renderer_base_type>renderder_scanline_type;
renderder_scanline_type rensl(renb);
agg::rasterizer_scanline_aa<> ras;
agg::scanline_p8 sl;
ras.reset();
renb.clear(agg::rgba8(255,255,255));
rensl.color(agg::rgba8(255,0,0));
//agg::filling_rule_e rule = agg::fill_non_zero;
agg::filling_rule_e rule = agg::fill_even_odd;
ras.filling_rule(rule);
ras.move_to_d(100,100);
ras.line_to_d(200,100);
ras.line_to_d(200,400);
ras.line_to_d(100,400);
ras.close_polygon();
ras.move_to_d(150,250);
ras.line_to_d(180,250);
ras.line_to_d(180,350);
ras.line_to_d(150,350);
agg::render_scanlines(ras, sl, rensl);
return;
}
本文轉自fengyuzaitu 51CTO部落格,原文連結:http://blog.51cto.com/fengyuzaitu/1962530,如需轉載請自行聯系原作者