agg::path_storage 路径存储器

 

7.1内置函数参数说明以及分析path storage是用来管理路径、画复杂图形的。在上面可以任意添加直线、曲线、其他路径。 
头文件#include <agg_path_storage.h> 
类型定义typedef path_base<vertex_block_storage<double> > path_storage; 
基本成员函数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<agg::path_storage> 
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<class T, unsigned S, unsigned P> 
  inline unsigned vertex_block_storage<T,S,P>::vertex(unsigned idx, 
                            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]; 
  } 

MPLS 虚拟专用网是一种基于MPLS(多协议标记转换)技术实现企业以太网架构的虚拟专用网专线方案,是企业一种点对点或多点对多点解决方案。主要适用于具有跨区域、多分支进行视频会议、语音、ERP系统应用的企业。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值