<tr id="stl47"><source id="stl47"></source></tr>

<form id="stl47"><span id="stl47"><track id="stl47"></track></span></form>
<wbr id="stl47"></wbr>
    <form id="stl47"></form>
      <sub id="stl47"></sub>
        <tr id="stl47"></tr>
      1. <form id="stl47"></form>
        <form id="stl47"><th id="stl47"><noscript id="stl47"></noscript></th></form>

          <sub id="stl47"></sub><table id="stl47"><th id="stl47"><track id="stl47"></track></th></table>
            電火花線切割切割漢字的編程技巧
            發布者:蘇州中航長風數控機床有限公司  發布時間:2011-05-29 20:57:19  訪問次數:727

            電火花線切割切割漢字的編程技巧
                  電火花線切割要實現切割漢字首先要獲得漢字字形輪廓,這涉及到如何從字庫中提取漢字字形輪廓的問題。漢字的字體根據其實現形式的不同可分為點陣字體、矢量字體及TrueType字體等幾種。其中使用最廣泛的為TrueType字體,與其他字體相比,TrueType字體具有明顯的優點:

                  (1)它使用直線和曲線對字符進行描述,具有放大和縮小不變形的特點;
                  (2)具有處理速度快及與設備無關的特點;
                  (3)它是Windows系統所使用的最廣泛的字體,因而Windows提供了大量的API函數來支持和處理這種字體,利用這些函數可方便地對TrueType字符進行各種處理,如旋轉、變形等。

                  在TrueType字體中,字形輪廓是由一些直線和曲線的集合及一些對字體的描述信息所組成,這些直線和曲線定義了TrueType字體及符號的外形輪廓,而那些字體的描述信息則用來控制和調整直線的長度和曲線的形狀,主要用來調整字形輪廓尺寸,使用這些描述信息可對TrueType字體或符號在保持其原始形狀的情況下進行放大、縮小等處理。

                  Windows提供了許多函數來處理TrueType字體,其中與提取字形輪廓有關的最主要的函數為GetGlyphOutline,它可用來提取被選擇到指令設備環境(如內存、顯示設備等)的字符的輪廓或位圖。在Windows
                  API中,GetGlyphOutline函數聲明如下:
                  DWORD GetGlyphOutiline(
                  HDC hdc,∥設備環境的句柄
                  UINT uChar,∥所要查詢的字符
                  UINT uFormat,∥所要返回的數據類型
                  LPGLYPHMETRICS lpgm,∥指向字符規格結構的地址
                  DWORD cbBuffer,∥數據緩沖區的大小
                  LPVOLD lpvBuffer,∥數據緩沖區的地址
                  CONST MAT2*lpmat2,∥變換矩陣結構的地址);
                  其中的主要參數說明如下:
                  uChar:指定所要查詢的字符,對漢字來說是指漢字的編碼,如:GB-2312和Unicode等編碼。
                  uFormat:指定函數所要提取的數據的格式,可取下面一些值:GGO_ITMAP、GGO_NATIVE、GGO_METRICS、GGO_GRAY2_BITMAP、GGO_GRAY4_BITMAP、GGO_GRAY8_BITMAP。

                  對于提取字符的字形輪廓來說,由于只需得到字形輪廓的二值圖象,不用得到灰度圖象,因此uFormat參數可取兩個值:GGO_BITMAP、GGO_NATIVE。如取GGO_BITMAP,函數將返回字符的字形輪廓位圖;取GGO_NATIVE,函數將返回用來描述字符外形輪廓的曲線的點的數據,使用的單位是字體設計的單位,如uFormat參數取值為GGO_NATIVE,則任何lpmat2參數指定的變換矩陣將被忽略。由于可能需對提取出的字形輪廓作一定的變換處理(如:放大、縮小、旋轉及改變縱、橫比等),將參數uFormat的值設置為GGO_NATIVE。

                  調用GetGlyphOutline,函數將返回一系列的折線和樣條曲線,返回的折線和曲線的信息存儲在一個
                  TTPOLYGONHEADER結構及緊隨其后的多個TTPOLYCURVE結構中,這些信息主要為描述折線和曲線所需的點的坐標,要描述字形輪廓須使用這些信息。上述兩個結構中所有的點都以POINTFX結構形式返回,這些點描述的是絕對位置而不是相對位置。要描繪一個TrueType字符的字形輪廓,須同時使用折線和曲線。TTPOLYGONHEADER結構中的pfxStart成員返回字形的封閉輪廓的起始點,也是封閉輪廓的終止點。

                  下面對其中幾個重要的數據結構作簡要的說明。
                  其中,TTPOLYGONHEADER結構指定一個TrueType字符的字形輪廓的起始點及該輪廓的類型(直線或曲線)。其定義為:
                  typedef struct_TTPOLYGONHEADER{//ttph
                  DWORD cb;
                  DWORD dwType;
                  POINTFX PfxStart;
                  }TTPOLYGONHEADER,FAR.LPTTPOLYGONHEADER;
                  其中成員cb指定描述字形輪廓的TTPOLYGONHEADER結構和TTPOLYCURVE結構所需的字節數;dwType字符的輪廓類型;pfxStart指定輪廓的起始點。

                  TTPOLYCURVE結構中包含了TrueType字符中有關字形輪廓曲線的信息。其定義為:
                  typedef struct tagTTPOLYCURVE { // ttpc
                  WORD WType;
                  WORD Cpfx;
                  POINTFX apfx [1];
                  } TTPOLYCURVE,FAR*LPTTPOLYCURVE;
                  其中成員wType指定TTPOLYCURVE結構所描述的曲線類型,可有兩個取值;TT_PRIM_LINE和TT_PRIM_OSPLINE,分別代表曲線是折線和B樣條曲線;cpfx指定數組中POINTFX結構的數目;apfx指定一個確定折線或者B樣條曲線的POINTFX結構類型的數組。

                  POINTFX結構中包含用來描述TrueType字符字形輪廓的點的坐標,其定義為:
                  typedef struct tagPOINTFX { // ptfx
                  FIXED X;
                  FIXED Y;
                  } POINTFX,
                  其中X和Y分別代表點的橫、縱坐標。
                  在調用GetGlyphOutline函數得到描述字形輪廓的數據后,要將其描繪出來還需調用繪制直線和曲線的函數。一個TrueType字符由折線和二次樣條曲線描繪而成,調用GetGlyphOutline函數返回了描繪這些折線和曲線所需的點的有關信息,這些信息存儲在TTPOLYGONHEADER和TTPOLYCURVE結構中,根據其中的成員wType所指定的不同值,來調用Windows
                  API所提供的相關繪制折線和樣條曲線的函數,即可繪制出字符的字形輪廓。在繪制時還可根據需要對字形輪廓進行各種處理,如放大、縮小、旋轉及改變字符的縱橫比等。圖1顯示了采用以上方法提取的“電”字的字形輪廓。
                  
                  圖1 “電”字的字形輪廓
                  還有一個需解決的問題是如何獲得漢字編碼的問題。通常漢字是以字符串的形式輸入計算機的,要調用GetGlyphOutline函數得到某一漢字的字形輪廓,還須得到該漢字的編碼(一般指GB-2312編碼,在Windows
                  NT和Windows
                  2000下可使用Unicode編碼),用來指定GetGlyphOutline函數中的uChar參數,這就需進行由字符串到漢字編碼的轉換。下面給出了用Delphi實現的由漢字字符串到漢字的GB-2312編碼的轉換函數,該函數的輸入參數為字符串的形式的單個漢字,返回值為輸入參數漢字的GB-2312編碼。

                  function CodeConvert(s:string):interger;
                  begin
                  result:=ord(WORD(s[1]shl 8)+WORD(s[2]));
                  end;
                  3 字形輪廓二值圖象的轉化及其編輯處理
                  由于受線切割機所能切割圖形形狀的限制,即在不重新穿絲的情況下,只能切割一筆畫成的圖形;加上漢字數量眾多,字形千變萬化,且大多數漢字都不能一筆寫成,因此將漢字的字形輪廓提取出來后并不能直接用于切割,還需對其進行一定的編輯處理,使其符合線切割加工的需要,即把它變成能一筆寫成的切割軌跡。且實際應用中,多數情況下可能不是切割單個漢字而需一次切割多個漢字,這也要進行編輯處理。而要進行編輯處理,首先要將圖形轉化為圖象。還是以“電”字為例,在未經編輯處理時,在線切割機上只能切割出如圖2所示的不完整字形,在經過適當的編輯處理后,線切割機就可加工出如圖3所示的完整漢字的字形了。
                   

                  圖2 未經編輯處理時線切割機所能加工的“電”字字形輪廓
                  
                  圖3 編輯處理后線切割機所能加工的“電”字字形輪廓
                  因為我們只需標識字形的邊界輪廓,因此將其轉化為二值圖象即可。將字形輪廓轉化為二值圖象,也就是將其轉化為一個用矩陣表示的象素點圖象,矩陣中的每一位都是二進制數,當該位為1時表示字符的筆劃經過此位,該位為0時表示字符的筆劃不經過此位。因為只要分辨出某點為0還是1,因此每個點只要用一位二進制數表示即可,這樣1個字節就可以表示8個象素點,但為方便敘述本文采用以1個字節表示1個點來進行說明。

                  要將字形輪廓轉化為二值圖象,首先根據需要(如字體、尺寸大小、縱橫比、是否旋轉、變形等)在屏幕上繪制出所要切割字符的字形輪廓;然后對圖形進行掃描,將有筆劃通過的點(對應于與字符顏色相同象素的位)的值置為1,而其它的點則置為0,掃描完畢后便將字形輪廓轉化為二值圖象了。

                  生成二值圖象后還需對圖象進行適當的修改,以滿足線切割加工的需要。對圖象進行編輯處理,可用一個小方塊代替一個放大了的象素,通過建立網格編輯區,每一網格小方塊都是一個放大了的象素,這樣可對每個象素進行編輯處理,控制鼠標在相應的網格眼內填入字符或背景顏色,同時填入字符顏色所對應的位置為1,填入背景顏色所對應的位置為0。

                  4 切割指令的生成
                  將漢字的字形輪廓轉化為二值圖象且編輯處理后,為生成切割指令須用直線或圓弧對其進行描述,由于漢字字形較適合用直線來對其進行描述,因此采用直線段來實現對漢字字形的描述。

                  由于線切割機所能切割的圖形具有一定的特殊性(即需能以一筆畫完),因此只需采用某種算法對圖進行一次遍歷便可得到加工軌跡。
                  要對圖象進行遍歷,首先需確定搜索策略。由于能被切割的圖形具有特殊性,采用改進了的深度優先搜索方法來對圖象進行遍歷。主要思想為:先確定圖象的起始點,然后沿逆時針方向在該點周圍尋找下一點,找到后沿著這兩點確定的方向繼續搜索,直至將該方向上的點搜索完畢,然后回溯,以回溯得到的點為基礎重復以上搜索,直至所有點都被搜索過,在搜索過程中將經過的點的值從1置為0,同時記錄所經過的直線。

                  下面介紹一下所要用到的主要數據結構。
                  記錄直線所用結構為TLineRecord,它用來記錄每段直線的起點和終點坐標,其定義如下:
                  TLineRecord=record
                  StartPoint, EndPoint: TPoint; //直線起始點,終止點
                  end;
                  PLineRecord=^TLineRecord;
                  其中StartPoint, EndPoint分別為直線的起點和終點。
                  圖象采用二維數組進行表示,首先按照行、列從小到大的順序找到圖象的起始點,然后再采用逆時針方向來搜索下一點。搜索方向的定義為:
                  SearchDirection:array[0..7,0..1] of
                  interger=((1,0),(1,-1),(0,-1),(-1,-1),(-1,0),(-1,1),(0,1),(1,1));
                  遍歷算法如下:
                  (1)掃描圖象尋找起始點,將其坐標記為(k,1);用FirstPointX、FirstPointY記錄第一點橫、縱坐標的值;
                  (2)初始化記錄直線的指針,建立記錄直線的鏈表;將起始點的k,1值作為直線起點和終點的橫、縱坐標,將該直線加入到直線紀錄的鏈表中去;
                  (3)以第一點為基準點沿逆時針方向尋找下一點,如果搜索到值為1的點則記搜索方向為i,該點的橫、縱坐標記為(k,1),將記錄直線的終點橫、縱坐標設置為k,1;

                  (4)置是否搜索完畢標志SearchCompleted為False;
                  (5)如果SearchCompleted不為True則重復作6-13步;
                  (6)置SearchCompleted為True;
                  (7)置是否同一條線標志SameLine為True;
                  (8)如果SameLine為True則重復作9-12步;
                  (9)置SameLine為False;
                  (10)沿i方向進行搜索,即k:=k+SearchDirection [i][0];1:=1+SearchDirection [i][1];
                  (11)如果點(k,1)為1,則置SameLine為True;將直線的終點坐標設置為(k,1);將點(k,1)的值設置為0;
                  (12)如果點(k,1)為0,則置SameLine為False;
                  (13)以點(k,1)為基準點沿逆時針方向尋找下一點,如果搜索到值為1的點,則記搜索方向為i;在直線記錄列表中增加一條新的直線,k,1值作為直線起點的橫、縱坐標;將搜索到的點的橫、縱坐標記為(k,1),將直線終點的橫、縱坐標設置為(k,1);置Searhcompleted為False,置SameLine為True;將點(k,1)的值設置為0;

                  (14)進行圖形封閉化處理,在直線記錄列表中增加一條直線,將k,1值作為直線起點的橫、縱坐標,FirstPointX、FirstPointY作為直線終點的橫、縱坐標值。

                  這樣當遍歷完成后,遍歷的軌跡就保存在直線記錄列表中了,也就是說已實現將漢字的字形輪廓用直線段進行描述了。需指出的是,由于漢字字形本身或者編輯處理的原因,在進行圖象遍歷的過程中,可能存在一些不和諧的點,使遍歷不能完成(如存在斷點、尖點及多余點的情況),需在遍歷之前運用圖象處理的技術將這些點補足或者剔除掉,以使遍歷能順利完成,有關這方面的算法不再贅述。

                  至此要實現切割漢字就只剩下如何生成切割指令的問題了。由于已將漢字的字形輪廓用直線進行描述,且這些直線還首尾相接組成一個封閉輪廓,要生成線切割機的切割指令,只需按切割指令的要求將這些直線進行轉換即可。

            本文由中走絲,線切割機床,電解去毛刺,去毛刺設備-蘇州中航長風數控科技有限公司采集整理發布。
            更多線切割,穿孔機,電化學去毛刺文章資料請參考
            www.szcfedm.com www.zhchangfeng.com www.skwedm.com

          免責聲明:焊材網轉載作品均注明出處,本網未注明出處和轉載的,是出于傳遞更多信息之目的,并不意味 著贊同其觀點或證實其內容的真實性。如轉載作品侵犯作者署名權,或有其他諸如版權、肖像權、知識產權等方面的傷害,并非本網故意為之,在接到相關權利人通知后將立即加以更正。聯系電話:0571-87774297。
          0571-87774297  
          国产www在线观看