AGG第十六课 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中绘制线段,简单的使用MoveToLineTo搞定,但是使用AGGpath_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];

    }




     本文转自fengyuzaitu 51CTO博客,原文链接:http://blog.51cto.com/fengyuzaitu/1961385,如需转载请自行联系原作者



相关文章
|
SQL 存储 Linux
Hive 高阶--分组窗口函数--序列分组函数(CUME_DIST)|学习笔记
快速学习 Hive 高阶--分组窗口函数--序列分组函数(CUME_DIST)
246 0
|
10月前
|
数据可视化 数据挖掘 数据处理
盘一盘Tidyverse| 筛行选列之select,玩转列操作
盘一盘Tidyverse| 筛行选列之select,玩转列操作
|
10月前
盘一盘Tidyverse| 只要你要只要我有-filter 筛选行
盘一盘Tidyverse| 只要你要只要我有-filter 筛选行
|
10月前
Tidyverse| XX_join :多个数据表(文件)之间的各种连接
Tidyverse| XX_join :多个数据表(文件)之间的各种连接
|
11月前
|
缓存 自然语言处理 数据挖掘
白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
白话Elasticsearch50-深入聚合数据分析之基于doc values正排索引的聚合内部原理
78 0
|
11月前
|
自然语言处理 算法 数据挖掘
白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理
白话Elasticsearch51-深入聚合数据分析之text field聚合以及fielddata原理
92 0
|
SQL Oracle 关系型数据库
【SQL开发实战技巧】系列(十五):查找最值所在行数据信息及快速计算总和百之max/min() keep() over()、fisrt_value、last_value、ratio_to_report
本篇文章讲解的主要内容是:***计算部门中那个工资等级的员工最多、通过返回部门10最大工资所在行的员工名称小案例来讲解max/min() keep() over()、通过查询工资最高的人小案例来介绍fisrt_value、last_value、通过计算各个部门的工资合计以及各个部门合计工资占总工资的比例小案例来介绍如何计算百分比及ratio_to_report分析函数的使用***
【SQL开发实战技巧】系列(十五):查找最值所在行数据信息及快速计算总和百之max/min() keep() over()、fisrt_value、last_value、ratio_to_report
|
数据库
LeetCode(数据库)- Hopper Company Queries III
LeetCode(数据库)- Hopper Company Queries III
67 0
|
数据库
LeetCode(数据库)- Hopper Company Queries II
LeetCode(数据库)- Hopper Company Queries II
73 0
LeetCode(数据库)- Hopper Company Queries II
|
SQL Oracle 关系型数据库
跟着吕大师(VAGE)揭密隐含参数:_db_writer_coalesce_area_size
[size=13.913043975830078px]最近在看吕大师的大作《Oracle核心揭密》,这部大作可以与Jonathan Lewis大师的《Oracle Core_ Essential Internals for DBA》相提并论,看了几天收益颇多,哈哈美国有Lewis,中国有VAGE。
跟着吕大师(VAGE)揭密隐含参数:_db_writer_coalesce_area_size