国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

數(shù)控系統(tǒng)中HPGL 圖形文件識別與圖形處理研究*

2013-12-23 04:46張書偉劉建群呂振飛
關(guān)鍵詞:鏈表圓弧圖層

張書偉,劉建群,施 為,呂振飛

(廣東工業(yè)大學(xué) 機(jī)電工程學(xué)院,廣州 510006)

0 引言

隨著加工制造業(yè)自動(dòng)化、一體化的快速發(fā)展,數(shù)控系統(tǒng)也在不斷向高智能化和高精度方向發(fā)展,數(shù)控系統(tǒng)中對圖形文件的要求也越來越高,傳統(tǒng)的圖形文件如DXF 由于在某些方面的缺陷已經(jīng)不能夠完全滿足數(shù)控系統(tǒng)發(fā)展的需要,而HPGL 圖形文件以其獨(dú)特的優(yōu)點(diǎn)逐漸受到數(shù)控系統(tǒng)開發(fā)者的青睞。

HPGL 是一種矢量圖形語言,支持面向?qū)ο?,通過幾何學(xué)方法來描述圖像,是惠普公司20 世紀(jì)50 年代為控制其繪圖儀產(chǎn)品建立的一套指令系統(tǒng),目的是提供可被多種外部設(shè)備支持的一致功能,從而減輕程序開發(fā)過程中的工作,隨后被廣泛應(yīng)用于繪圖儀和打印機(jī)控制語言并成為標(biāo)準(zhǔn)[1]。主要有plt、hpg、hp2、pl2、prn 五種擴(kuò)展名,其中plt 最為常用,本文就是以plt 格式為數(shù)據(jù)對象。HPGL 原來是為控制繪圖儀而設(shè)計(jì)的,因此它只能表達(dá)二維非交互的圖形[2]。隨著當(dāng)前數(shù)控技術(shù)的不斷發(fā)展,對圖形文件的要求也越來越高,在表達(dá)一些復(fù)雜的圖形時(shí),一般的光柵圖形文件所占用的內(nèi)存會比較大,對輸入輸出調(diào)用的速度比較慢,這樣會影響工作的效率。而HPGL 圖形文件具有豐富的指令信息,易于讀寫,使工作人員在創(chuàng)建圖形時(shí)具有很大的靈活性,并且為設(shè)備之間的使用提供了兼容性,占用內(nèi)存較少,對輸入輸出的調(diào)用也更有效率,使得打印速度也更快,能夠大大提高工作效率,因此逐漸被廣泛應(yīng)用到數(shù)控系統(tǒng)中。HPGL 圖形文件的生成方法有多種,一般是由AUTOCAD、CorelDraw 等繪圖軟件直接生成,也可以根據(jù)需要人為地進(jìn)行指令的編寫。

1 圖形文件讀取與存儲

1.1 指令讀取

實(shí)現(xiàn)文件中指令讀取的操作方法有許多種,在本次設(shè)計(jì)中采用的是逐一字符比較的方法對HPGL圖形文件中幾種常用指令進(jìn)行讀取。所讀取指令及所表達(dá)含義表1 所示。

表1 讀取指令及所表達(dá)含義

首先打開文件并判斷文件是否為空,如果不為空將文件中所有字符存儲到容器中,然后循環(huán)讀取容器中的字符,每一次讀出一個(gè)字符進(jìn)行比較,如果遇到要識別指令,則讀出指令信息并將指令信息按直線、圓弧和圓歸類,直到容器中所有字符讀完結(jié)束。這種方法優(yōu)點(diǎn)比較直觀,便于理解,易于修改,程序結(jié)構(gòu)比較簡練。指令讀取流程如圖1 所示。

圖1 指令讀取流程圖

1.2 數(shù)據(jù)計(jì)算

從圖形文件中讀取的圓弧指令信息并不能夠滿足圖形顯示需要,因此需要通過計(jì)算獲取所需數(shù)據(jù)信息。從圖形文件中可以得到圓弧的起點(diǎn)坐標(biāo)、圓心坐標(biāo)、圓心角。在此需要計(jì)算圖形的起始角、終止角、終點(diǎn)坐標(biāo)、起始切線角、終止切線角。以圓心為起點(diǎn)過圓弧起點(diǎn)坐標(biāo)的向量與X 軸正方向的夾角記為起始角sAngle,過圓弧起點(diǎn)和圓弧相切且方向與圓弧走向相同的向量與X 軸正方向的夾角記為起始切線角sTan,以圓心為起點(diǎn)過圓弧終點(diǎn)坐標(biāo)的向量與X軸正方向夾角記為終止角eAngle,過圓弧終點(diǎn)和圓弧相切且方向與圓弧走向相同的向量與X 軸正方向的夾角記為起始切線角eTan,設(shè)圓弧圓心角為angle,圓弧起點(diǎn)坐標(biāo)為(Xs,Ys),終點(diǎn)坐標(biāo)為(Xe,Ye),圓心坐標(biāo)為(Xo,Yo),圓弧半徑為R。則:

如果Ys<Yo,說明sAngle 應(yīng)該為大于180°,由于在VC 中函數(shù)acos 所計(jì)算結(jié)果為0 ~180°,所以sAngle= 360°-sAngle。由此可以求得eAngle =sAngle +angle,當(dāng)eAngle >360°時(shí),eAngle = eAngle-360°,當(dāng)eAngle <0 時(shí),eAngle =eAngle +360°,當(dāng)angle 為正時(shí)說明圓弧為逆時(shí)針走向,否則為順時(shí)針走向。如果圓弧為逆時(shí)針,則sTan 和eTan 分別等于起始角和終止角加上90°,否則sTan 和eTan 分別等于起始角和終止角減去90°,根據(jù)圓弧終止角可以求得圓弧終點(diǎn)坐標(biāo)(Xe,Ye),即:

在VC 繪制圖形過程中,由于只能繪制逆時(shí)針的圖形,因此對于順時(shí)針圖形繪制時(shí)應(yīng)當(dāng)進(jìn)行起點(diǎn)與終點(diǎn)之間的對換。

1.3 數(shù)據(jù)存儲

采用鏈表進(jìn)行數(shù)據(jù)存儲,首先建立一個(gè)雙向圖層鏈表,用來存儲圖層信息。當(dāng)讀取SP 指令信息時(shí),讀取刀號的同時(shí)創(chuàng)建一個(gè)圖層,使得一個(gè)刀號對應(yīng)一個(gè)圖層,將該圖層插入到圖層鏈表中。然后在每個(gè)圖層下創(chuàng)建一個(gè)雙向?qū)嶓w鏈表,用來存儲從圖形文件中讀取的直線、圓和圓弧實(shí)體的數(shù)據(jù)信息。雙向圖層鏈表結(jié)構(gòu)如圖2 所示。

圖2 圖層鏈表結(jié)構(gòu)

2 圖形處理

2.1 輪廓識別

從圖形文件中讀取的圖形信息,只是一段段單獨(dú)的實(shí)體線段,并不是整體封閉的輪廓,也沒有進(jìn)行內(nèi)外輪廓區(qū)分,在做后續(xù)的加工時(shí),可能會出現(xiàn)先加工外輪廓后加工內(nèi)輪廓的情況,這樣會產(chǎn)生定位誤差,造成加工精度不精確[3],因此要先做輪廓識別,以整輪廓的形式存儲,并區(qū)分好內(nèi)外輪廓,以此避免加工時(shí)的隨意性,提高加工精度。

輪廓識別過程大體可以分為以下幾步:

第一步:遍歷整個(gè)圖層鏈表,從所存儲的實(shí)體線段的起點(diǎn)中找出最大Y 坐標(biāo),如果出現(xiàn)最大Y 坐標(biāo)的坐標(biāo)點(diǎn)有多個(gè),則找出這些坐標(biāo)點(diǎn)中X 坐標(biāo)最小的那個(gè)點(diǎn)記為firstPoint,作為一個(gè)外輪廓的起點(diǎn)坐標(biāo)。

第二步:從鏈表中找出所有包含firstPoint 點(diǎn)的實(shí)體線段,如果該點(diǎn)為線段的終點(diǎn)則將線段首尾倒序。計(jì)算出這些線段與X 軸正方向的逆時(shí)針夾角,比較計(jì)算出來的角度,找出角度最小的線段,作為該外輪廓的一條邊暫存起來。角度計(jì)算方法如下:如果是直線計(jì)算出以firstPoint 為起點(diǎn)過直線另一端點(diǎn)的向量與X 軸正方向的逆時(shí)針夾角,如果是圓弧計(jì)算出過firstPoint 點(diǎn),且方向與圓弧走向相同的切線與X 軸正方向的逆時(shí)針夾角,在計(jì)算直線和圓弧過程中如果向量方向與X 軸正方向相同,則求得夾角記為360°,如果是圓,則不計(jì)算直接作為一外輪廓。找到該外輪廓的一條邊后將線段與firstPoint 不同的另一端點(diǎn),賦值給firstPoint。然后從圖層鏈表中刪除該線段。

第三步:重復(fù)第二步操作,直到找到一條線段的終點(diǎn)與該外輪廓的起點(diǎn)相同,則一個(gè)外輪廓識別結(jié)束。

第四步:采用傳統(tǒng)的射線法[3-4]從圖層鏈表中找出該外輪廓內(nèi)部的所有實(shí)體線段存儲到臨時(shí)鏈表中,然后再按照識別外輪廓的方法將這些實(shí)體線段拼接成封閉的輪廓做為該外輪廓所包含的內(nèi)輪廓。一個(gè)整輪廓識別完成。

第五步:判斷圖層鏈表是否為空,如果不為空,繼續(xù)操作上述四步,直至所有輪廓識別完成。

第六步:輪廓識別后將輪廓存儲到鏈表中,存儲的方法是首先創(chuàng)建一個(gè)鏈表稱之為輪廓鏈表,將一個(gè)外輪廓插入鏈表的頭部,如果該外輪廓內(nèi)部含有內(nèi)輪廓?jiǎng)t按順序?qū)?nèi)輪廓插入到所創(chuàng)建鏈表的尾部,如果該外輪廓內(nèi)部不含內(nèi)輪廓或該外輪廓內(nèi)所有內(nèi)輪廓存儲完畢,則按上述存儲方法重復(fù)操作,直到所有輪廓存儲完畢。然后再創(chuàng)建一個(gè)鏈表記為整體輪廓鏈表,將所有輪廓鏈表按照一定的順序插入到整體輪廓鏈表中。

2.2 圖形移動(dòng)到指定位置

此操作目的是為了實(shí)現(xiàn)在圖形輪廓加工時(shí)將圖形移動(dòng)到加工刀具所在位置,直接開始加工,避免刀具空運(yùn)行,提高加工效率。

首先獲取鼠標(biāo)左鍵在VC 視口屏幕上按下的坐標(biāo)記為point,然后遍歷輪廓鏈表,計(jì)算出組成輪廓的所有線段起點(diǎn)到point 之間的距離,計(jì)算結(jié)果與設(shè)定的有效距離相比較,如果在有效距離以內(nèi)則該線段起點(diǎn)為所在輪廓的加工起點(diǎn)記為startPoint,以start-Point 為起點(diǎn)對輪廓中的所有線段排序,然后分別對內(nèi)輪廓和整體輪廓進(jìn)行排序,將點(diǎn)startPoint 所在內(nèi)輪廓作為第一加工輪廓,該內(nèi)輪廓所在的整體輪廓作為第一加工整體輪廓。

如果輪廓為單獨(dú)圓,在此通過計(jì)算可以改變其起點(diǎn)的位置,方便從圓的任意位置進(jìn)行加工。首先是計(jì)算鼠標(biāo)左鍵按下點(diǎn)point 到圓心的距離記為d1,圓半徑記為r,則判斷|d1-r|時(shí)是否在有效距離內(nèi)。如果在,則有圓心坐標(biāo)、point、d1 和r,通過他們之間的比例關(guān)系可以計(jì)算出以圓心為起點(diǎn)過點(diǎn)point 的向量與圓的交點(diǎn)的坐標(biāo),將此點(diǎn)設(shè)定為圓的新起點(diǎn)為

startPoint。

計(jì)算獲取startPoint 后,獲取圖形將要移動(dòng)到位置的坐標(biāo)記為toolPoint,計(jì)算出startPoint 到toolPoint在X 軸和Y 軸方向的距離,最后通過坐標(biāo)計(jì)算將整體輪廓的加工起點(diǎn)移動(dòng)到指定位置。

3 運(yùn)行實(shí)例

本文以VC++6.0 為開發(fā)平臺,在VC 視口中進(jìn)行圖形繪制時(shí),所使用的坐標(biāo)為設(shè)備坐標(biāo),設(shè)備坐標(biāo)指的是設(shè)備空間中所使用的坐標(biāo),所謂設(shè)備空間通常是指應(yīng)用窗口的客戶區(qū)也包括整個(gè)桌面、完整的窗口等等。而幾乎在所有的GDI(圖形設(shè)備接口)函數(shù)中使用的一般是邏輯坐標(biāo),同理邏輯坐標(biāo)一般在邏輯空間中使用,在邏輯空間中可以對圖形進(jìn)行平移、旋轉(zhuǎn)等多種圖形變換[5-6]。因此將邏輯坐標(biāo)轉(zhuǎn)化為設(shè)備坐標(biāo)才能夠正確的顯示圖形。

首先使用AutoCAD2000 繪制出包含封閉內(nèi)外輪廓的圖形,如圖3AutoCAD2000 中繪制的圖形所示,生成HPGL 圖形文件,然后通過研究開發(fā)出的軟件進(jìn)行文件讀取、輪廓識別獲取圖形繪制信息,最后通過邏輯坐標(biāo)到設(shè)備坐標(biāo)的坐標(biāo)轉(zhuǎn)換在VC ++6.0 中繪制圖形,結(jié)果如圖4VC ++6.0 運(yùn)行結(jié)果圖所示。結(jié)果表明本文提出的HPGL 圖形文件讀取方法和輪廓識別方法能夠達(dá)到預(yù)期效果。

圖3 AutoCAD2000 中繪制的圖形

圖4 VC++6.0 運(yùn)行結(jié)果圖

4 結(jié)束語

本文以比較直觀的方法實(shí)現(xiàn)了HPGL 圖形文件中圖形信息的讀取,對圓弧終點(diǎn)和角度的計(jì)算做了詳細(xì)的描述,采用雙向鏈表實(shí)現(xiàn)了數(shù)據(jù)的存儲,通過輪廓識別區(qū)分出了圖形的內(nèi)外輪廓,通過算法實(shí)現(xiàn)將圖形移動(dòng)到指定位置,提高了輪廓加工時(shí)的簡便性。通過VC++6.0 運(yùn)行顯示本次設(shè)計(jì)達(dá)到預(yù)期效果。

[1]Paul Bourke. Using HPGL as a drawing interchange media[EB/OL].1992.

[2]賈龍,方亮,陳太喜,等. 基于OpenGL 的HPGL 數(shù)據(jù)異形體模型三維建模[EB/OL].2009.

[3]徐東,劉建群,吳積榮,等. 外輪廓識別算法在紙箱打樣機(jī)中的應(yīng)用研究[J]. 廣東工業(yè)大學(xué)學(xué)報(bào),2011,28,(2):31-36.

[4]苗春葆. 點(diǎn)與多邊形關(guān)系的射線法[J]. 電腦編程技巧與維護(hù),2008(3):56-58.

[5]孫鑫,余安萍. VC++深入詳解[M]. 北京:電子工業(yè)出版社,2006.

[6]陳建春. 矢量圖形系統(tǒng)開發(fā)與編程[M]. 北京:電子工業(yè)出版社,2004.

猜你喜歡
鏈表圓弧圖層
淺析圓弧段高大模板支撐體系設(shè)計(jì)與應(yīng)用
為《飛舞的空竹龍》加動(dòng)感
如何用鏈表實(shí)現(xiàn)一元多項(xiàng)式相加
外圓弧面銑削刀具
跟麥咭學(xué)編程
解密照片合成利器圖層混合模式
基于MTF規(guī)則的非阻塞自組織鏈表
雙圓弧齒同步帶的載荷特性研究
六圓弧齒廓螺旋齒輪及其嚙合特性
C語言中指針鏈表的學(xué)習(xí)探討