矢量图算法生成系统的研究
2019-07-25郑泽涛余健
郑泽涛,余健
(韩山师范学院计算机与信息工程学院,潮州521041)
0 引言
自十八世纪中期,瓦特改良了蒸汽机之后,由一系列技术革命引起了从手工劳动向动力机器生产转变的重大飞跃,这就是人们常说的第一次工业革命。自工业革命以来,机器所带来的生产力远远超过了人工。随着机器的产生,又出现了机器人。机器人脱离了空间的限制,可以自由移动,前进、后退、左转、右转都是可以实现的。光可以移动,还是不够的,人们又给机器人加上了诸多感应器,充当机器人的眼睛、耳朵和手等[1]。
机器人的产生,也带来了机器人编程,可是受到实物的限制,不能广泛传播,因为不可能让每一个初学者都去购买机器人回来测试,毕竟这东西还是蛮贵的。此时,模拟机器人运行环境的程序的出现就刚好解决了这个问题,以RobotBASIC 为例,使用它可以很方便地在电脑上做各种关于机器人的测试。但是,仅仅依靠RobotBASIC 也无法解决一些问题,如矢量图画法的数据填充问题,此时开发工具的配合使用,就体现出它的强大之处,很多依靠RobotBASIC 自身无法解决的问题,可以通过配合其他开发工具,如VS2010 解决[2]。
本文主要是研究并开发一个矢量图算法生成器,利用winForm 的可视化界面,为系统和用户提供一个良好的交互环境,用户只需要修改对应的数值,就可以自动一键生成对应的算法代码,即解决了“矢量图画法的数据填充问题”,又为用户保留了创新的空间[3]。
1 系统设计
1.1 需求
通过“矢量图画法”完成以下任务:即通过机器人的移动、落笔、收笔,画出自己的名字或者其他字符[4]。
系统需要解决以下问题:
(1)机器人如何实现矢量图画法
(2)如何把算法转化为可视化参数
(3)如何把可视化参数转化为算法代码
1.2 系统总体设计
系统体系架构图和系统流程图分别如图1 和图2所示。
图1 系统体系架构图
图2 系统流程图
1.3 系统详细设计
矢量图原理其实就是利用二维数组存储像素点,通过0 不画1 画的方式来画。而在RobotBASIC 中,只有一维数组,即二维数据存在一维数组中,机器人走到每行的末尾时,由于下个点是下一行的开始,所以机器人必须从尾部重新跑回去起始点[5],如图3 所示。
图3 矢量图行走逻辑
该模块的主要功能是,把难以理解的算法参数,转化为用户肉养可见的可视化参数,用户可以直接通过修改参数,达到修改算法代码的目的[6]。下面介绍以下常用的参数名:
(1)显示文字:该参数输入的是要显示的字符,当字符数为0 时无法生成代码
(2)字体种类:该参数读取了系统本地所有的字体种类供用户选择
(3)文字坐标:该参数设置文字显示的(x,y)位置
(4)文字字体大小:该参数设置文字的字体大小
(5)旋转点:该参数设置的是显示界面的旋转中心,初始坐标为(400,300)
(6)旋转角度:该参数设置的显示界面的旋转角度
(7)机器人半径:该参数用于设置机器人的半径,取值区间为[1,50],由于在RobotBASIC 中,机器人移动碰到边缘时会出错,该参数是为了保证代码不会运行出错
(8)仅显示截取框内容(勾选):该参数用于显示和隐藏无效区域
(9)生成代码(按钮):点击可以生成代码
其中双框截取同步模块主要是为了给用户提示无效区域。由于机器人碰到边缘时会出错,所以机器人的画图区域受其半径影响,也就是在主界面边缘往里半径以内的区域都是无法画图了。用户可以直观地看到无效区域中的内容和实际上可以画出来的内容,如图4 所示。
图4 显示和隐藏无效区域内容
2 系统实现
2.1 系统界面
如图5 所示,这是系统的可视化界面,用户可以通过该界面,修改显示文字、字体种类、文字坐标、文字字体大小、旋转点、旋转角度、机器人半径,还可设置是否显示无效区域的内容,最后确定后,通过点击[生成代码]按钮,可以生成代码。
图5 矢量图算法生成器界面
2.2 运行效果
通过图6 的对比可以看出,骨架画法显然比不上矢量图画法,而且每次画新的字符时,都需要重新编写行走代码,复用性极差;而矢量图画法画出的结果更美观,且复用性好。
图6 骨架画法和矢量图画法对比
如图7,将字体的种类修改为“华为隶书”后,再修改旋转参数,使字符旋转一定的角度后,个性的字符图产生了。
图7 显示界面
由于RobotBASIC 中机器人触碰到边缘时会产生错误,所以机器人的半径就是临界值,使得界面中有一部分无法画到,被称为无效区域。无效区域内的内容在展示时是不会出现的,如图8 所示。
RobotBASIC 界面是800×600 像素,机器人半径r,则所需存储的像素点数据量为:
S=(800-2*r)*(600-2*r)(0 可以解得:350000<=S<480000。 这是一个庞大的数据量,如图9 所示,“Robot”字符所产生的代码长度约为842KB。 图8 无效区域的显示 图9 生成代码字节长度 生成的算法代码在RobotBASIC 中运行算法,开始运行时间是:21:41:47,结束运行时间是:22:03:23,总共花费时间是:22:03:23-21:41:47=0:21:36,花费时间超过21 分钟,如图10 所示。 图10 原算法运行 前面对于数据的填充,是把除无效区域外的所有数据全部计入,但是这有一个问题,以图11 为例,有效数据其实只有中间“Robot”这一部分的数据,周围的空白区域其实机器人根本不需要行走到,机器人走过是在浪费时间,但是也被填入到数据中。通过更新填充算法,先计算出有效数据像素点所占的矩形范围,从而分别获取横、纵坐标的最大值和最小值,如图11 所示,缩小了填充数据的范围,大大减少了机器人完成任务的时间。 矢量图原理其实就是利用二维数组存储像素点,通过0 不画1 画的方式来画。而在RobotBASIC 中,只有一维数组,即二维数据存在一维数组中,机器人走到每行的末尾时,由于下个点是下一行的开始,所以机器人必须从尾部重新跑回去起始点。但是,这样每次走回每行的起始点,这部分时间是浪费的,所以我们采用新的行走逻辑算法。利用一、二维数据的转换关系,用两个参数i 和j 分别表示当前的点是第(i+1)行,第(j+1)列,这里+1 是因为数组下标从0 开始计算。在一个列数为n 的矩阵中,一维数组表示形式就是c[i*n+j],这是等价于二维数组的c[i][j]的。然后在机器人走到一行的末尾时,行数+1,列数不变,让机器人转个180°,从一行的末尾往前走,这样就可以节省掉机器人跑回行首的时间了,如图12 所示,减少了几乎一半的行走时间。 图11 寻找有效矩形区域 图12 新旧行走方式对比 从图13 中可以很明显看出差别,原算法代码字节长度是842KB,新算法代码字节长度是29KB,减少了约813KB,减少了96.556%的字节长度,新算法的字节长度仅是原算法字节长度的3.44%,大大缩小了数据填充量,提高了机器人的运行效率。 图13 新旧算法字节长度对比 如图14 所示,系统维护更新后新算法的运行时间仅是39s,而原算法运行时间是21 分钟36 秒,合计1296 秒,新算法所用时间仅是原算法所用时间的3.01%,减少了约96.99%的时间消耗。 图14 新算法运行 本文主要是通过解决“矢量图画法的数据填充问题”,研究开发工具联合使用的作用。从文中可以很明显的看出,单单靠RobotBASIC 根本无法完成“矢量图画法”这种难度极大的任务,然而在Visual Studio 参与联合开发之后,问题变得轻松了许多。并且在一开始设计时,由于没有考虑到“数据量大”和“行走方式的缺陷”,导致算法代码字节长度过长和运行时间过长,不过通过不懈的努力和研究,系统还是得到了完善,成功解决了该文研究的问题。 系统目前处于一个比较稳定的状态,但是同时也存在一个问题,那就是如果填充数据过于分散时,系统的数据填充量和机器人的运行时间依然会很长,这个问题暂时还没有得到解决,在后续更新维护中会逐步解决。3 矢量图行走算法
4 结语