使用ABAP绘制可伸缩矢量图
Jerry去年的文章 动手使用ABAP Channel开发一些小工具,提升日常工作效率 里曾经介绍过一些用ABAP实现的可供娱乐的小程序,比如用古老的HPGL接口在SAPGUI里绘图:

关于如何用SAP + HPGL语言在SAPGUI里画出这只哆啦A梦来,参考Jerry的文章:
本文要介绍的是另一种在SAPGUI里用ABAP绘图的方式。矢量图(Scalable Vector Graphics)也是一种图像格式,和传统的图像格式相比具有很多优点,因此近些年使用越来越广泛:
- SVG是开放的标准,基于XML,可以直接用纯文本工具编辑;
- SVG与JPEG和GIF等图像格式比起来,尺寸更小,可压缩性更强;
- SVG顾名思义,是一种可伸缩(Scalable)的图像格式,在图形尺寸发生改变的情况下,图形质量也不会受到影响。
- SVG图形中的文字是可选可搜索的,最适合用于绘制地图。
看个具体的例子。一个矩形由四条边组成,所以一个矩形的SVG实现,则是由对应的四条由line标签代表的线段构成。

从这个例子我们也能发现,SVG标签可以直接被嵌入HTML网页里。
而ABAP有一个工具类,CL_ABAP_BROWSER提供了SHOW_HTML方法,可以在SAPGUI里打开一个嵌入的浏览器窗口。

这样,我们将前面介绍的包含有矩形的SVG格式的HTML代码传入SHOW_HTML的HTML_STRING参数,发现可以在SAPGUI环境下完美工作:

因此,“使用ABAP绘制可伸缩矢量图”这个命题,就划归为“使用ABAP拼接可伸缩矢量图对应的HTML源代码”,一下子就把复杂的图形操作需求,降维成相对简单的字符串拼接操作了。
Jerry小学的时候,上的编程启蒙课,在386上学习过一门名叫Logo的编程语言。LOGO一词源于希腊文,原意为“文字”或“思考”、“想法”,是一种过程性语言,1976年由美国麻省理工学院佩帕特(Seymour Papert)教授指导下的一个研究小组, 在LISP语言基础上,专门为儿童研制开发的编程语言。当时教这门课的老师,一位老大爷,直接把语言里画图的cursor说成是“海龟”,可谓简单形象。
下图是用Logo语言画出来的图案。

有趣的是,30年之后,SAP捷克研究院一位开发人员,在Github上创建了一个ABAP代码仓库,将SVG常用的绘图操作用类LOGO语言的语法封装成库,库的名称就叫ABAP Turtle,仿佛是在向传统的LOGO语言致敬。

这位ABAP开发人员的联系方式维护在Github上,大家感兴趣的可以自行去交友。
基于这位SAP开发人员创建的ABAP Turtle库的SVG矩形绘制代码如下:

下面这个图形又是如何画出来的呢?首先选屏幕某个点作为图形的中心点,从中心点出发画一个正十边形,回到原点,然后重复绘制19次正十边形。每次绘制从中心点出发时,顺时针偏移360 / 20 = 18度角。

最后我们看到的图形,是由20个正十边形施加了18度角的偏移量后叠加而成。
对应的实现代码:

我们还可以自己编辑一些指令序列,比如用符号F代表前进,加号代表右转,减号代表左转。用这三个符号就可以组装一些自定义指令,然后通过参数num_iterations指定,按照我们期望的迭代次数执行图像绘制。

你能想象下面这个图形,是由"|—|"这个基础图形按照F+F-F-F+F迭代四次构成的么?

考一考大家,下面这棵树如何通过构造自定义的SVG指令画出来?

答案在FreHu的github里:https://github.com/FreHu/abap-turtle-graphics
要获取更多Jerry的原创文章,请关注公众号"汪子熙":

使用ABAP绘制可伸缩矢量图的更多相关文章
- D3.js (v3)+react框架 基础部分之认识选择集和如何绘制一个矢量图
首先需要下载安装d3.js : yarn add d3 然后在组建中引入 : import * as d3 from 'd3' 然后定义一个方法,在componentDidMount()这个钩子 ...
- 【译】在Asp.Net中操作PDF - iTextSharp - 绘制矢量图
原文 [译]在Asp.Net中操作PDF - iTextSharp - 绘制矢量图 在上一篇iTextSharp文章中讲述了如何将现有的图片插入PDF中并对其进行操作.但有时,你需要在PDF中绘制不依 ...
- MeteoInfoLab脚本示例:风场矢量图
读取风场U/V变量数据,可以从U/V计算出风速:speed = sqrt(u*u+v*v).quiverm函数用来绘制风场矢量图,参数中包括U/V变量,如果要绘制彩色风场还需要第三个变量,这里是风速s ...
- 矢量图绘制工具Svg-edit调整画布的大小
矢量图绘制工具Svg-edit调整画布的大小 ------------------------------ ------------------------
- svg矢量图绘制以及转换为Android可用的VectorDrawable资源
项目需要 要在快速设置面板里显示一个VoWiFi图标(为了能够区分出来图形,我把透明的背景填充为黑色了) 由于普通图片放大后容易失真,这里我们最好用矢量图(SVG(Scalable Vector Gr ...
- Python游戏引擎开发(七):绘制矢量图
今天来完毕绘制矢量图形. 没有读过前几章的同学,请先阅读前几章: Python游戏引擎开发(一):序 Python游戏引擎开发(二):创建窗体以及重绘界面 Python游戏引擎开发(三):显示图片 P ...
- Qt使用QPainter绘制矢量图并保存为svg文件
位图和矢量图: Bitmap: Usually a larger file size Cannot be enlarged into a higher resolution as the image ...
- Android中使用SVG矢量图(一)
SVG矢量图介绍 首先要解释下什么是矢量图像,什么是位图图像? 1.矢量图像:SVG (Scalable Vector Graphics, 可伸缩矢量图形) 是W3C 推出的一种开放标准的文本式矢量图 ...
- ps中的位图,矢量图,颜色模式
什么是位图?什么是矢量图? 位图是由像素组成的图像,在缩放和旋转的时候容易失真,同时文件容量较大 矢量图是根据几何特性来绘制的图形,通过数学公式计算获得的,不易制作色彩变化太多的图象 颜色模式 RGB ...
随机推荐
- 【Python】解析Python中函数的基本使用
1.简介 在Python中定义函数的基本格式为: def <函数名>(参数列表): <函数语句> return <返回值> Python中的函数形式比较灵活,声明一 ...
- kotlin基础 空值检查
NULL检查机制 Kotlin的空安全设计对于声明可为空的参数,在使用时要进行空判断处理,有两种处理方式,字段后加!!像Java一样抛出空异常,另一种字段后加?可不做处理返回值为 null或配合?:做 ...
- WebRTC搭建前端视频聊天室——数据通道篇
本文翻译自WebRTC data channels 在两个浏览器中,为聊天.游戏.或是文件传输等需求发送信息是十分复杂的.通常情况下,我们需要建立一台服务器来转发数据,当然规模比较大的情况下,会扩展成 ...
- 支付宝小程序开发——H5跳转到小程序(获取小程序页面的链接)
前言: 这个问题支付宝小程序官方文档并没有专门说明,钉钉群的官方技术支持给了个开发者社区的帖子,详见:如何跳转小程序. 如果配置的页面没有参数还好,不会出问题,如果有参数,很可能配出来的链接无法正常获 ...
- JAVA获取树形结构
package com.nnmzkj.common.dto; import lombok.Data; import java.io.Serializable;import java.util.Arra ...
- CSAGAN:LinesToFacePhoto: Face Photo Generation from Lines with Conditional Self-Attention Generative Adversarial Network - 1 - 论文学习
ABSTRACT 在本文中,我们探讨了从线条生成逼真的人脸图像的任务.先前的基于条件生成对抗网络(cGANs)的方法已经证明,当条件图像和输出图像共享对齐良好的结构时,它们能够生成视觉上可信的图像.然 ...
- mybatis plus 支持达梦DM 数据库啦
最近由于公司项目需要使用DM数据库,现在就官方源码修改了,完美支持达梦数据库的代码生成器.官方说的v3.0.RELEASE版本支持达梦数据库,不知道说的支持包括支持代码生成器么? 怀着兴奋的心情,兴高 ...
- BatchConfigTool批量配置工具
海康批量配置工具BatchConfigTool是一款支持设备在线搜索.批量配置参数.批量升级等功能的软件,支持对大批量设备同时进行各参数的配置,极大的简化了操作过程! 软件功能 1.对在线设备进行搜索 ...
- F# 4.6 预览版正式公布
1月24日,F# 4.6 预览版正式公布,与以往一样,新版本的设计与开发过程是整个 F# 开源社区共同努力的结果,这次更新的具体讨论内容可以通过下面两个链接来查看: F# 4.6 意见征求记录 FSh ...
- Hadoop入门——初识Hadoop
一.hadoop是什么 Hadoop被公认是一套行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力.几乎所有主流厂商都围绕Hadoop开发工具.开源软件.商业化工具和技术服务.今年大型IT ...