Listing 2
#include <cmath> //For M_PI and similar constants #include <mingpp.h> class Shape{ private: unsigned short line_sz; int line_col,line_op; int fill_col,fill_op; public: Shape(unsigned short s=1,int c1=0x000000,int c2=0x000000,int o1=100, int o2=100) :line_sz(s),line_col(c1),line_op(o1),fill_col(c2),fill_op(o2){} /** Splits a RGB colour into its components */ static void get_rgb(const int col,int &r,int &g,int &b){ r=(col&0xFF0000)>>16; g=(col&0xFF00)>>8; b=(col&0xFF); } /** Convert a 0..100 opacity to 0x00 to 0xff*/ static int get_opacity(const int op){ if(op>=100)return 0xff; if(op<=0)return 0; return (op*256)/100; } /** Initialize pen : called before other drawing functions */ void init_pen(SWFShape *shape,float sx,float sy)const{ int r,g,b;get_rgb(line_col,r,g,b); shape->setLine(line_sz,r,g,b,get_opacity(line_op)); shape->movePenTo(sx,sy); } /** Draw arc, anticlockwise */ void draw_arc_helper_ac(SWFShape *shape,float sx,float sy,double sa, double ea,float xr,float yr)const{ const double PIBy4=M_PI_4; const double PIBy8=M_PI_4/2.0; double control_xr=xr/cos(PIBy8); double control_yr=yr/cos(PIBy8); while(ea>sa){ double ma; if((ea-sa)>PIBy4){ //Draw a 45 degree segment ma=sa+PIBy8; //Add 22.5 degrees sa+=PIBy4; //Add 45 degrees } else{ //Final segment ma=(sa+ea)/2; control_xr=xr/cos((ea-sa)/2); control_yr=yr/cos((ea-sa)/2); sa=ea; } double cx=sx+(cos(ma)*control_xr); double cy=sy-(sin(ma)*control_yr); double ex=sx+(cos(sa)*xr); double ey=sy-(sin(sa)*yr); shape->drawCurveTo(cx,cy,ex,ey); } } /** Draw a pie-slice */ void draw_pie_slice(SWFSprite *movieclip,const float sx,const float sy, const double sa,const double ea,const float xr,const float yr)const{ float x=sx+(cos(sa)*xr); float y=sy-(sin(sa)*yr); SWFShape *shape=new SWFShape; int r,g,b;get_rgb(fill_col,r,g,b); shape->setLeftFill(shape->addSolidFill(r,g,b,get_opacity(fill_op))); init_pen(shape,sx,sy); shape->drawLineTo(x,y); draw_arc_helper_ac(shape,sx,sy,sa,ea,xr,yr); shape->drawLineTo(sx,sy); movieclip->add(shape); } };