AGG第十六课agg::path_storage路径存储器-创新互联
7.1 内置函数参数说明以及分析
path storage 是用来管理路径、画复杂图形的。在上面可以任意添加直线、曲线、其他路径。
创新互联专注于鹰潭网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供鹰潭营销型网站建设,鹰潭网站制作、鹰潭网页设计、鹰潭网站官网定制、成都微信小程序服务,打造鹰潭网络公司原创品牌,更为您提供鹰潭网站排名全网营销落地服务。头文件
#include
类型定义
typedef path_base
基本成员函数
move_to()
添加命令为 path_cmd_move_to 的顶点,意为下一条线从这个点开始画;
line_to()
添加命令为 path_cmd_line_to 的顶点,意为画线到这个点;
arc_to(double rx, double ry, double angle,bool large_arc_flag, bool sweep_flag, double x, double y)
添加一条弧路径,画轴长为rx, ry,角度为angle,优/劣弧,顺逆时针,终点在(x,y)。
curve3_to()
添加贝塞尔曲线,参数为一个控制点和终点的坐标
curve4_to()
添加贝塞尔曲线,参数为两个控制点和终点的坐标
join_path()
添加一个顶点源,即组合
vertex(unsigned idx, double* x, double* y)
last_vertex(double* x, double* y)
vertex(double* x, double* y)
取顶点位置,前者为已知步骤,后两者为顺序或倒序获取
modify_vertex()
modify_command()
修改步骤为idx的顶点坐标和命令
7.2 顶点源的属性修改
1)根据横坐标或者纵坐标进行翻转
说明:flip_y可能出现的地方非常多,这是对Y轴进行翻转的
// 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);
2)简单例子对比
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));
7.3线段绘制规则图形
1)空心图形
声明:在MFC中绘制线段,简单的使用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();
2)实心图形(携带填充颜色)
说明:需要描绘填充颜色的图形,必须是闭合的,path_storage提供了几个闭合的函数,可以试着替换。
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();
7.4 注意事项
path_storage至少会分配一块内存存储256个顶点源,所以创建大量的path_storage是相当
昂贵的内存开销,并且容易造成内存碎片。建议一个类持有一个静态的成员,通过函数
remove_all清空所有的顶点源和start_new_path包含一条新的路径,将多条路径存储在
一个对象中。如果希望创建一个包含很多顶点源的path_storage,最好使用vertex_block_storage。
如果希望创建很多个path_storage,但是包含很小的顶点源,最好使用vertex_stl_storage
适配器。
代码说明
m_coord_blocks 保存坐标
m_cmd_blocks 保存坐标的指令
template
inline unsigned vertex_block_storage
double* x, double* y) const
{
unsigned nb = idx >> block_shift;
//一个块block存储256个端点源,通过idx>>8,获取到第几个分组
const T* pv = m_coord_blocks[nb] + ((idx & block_mask) << 1);
//m_coord_blocks保存所有块的头指针,idx & 256 实际上取出是当前nb块的第几个位置,移位1是因为每一个端点源占用了
//两个空间
*x = pv[0];
*y = pv[1];
return m_cmd_blocks[nb][idx & block_mask];
}
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
本文题目:AGG第十六课agg::path_storage路径存储器-创新互联
网站网址:http://scyanting.com/article/dscces.html