鄭澤濤,余健
(韓山師范學(xué)院計(jì)算機(jī)與信息工程學(xué)院,潮州521041)
自十八世紀(jì)中期,瓦特改良了蒸汽機(jī)之后,由一系列技術(shù)革命引起了從手工勞動(dòng)向動(dòng)力機(jī)器生產(chǎn)轉(zhuǎn)變的重大飛躍,這就是人們常說(shuō)的第一次工業(yè)革命。自工業(yè)革命以來(lái),機(jī)器所帶來(lái)的生產(chǎn)力遠(yuǎn)遠(yuǎn)超過(guò)了人工。隨著機(jī)器的產(chǎn)生,又出現(xiàn)了機(jī)器人。機(jī)器人脫離了空間的限制,可以自由移動(dòng),前進(jìn)、后退、左轉(zhuǎn)、右轉(zhuǎn)都是可以實(shí)現(xiàn)的。光可以移動(dòng),還是不夠的,人們又給機(jī)器人加上了諸多感應(yīng)器,充當(dāng)機(jī)器人的眼睛、耳朵和手等[1]。
機(jī)器人的產(chǎn)生,也帶來(lái)了機(jī)器人編程,可是受到實(shí)物的限制,不能廣泛傳播,因?yàn)椴豢赡茏屆恳粋€(gè)初學(xué)者都去購(gòu)買(mǎi)機(jī)器人回來(lái)測(cè)試,畢竟這東西還是蠻貴的。此時(shí),模擬機(jī)器人運(yùn)行環(huán)境的程序的出現(xiàn)就剛好解決了這個(gè)問(wèn)題,以RobotBASIC 為例,使用它可以很方便地在電腦上做各種關(guān)于機(jī)器人的測(cè)試。但是,僅僅依靠RobotBASIC 也無(wú)法解決一些問(wèn)題,如矢量圖畫(huà)法的數(shù)據(jù)填充問(wèn)題,此時(shí)開(kāi)發(fā)工具的配合使用,就體現(xiàn)出它的強(qiáng)大之處,很多依靠RobotBASIC 自身無(wú)法解決的問(wèn)題,可以通過(guò)配合其他開(kāi)發(fā)工具,如VS2010 解決[2]。
本文主要是研究并開(kāi)發(fā)一個(gè)矢量圖算法生成器,利用winForm 的可視化界面,為系統(tǒng)和用戶提供一個(gè)良好的交互環(huán)境,用戶只需要修改對(duì)應(yīng)的數(shù)值,就可以自動(dòng)一鍵生成對(duì)應(yīng)的算法代碼,即解決了“矢量圖畫(huà)法的數(shù)據(jù)填充問(wèn)題”,又為用戶保留了創(chuàng)新的空間[3]。
通過(guò)“矢量圖畫(huà)法”完成以下任務(wù):即通過(guò)機(jī)器人的移動(dòng)、落筆、收筆,畫(huà)出自己的名字或者其他字符[4]。
系統(tǒng)需要解決以下問(wèn)題:
(1)機(jī)器人如何實(shí)現(xiàn)矢量圖畫(huà)法
(2)如何把算法轉(zhuǎn)化為可視化參數(shù)
(3)如何把可視化參數(shù)轉(zhuǎn)化為算法代碼
系統(tǒng)體系架構(gòu)圖和系統(tǒng)流程圖分別如圖1 和圖2所示。
圖1 系統(tǒng)體系架構(gòu)圖
圖2 系統(tǒng)流程圖
矢量圖原理其實(shí)就是利用二維數(shù)組存儲(chǔ)像素點(diǎn),通過(guò)0 不畫(huà)1 畫(huà)的方式來(lái)畫(huà)。而在RobotBASIC 中,只有一維數(shù)組,即二維數(shù)據(jù)存在一維數(shù)組中,機(jī)器人走到每行的末尾時(shí),由于下個(gè)點(diǎn)是下一行的開(kāi)始,所以機(jī)器人必須從尾部重新跑回去起始點(diǎn)[5],如圖3 所示。
圖3 矢量圖行走邏輯
該模塊的主要功能是,把難以理解的算法參數(shù),轉(zhuǎn)化為用戶肉養(yǎng)可見(jiàn)的可視化參數(shù),用戶可以直接通過(guò)修改參數(shù),達(dá)到修改算法代碼的目的[6]。下面介紹以下常用的參數(shù)名:
(1)顯示文字:該參數(shù)輸入的是要顯示的字符,當(dāng)字符數(shù)為0 時(shí)無(wú)法生成代碼
(2)字體種類(lèi):該參數(shù)讀取了系統(tǒng)本地所有的字體種類(lèi)供用戶選擇
(3)文字坐標(biāo):該參數(shù)設(shè)置文字顯示的(x,y)位置
(4)文字字體大?。涸搮?shù)設(shè)置文字的字體大小
(5)旋轉(zhuǎn)點(diǎn):該參數(shù)設(shè)置的是顯示界面的旋轉(zhuǎn)中心,初始坐標(biāo)為(400,300)
(6)旋轉(zhuǎn)角度:該參數(shù)設(shè)置的顯示界面的旋轉(zhuǎn)角度
(7)機(jī)器人半徑:該參數(shù)用于設(shè)置機(jī)器人的半徑,取值區(qū)間為[1,50],由于在RobotBASIC 中,機(jī)器人移動(dòng)碰到邊緣時(shí)會(huì)出錯(cuò),該參數(shù)是為了保證代碼不會(huì)運(yùn)行出錯(cuò)
(8)僅顯示截取框內(nèi)容(勾選):該參數(shù)用于顯示和隱藏?zé)o效區(qū)域
(9)生成代碼(按鈕):點(diǎn)擊可以生成代碼
其中雙框截取同步模塊主要是為了給用戶提示無(wú)效區(qū)域。由于機(jī)器人碰到邊緣時(shí)會(huì)出錯(cuò),所以機(jī)器人的畫(huà)圖區(qū)域受其半徑影響,也就是在主界面邊緣往里半徑以內(nèi)的區(qū)域都是無(wú)法畫(huà)圖了。用戶可以直觀地看到無(wú)效區(qū)域中的內(nèi)容和實(shí)際上可以畫(huà)出來(lái)的內(nèi)容,如圖4 所示。
圖4 顯示和隱藏?zé)o效區(qū)域內(nèi)容
如圖5 所示,這是系統(tǒng)的可視化界面,用戶可以通過(guò)該界面,修改顯示文字、字體種類(lèi)、文字坐標(biāo)、文字字體大小、旋轉(zhuǎn)點(diǎn)、旋轉(zhuǎn)角度、機(jī)器人半徑,還可設(shè)置是否顯示無(wú)效區(qū)域的內(nèi)容,最后確定后,通過(guò)點(diǎn)擊[生成代碼]按鈕,可以生成代碼。
圖5 矢量圖算法生成器界面
通過(guò)圖6 的對(duì)比可以看出,骨架畫(huà)法顯然比不上矢量圖畫(huà)法,而且每次畫(huà)新的字符時(shí),都需要重新編寫(xiě)行走代碼,復(fù)用性極差;而矢量圖畫(huà)法畫(huà)出的結(jié)果更美觀,且復(fù)用性好。
圖6 骨架畫(huà)法和矢量圖畫(huà)法對(duì)比
如圖7,將字體的種類(lèi)修改為“華為隸書(shū)”后,再修改旋轉(zhuǎn)參數(shù),使字符旋轉(zhuǎn)一定的角度后,個(gè)性的字符圖產(chǎn)生了。
圖7 顯示界面
由于RobotBASIC 中機(jī)器人觸碰到邊緣時(shí)會(huì)產(chǎn)生錯(cuò)誤,所以機(jī)器人的半徑就是臨界值,使得界面中有一部分無(wú)法畫(huà)到,被稱(chēng)為無(wú)效區(qū)域。無(wú)效區(qū)域內(nèi)的內(nèi)容在展示時(shí)是不會(huì)出現(xiàn)的,如圖8 所示。
RobotBASIC 界面是800×600 像素,機(jī)器人半徑r,則所需存儲(chǔ)的像素點(diǎn)數(shù)據(jù)量為:
S=(800-2*r)*(600-2*r)(0 可以解得:350000<=S<480000。 這是一個(gè)龐大的數(shù)據(jù)量,如圖9 所示,“Robot”字符所產(chǎn)生的代碼長(zhǎng)度約為842KB。 圖8 無(wú)效區(qū)域的顯示 圖9 生成代碼字節(jié)長(zhǎng)度 生成的算法代碼在RobotBASIC 中運(yùn)行算法,開(kāi)始運(yùn)行時(shí)間是:21:41:47,結(jié)束運(yùn)行時(shí)間是:22:03:23,總共花費(fèi)時(shí)間是:22:03:23-21:41:47=0:21:36,花費(fèi)時(shí)間超過(guò)21 分鐘,如圖10 所示。 圖10 原算法運(yùn)行 前面對(duì)于數(shù)據(jù)的填充,是把除無(wú)效區(qū)域外的所有數(shù)據(jù)全部計(jì)入,但是這有一個(gè)問(wèn)題,以圖11 為例,有效數(shù)據(jù)其實(shí)只有中間“Robot”這一部分的數(shù)據(jù),周?chē)目瞻讌^(qū)域其實(shí)機(jī)器人根本不需要行走到,機(jī)器人走過(guò)是在浪費(fèi)時(shí)間,但是也被填入到數(shù)據(jù)中。通過(guò)更新填充算法,先計(jì)算出有效數(shù)據(jù)像素點(diǎn)所占的矩形范圍,從而分別獲取橫、縱坐標(biāo)的最大值和最小值,如圖11 所示,縮小了填充數(shù)據(jù)的范圍,大大減少了機(jī)器人完成任務(wù)的時(shí)間。 矢量圖原理其實(shí)就是利用二維數(shù)組存儲(chǔ)像素點(diǎn),通過(guò)0 不畫(huà)1 畫(huà)的方式來(lái)畫(huà)。而在RobotBASIC 中,只有一維數(shù)組,即二維數(shù)據(jù)存在一維數(shù)組中,機(jī)器人走到每行的末尾時(shí),由于下個(gè)點(diǎn)是下一行的開(kāi)始,所以機(jī)器人必須從尾部重新跑回去起始點(diǎn)。但是,這樣每次走回每行的起始點(diǎn),這部分時(shí)間是浪費(fèi)的,所以我們采用新的行走邏輯算法。利用一、二維數(shù)據(jù)的轉(zhuǎn)換關(guān)系,用兩個(gè)參數(shù)i 和j 分別表示當(dāng)前的點(diǎn)是第(i+1)行,第(j+1)列,這里+1 是因?yàn)閿?shù)組下標(biāo)從0 開(kāi)始計(jì)算。在一個(gè)列數(shù)為n 的矩陣中,一維數(shù)組表示形式就是c[i*n+j],這是等價(jià)于二維數(shù)組的c[i][j]的。然后在機(jī)器人走到一行的末尾時(shí),行數(shù)+1,列數(shù)不變,讓機(jī)器人轉(zhuǎn)個(gè)180°,從一行的末尾往前走,這樣就可以節(jié)省掉機(jī)器人跑回行首的時(shí)間了,如圖12 所示,減少了幾乎一半的行走時(shí)間。 圖11 尋找有效矩形區(qū)域 圖12 新舊行走方式對(duì)比 從圖13 中可以很明顯看出差別,原算法代碼字節(jié)長(zhǎng)度是842KB,新算法代碼字節(jié)長(zhǎng)度是29KB,減少了約813KB,減少了96.556%的字節(jié)長(zhǎng)度,新算法的字節(jié)長(zhǎng)度僅是原算法字節(jié)長(zhǎng)度的3.44%,大大縮小了數(shù)據(jù)填充量,提高了機(jī)器人的運(yùn)行效率。 圖13 新舊算法字節(jié)長(zhǎng)度對(duì)比 如圖14 所示,系統(tǒng)維護(hù)更新后新算法的運(yùn)行時(shí)間僅是39s,而原算法運(yùn)行時(shí)間是21 分鐘36 秒,合計(jì)1296 秒,新算法所用時(shí)間僅是原算法所用時(shí)間的3.01%,減少了約96.99%的時(shí)間消耗。 圖14 新算法運(yùn)行 本文主要是通過(guò)解決“矢量圖畫(huà)法的數(shù)據(jù)填充問(wèn)題”,研究開(kāi)發(fā)工具聯(lián)合使用的作用。從文中可以很明顯的看出,單單靠RobotBASIC 根本無(wú)法完成“矢量圖畫(huà)法”這種難度極大的任務(wù),然而在Visual Studio 參與聯(lián)合開(kāi)發(fā)之后,問(wèn)題變得輕松了許多。并且在一開(kāi)始設(shè)計(jì)時(shí),由于沒(méi)有考慮到“數(shù)據(jù)量大”和“行走方式的缺陷”,導(dǎo)致算法代碼字節(jié)長(zhǎng)度過(guò)長(zhǎng)和運(yùn)行時(shí)間過(guò)長(zhǎng),不過(guò)通過(guò)不懈的努力和研究,系統(tǒng)還是得到了完善,成功解決了該文研究的問(wèn)題。 系統(tǒng)目前處于一個(gè)比較穩(wěn)定的狀態(tài),但是同時(shí)也存在一個(gè)問(wèn)題,那就是如果填充數(shù)據(jù)過(guò)于分散時(shí),系統(tǒng)的數(shù)據(jù)填充量和機(jī)器人的運(yùn)行時(shí)間依然會(huì)很長(zhǎng),這個(gè)問(wèn)題暫時(shí)還沒(méi)有得到解決,在后續(xù)更新維護(hù)中會(huì)逐步解決。3 矢量圖行走算法
4 結(jié)語(yǔ)