AGG-SVG学习笔记 [2015-07-07]

Matplotlib inline原理与Jupyter可视化避坑指南 Matplotlib是Python最主流的数据可视化库,而%matplotlib inline则是Jupyter Notebook中控制图表渲染行为的核心机制。它并非简单开启绘图功能,而是通过切换Matplotlib后端、劫持plt.show()调用、自动管理Figure生命周期等底层操作,实现图像在Notebook输出区的内联嵌入。这一机制直接影响渲染质量(PNG/SVG选择)、显示清晰度(DPI配置)、中文支持(字体回退链)及内存稳定性(auto-close策略)。掌握其原理,可规避图不显示、叠图、模糊 阅读详情

河南洛阳 祝小鹰 2015-07-07

接触AGG一年多,积累了一些心得体会。现在贴出来与大家分享。

注1:学习笔记按记录时间的逆序排列。
注2:当初学习AGG的目的是为了绘制SVG图形文件,因此夹杂了一些SVG的内容。
注3:早期的笔记由于刚接触AGG,可能存在一些错误。

例程和库文件下载:http://pan.baidu.com/s/1o6OhqMQ


-----------------------------------------------------------------------
关于SVG中<linearGradinet>、<radialGradient>的属性xlink:href的补充说明:

- 只有在不包含<stop>子元素的情况下,才“继承”引用元素的<stop>子元素。

- 如果引用的url不存在,则忽略xlink:href属性。

- 允许间接引用,例如lg3引用lg2,而lg2引用lg1。

- <linearGradinet>可引用<radialGradient>,反之亦可。


-----------------------------------------------------------------------
AGG的marker locator(vcgen_markers_term)在处理分段线段时,每一个子线段都会生成一组起点和终点的定位信息。也就是说,每一个子线段的起点和终点都将绘制标记点。但是SVG仅在第一个起点和最后一个终点处绘制标记点。

因此为svg_viewer编写了一个类模板svg_markers_term,用于将AGG的marker locator转换为SVG规范。转换后,只保留第一个起点和最后一个终点的定位信息。


-----------------------------------------------------------------------
SVG中,图元的transform属性对渐变色绘制的影响:

- SVG先按照图元的坐标数据进行渐变色渲染,然后渐变色随同图元一起进行坐标变换(应用图元的transform属性)。这意味着在AGG中实现时,插值器矩阵需要叠加图元的transform属性。

- 对于objectBoundingBox模式,其参考坐标系是图元应用transform属性之前的包围矩形。


-----------------------------------------------------------------------
在SVG中:不论是绘制填充区域,还是绘制轮廓线,对于objectBoundingBox模式下的渐变色渲染,其参考坐标系均为填充区域的包围矩形。


-----------------------------------------------------------------------
使用AGG实现objectBoundingBox模式的渐变色绘制的步骤:

1 以单位矩形为基准,设计渐变方式和参考值区间。
2 对插值器矩阵应用gradientTransform中的变换(注意按逆序),此时得到的渐变区域仍然基于单位矩形。
3 通过缩放(w,h)和平移(x0,y0),将渐变区域变换至待填充图元的包围矩形。(x0,y0,w,h)是包围矩形在绝对坐标系中的几何参数。

上述方法还存在一个问题。首先分析一下像素颜色的计算过程:

1 待填充的像素通过插值器矩阵(上述变换的逆矩阵),变换至单位矩形。
2 计算参考值,并将参考值映射至颜色区间,从而得到像素颜色。在此过程中,已变换至单位矩形的点坐标和参考值区间[d1,d2]均换算成亚像素坐标(其实就是乘以16然后取整)参与计算。

由于单位矩形的边长换算成亚像素只有16,而参考值区间又是以单位矩形为基准选取的,因此参考值区间对应的亚像素数目有限,导致映射至颜色区间后,颜色看上去不连续。

解决办法:以边长w的正方形为基准,设计渐变方式和参考值区间,gradientTransform属性中的相对长度也乘以w,然后缩放系数改为(1,h/w)。

但是在绘制SVG图元前,gradientTransform属性已经被解析为一个矩阵,如何实现“相对长度乘以w”?参考《计算机图形学 第三版》P201 公式5.42,将矩阵的平移项(第3列前两个元素)乘以w即可。


-----------------------------------------------------------------------
SVG中,objectBoundingBox模式的渐变色绘制的实现原理:

在objectBoundingBox模式下,<linearGradient>和<radialGradient>的属性参数所设定的渐变区域,是以单位矩形(边长为1)为基准,然后通过缩放(w,h)和平移(x0,y0),变换至待填充图元的包围矩形。(x0,y0,w,h)是包围矩形在绝对坐标系中的几何参数。


-----------------------------------------------------------------------
SVG中,<linearGradient>使用向量标识渐变方向。用AGG实现时,通常使用水平渐变gradient_x,以原点为渐变起始点,参考值区间为[0,向量长度],然后通过插值器矩阵的旋转、平移,变换至渐变向量的位置。

要考虑向量长度近似为0的情况:如果向量长度 < 0.5,则按实色填充,填充色取第一个渐变色。


-----------------------------------------------------------------------
关于SVG中线性渐变元素<linearGradient>的描述:

属性:
    id            元素标识
    x1, y1        渐变矢量的起点,缺省值“0, 0”
    x2, y2        渐变矢量的终点,缺省值“100%, 0”

    gradientUnits    x1 y1 x2 y2的坐标系,缺省值为“objectBoundingBox”
      - userSpaceOnUse        用户坐标系(与SVG图元使用同一个坐标系)
      - objectBoundingBox    以对象的包围矩形为参考坐标系

    spreadMethod    重复方式,默认值为“pad”
      - pad            不重复
      - repeat            对应agg::gradient_repeat_adaptor
      - reflect            对应agg::gradient_reflect_adaptor

    xlink:href        引用另外一个已定义好的渐变元素

    gradientTransform    变换矩阵,缺省值为单位阵
        与图元的transform属性类似,也是按逆序应用变换(绝对坐标系)
        用于AGG中的插值器时,矩阵还要求逆
        gradientUnits对gradientTransform有影响
          - userSpaceOnUse    坐标变换使用用户坐标系(与SVG图元使用同一个坐标系)
              在此情况下,不需要对坐标值和变换矩阵进行额外处理
  

NumPy+Pandas+Matplotlib数据可视化底层原理与实战 数据可视化不仅是图表生成,更是从原始数据到业务洞察的系统性工程。其核心依赖于NumPy的内存连续性与向量化计算、Pandas的结构化数据建模能力以及Matplotlib面向对象的视觉控制机制。理解这三者协同工作的底层原理——如NumPy dtype对内存与性能的影响、Pandas Series/DataFrame如何承载数据语义、Matplotlib Axes如何实现像素级渲染——是构建可复现、可维护、可交付图表的前提。该技术栈在资源受限环境(如2GB内存服务器)、Kaggle竞赛、教学演示及决策支持报告中 阅读详情

相关推荐

SVG渐变与图案的详细解析与应用

本文深入探讨了SVG中线性渐变和径向渐变的属性和使用方法,包括它们的坐标系统、变换、填充策略等,并对SVG图案的创建与应用提供了详细指导,包括图案的定位、尺寸、内容绘制和变换。

weixin_42581003的博客 648

agg_svg_viewer补丁包

AGG是一个开源的二维图形引擎,它提供了一个功能有限的SVG解析、渲染工具svg_viewer。我对svg_viewer做了如下改进: - 支持解析 、 元素,以及 的 rx、ry 属性(圆角矩形)。 - 支持格式为 rgb(ddd, ddd, ddd) 的颜色值 - 支持解析的width、height属性,解析后的属性值通过path_renderer::width、height、width_unit、height_unit获取 - 原来的代码对半透明属性fill-opacity、stroke-opacity的解析存在Bug:这两个属性必须位于fill、stroke的后面,否则无效。修改后的代码解决了该Bug。

angular-svg-draw:用于绘制 SVG 的 Angular 指令

绘图 用于绘制 SVG 的 Angular 指令包装器。 灵感来源: : | 用法 包括/ source /文件夹中的2个文件 svg.css svgDrawing.js 在您的应用程序中包含“svgDrawing”作为依赖项 angular.module('yourApp', ['svgDrawing']) 要使用该指令,只需在元素中添加“svg-draw” <svg svg-draw></svg> 这将以 60fps 为 0-60 帧的路径设置动画。 应用程序接口 指令的选项可以通过数据属性进行控制。 以下选项可用: 名称 类型 默认 描述 起始帧 整数 0 要开始动画的帧 结束帧 整数 60 您想要结束以 60fps 运行的动画的帧 延迟 整数 0 开始动画前的延迟(以毫秒为单位) 完全的 功能 angular.noop 动画完成后你想运行什么函数

agg 开源的、高效的2D图形库

AGG,全名:Anti-Grain Geometry,是一个开源的、高效的2D图形库。AGG的功能与GDI+的功能非常类似,但提供了比GDI+更灵活的编程接口,其产生的图形的质量也非常高,而且它是跨平台的,其宣传可以在非常多的操作系统上运行,包含在Windows、Wince、Linux台平。 agg的特点 1、支持ALPHA、GAMMA等变色处理,以及用户自定义的变色处理; 2、支持任意2D图形变换; 3、支持SVG和PostScript描述,适于网上图形生成; 4、支持高质量的图形处理,支持反走样插值等高级功能; 5、支持任意方式的惭变色处理; 6、支持所有颜色格式; 7、支持对位图的多种处理; 8、支持直线的多种处理,类似于GDI+; 9、支持GPC,即通用多边形裁剪方法; 10、支持多种字体输出,包括汉字的处理;

Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的理论简述和python仿真实现(附源码)

经典论文Flocking for Multi-Agent Dynamic Systems: Algorithms and Theory的学习与编程仿真,提供源码

m0_59701926的博客 1238

Imatest-Dot Pattern

本文介绍了DotPattern模块测试方法,用于评估相机拍摄点阵图的表现。测试主要关注两点:色彩准确性(是否存在彩色噪点和杂边)和摩尔纹现象。测试步骤包括导入图片、选择分析区域、微调ROI、选择点状图类型和分析保存结果。测试结果包含横向色差、光学畸变和SMIATV畸变等数据,其中0.115%的色差值和0.004度的网格旋转角度表明相机表现良好,但-10.4%的SMIATV畸变显示存在明显桶形畸变。文章还提供了各项指标的具体解读标准。

weixin_64706696的博客 1351

1、Ovirt 开源虚拟化平台安装

Ovirt虚拟化Node和Engine安装

大鱼 6266

攻防世界 Crypto 新手练习区 1-12 全详解

本篇是攻防世界 Crypto 新手练习区的全解

闵行小鱼塘 3733

基于STM32F103的二维码识别项目——OV7670篇

此系列用于记录做过的项目,这篇文章介绍基于STM32F103的二维码识别项目之OV7670FIFO模块。

beyourself_he的博客 4288

Trae 保姆级使用指南,零基础小白也能实现编程。

Trae 使用指南 Trae AI 使用 零基础编程 满血版 DeepSeek-R1&V3 AI IDE 深度理解中文开发场景 傻瓜式编程 编程入门 开发入门

Mr.L-OAM的博客 5816

基于深度学习YOLOv8的PCB板缺陷检测系统

基于YOLOv8的PCB板缺陷检测系统,可以有效提高PCB生产过程中的检测效率。未来,我们可以进一步优化模型,结合更多的数据增强策略和先进的网络结构,以适应更复杂的生产环境。为了进行训练,理想的数据集应包含多种不同缺陷类型和不同背景的PCB图像。YOLOv8需要的数据格式为每个图像一个标签文件,每个标签文件包含缺陷的类别及其边界框坐标。运行该界面时,用户可以通过点击按钮选择图像,随后系统将自动检测图像中的PCB缺陷并显示结果。训练完成后,可以使用训练好的模型进行推理,检测新的PCB图像中的缺陷。

YOLO 1070

120、NPU的Mythic M1076:模拟存算一体NPU

这篇文章分享了作者调试Mythic M1076模拟存算一体NPU的实战经验,主要包含以下要点: 硬件设计陷阱:参考电压输入必须使用低ESR电容,普通贴片电容会导致模拟计算阵列工作异常。 核心技术原理: 采用真正的存算一体架构,将权重存储为模拟电压 使用浮栅晶体管存储权重,通过电流叠加实现乘法运算 包含108个计算单元阵列(Tile),每个256×256规模 使用注意事项: 编程模型特殊,需要依赖SDK自动映射网络层 存在6-8位有效精度限制,需用量化感知训练 功耗特性独特,静态偏置电流占主要功耗 调试手段有

m0_50546716的博客 122

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

上一篇: AGG svg_viewer实现了渐变色渲染
下一篇: Qt Creator如何保存调试断点?
zhawk
博客等级 码龄23年 7粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值