定义文件:include/agg_arc.h
类函数构造器:
arc(double x, double y, double rx, double ry, double a1,double a2, bool ccw=true)
圆心为(x, y)和长短半轴分别为rx, ry,初始角度和终结角度为a1, a2
范围是0<a1<a2<6.28(2pi) pi = 3.141592653 ccw是true是顺时针,false是逆时针
注意:不是我们平常使用的角度180,360,否则出错,一路爬过来的!!
绘制一个圆心(400,100),长短半轴都是100的圆弧,初始角度是0,终结角度是3.14,折算成角度是180度。可以使用agg::deg2rad(90)将角度转换成弧度。
代码如下:
agg::arc arc(400, 100, 100, 100, 0, 3.14,false);
agg::conv_stroke<agg::arc>stroke(arc);
ras.add_path(stroke); agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,255,0));
分析:可以调整最后一个参数,修改成true,查看效果!!
代码如下:
agg::arc arc(400, 100, 100, 100, 0, 3.14/3,true);
agg::path_storage path;
path.move_to(400,100);
path.concat_path(arc);
path.line_to(400,100);//连接回到圆心
path.end_poly();//重新闭合
ras.add_path(path);
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,255,0));
我们可以不使用end_poly函数进行闭合,而是获取弧线的开始顶点,然后闭合。
代码如下:
agg::arc arc(400, 100, 100, 100, 0, 3.14/3,true);
agg::path_storage path;
path.move_to(400,100);
path.concat_path(arc);//连接顶点源
path.line_to(400,100);//连接回到圆心
arc.rewind(0);
double x;
double y;
arc.vertex(&x,&y);
path.line_to(x,y);//从圆心连接到开始顶点源
ras.add_path(path);
agg::render_scanlines_aa_solid(ras,sl,renb,agg::rgba8(0,255,0));
从这个例子,我们可以了解两点:
1如何获取其他顶点源的起点,当然结束点可以通过遍历获得
2 如何与agg::path_storage配合使用,快速的绘制图形。
agg::path_storage类提供如下的函数
arc_to(double rx, double ry, double angle,bool large_arc_flag, bool sweep_flag, double x, double y)
添加一条弧路径,画轴长为rx, ry,角度为angle,优/劣弧,顺逆时针,终点在(x,y)。
但是不了解长短半轴,不知道角度,优劣弧,顺逆时针等等,都了解,但是就是画不了!!
测试例子1:
//完全没有绘制图形
agg::path_storage ps;
ps.arc_to(10,10,agg::deg2rad(90),true,false,160,100);
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));
测试例子2:
//绘制的图形太难理解,move_to到开始绘制点,然后顺时针绘制半圆
agg::path_storage ps;
ps.move_to(320,160);
ps.arc_to(80,10,6.28,true,true,160,160);
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();