天天看點

AGG第十一課 agg::ellipse 渲染橢圓和多邊形

       圓是橢圓的一種,隻不過是長短軸半徑相等而已。在AGG中,必須給定橢圓的長短半軸的半徑,才能夠繪制橢圓。将橫坐标半徑稱為rx,縱坐标半徑稱為ry。并且可以指定繪制的方向,是順時針,還是逆時針。提供了一個參數,可以實作内接多邊形的渲染。

類定義檔案:include/agg_ellipse.h

類的構造函數:       ellipse(double x, double y, double rx, double ry,

                unsigned num_steps=0, boolcw=false)

參數說明:x是圓心的X坐标,y是圓心的Y坐标,rx是圓形的X半徑,ry是圓形的Y半徑,當rx不等于ry的時候,渲染出來的實際上是一個橢圓,具體可調整參數根據第三和第四個參數可以了解到圓形可以是一個扁平的圓形,不一定就是一個規規矩矩的圓形。如果指定num_steps值,建構的是一個圓内接多邊形。cw是順時針,還是逆時針渲染。

說明:在渲染的過程中,跳過agg::conv_stroke顯示擴充線(也就是邊界,下面有執行個體說明),繪制的是一個實心圓。

代碼如下:

agg::ellipse ell(200,200,50,100);

ras.add_path(ell);

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

        ras.reset();

typedef agg::conv_stroke< agg::ellipse >ell_stroke;

ell_stroke stroke(ell);

ras.add_path(stroke);

agg::ellipseell(200,200,50,100);

   typedef agg::conv_dash<agg::ellipse> ell_cd_type;

   ell_cd_type cdccell(ell);

cdccell.add_dash(5,5);

   typedef agg::conv_stroke<ell_cd_type> ell_cc_cs_type;

   ell_cc_cs_type csccell(cdccell);

   ras.add_path(csccell);

    rensl.color(agg::rgba8(255,0,0));

   agg::render_scanlines(ras,sl,rensl);

   ras.reset();

通過建構agg::conv_dash模闆,然後建立給agg::conv_stroke實作了虛線的描繪。

主要是進行旋轉,平移,縮放,圓心進行了偏移,如果需要回到當初的位置,平移肯定是必須的,這一點和agg::conv_contour擴充輪廓線不同。

   agg::ellipse ell(200,200,50,100);

   //坐标轉換

   agg::trans_affine mtx;

   mtx.scale(0.5,1); //x軸縮小到原來的一半

   mtx.rotate(agg::deg2rad(30));//旋轉30度

   mtx.translate(200,200);//X,Y坐标分别平移100

   typedef agg::conv_transform<agg::ellipse> ell_ct_type;

   ell_ct_type ctell(ell,mtx); //矩陣變換

   typedef agg::conv_dash<ell_ct_type> ell_cd_type;

   ell_cd_type cdccell(ctell);

   cdccell.add_dash(5,5);

  摘自:http://www.cnblogs.com/CoolJie/archive/2011/04/27/2030122.html

說明:指定構造器的第五個參數為12,建構十二邊形

   agg::ellipse ell(300,300,130,130,12);

   agg::conv_stroke<agg::ellipse> stroke(ell);

   ras.add_path(stroke);

說明:很多的類都有該函數,但是具體的該函數的實際意義并不了解!!

例子 inline void ellipse::approximation_scale(double scale):

    agg::ellipse ell(300,300,240,240);

    ell.approximation_scale(0.0001);//直線

    ell.approximation_scale(0.001);//矩形

    ell.approximation_scale(0.005);//正七邊形

    ell.approximation_scale(0.0025);//正五邊形

    agg::conv_stroke<agg::ellipse>stroke2(ell);

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

    ras.reset();

     本文轉自fengyuzaitu 51CTO部落格,原文連結:http://blog.51cto.com/fengyuzaitu/1961281,如需轉載請自行聯系原作者

繼續閱讀