• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于.net平臺(tái)的圖形繪制系統(tǒng)實(shí)現(xiàn)的關(guān)鍵問題

      2012-04-29 00:44:03武利翻
      科技創(chuàng)新導(dǎo)報(bào) 2012年34期
      關(guān)鍵詞:曲線擬合

      武利翻

      摘 要:繪圖系統(tǒng)主要是實(shí)現(xiàn)各種標(biāo)準(zhǔn)圖形和任意線條圖形的繪制編輯和變換,其中標(biāo)準(zhǔn)圖形包括直線,多邊形,橢圓,各種曲線等。要實(shí)現(xiàn)它們的繪制和各種基本變換(編輯功能),其中最關(guān)鍵的問題是曲線的多邊形與曲線的擬合。

      關(guān)鍵詞:圖形繪制 曲線擬合 圖形編輯

      中圖分類號(hào):TP31 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1674-098X(2012)12(a)-00-02

      在企業(yè)計(jì)算領(lǐng)域,C#將會(huì)變成用于編寫“下一代窗口服務(wù)”應(yīng)用程序的主要語言。而GDI+是Windows 2000及以后版本的一個(gè)子系統(tǒng),同原有的GDI(圖形設(shè)備接口)一樣,主要負(fù)責(zé)對(duì)顯示器和打印機(jī)進(jìn)行管理。GDI+為我們提供了在編程時(shí)使用的應(yīng)用程序接口API(Application Programming Interface),通過這些API函數(shù),GDI+讓程序員在設(shè)計(jì)程序中不必考慮具體的顯示器或打印機(jī),直接使用由GDI+提供的類的方法便可以調(diào)用顯示器或打印機(jī),真正做到與設(shè)備無關(guān)?,F(xiàn)在大家通用的繪圖軟件有Photoshop,CAD等。而大部分繪圖軟件都是用C++,VB等語言編寫,而本軟件將用C#和GDI+方面知識(shí)[1]。

      本系統(tǒng)要求實(shí)現(xiàn)在顯示設(shè)備上進(jìn)行繪圖操作,其中繪圖操作是用代碼實(shí)現(xiàn)的,而不是有一些預(yù)定義的控件或?qū)υ捒騺韺?shí)現(xiàn),其實(shí)這就是GDI+的實(shí)質(zhì)[2]。GDI+是一個(gè)功能強(qiáng)大的工具,有許多.NET 基類都可用于在設(shè)備上繪圖。繪圖系統(tǒng)中要進(jìn)行各種工具的選擇。選擇工具以及完成繪畫功能如畫筆,畫直線、畫矩形、畫圓橢圓,命名與擦除都是在swich語句中進(jìn)行的。這里不重點(diǎn)介紹,重點(diǎn)介紹多邊形與曲線擬合。這部分實(shí)現(xiàn)過程比較難,這部分都用到了動(dòng)態(tài)數(shù)組。

      1 多邊形的實(shí)現(xiàn)

      實(shí)現(xiàn)繪制任意多邊形的功能。選擇繪圖工具項(xiàng)中的繪制多邊形,當(dāng)用戶在繪圖區(qū)域用鼠標(biāo)左鍵點(diǎn)擊時(shí),動(dòng)態(tài)數(shù)組將記錄各個(gè)點(diǎn)的位置,鼠標(biāo)松開時(shí)程序判斷用戶輸入點(diǎn)的數(shù)目,當(dāng)輸入數(shù)目大于等于兩個(gè)時(shí)進(jìn)行相鄰兩個(gè)點(diǎn)的連接,根據(jù)程序提示用戶完成時(shí)點(diǎn)擊鼠標(biāo)右鍵。實(shí)現(xiàn)工程具體如下。

      鼠標(biāo)按下時(shí)添加動(dòng)態(tài)數(shù)組元素,

      points.Add(new Point(e.X,e.Y));

      鼠標(biāo)松開判斷并進(jìn)行繪圖,算法主要用到方法如下:

      g.DrawLines(new Pen(foreColor,n),pointArray);

      ig.DrawLines(new Pen(foreColor,n),pointArray);

      點(diǎn)擊鼠標(biāo)右鍵時(shí)結(jié)束繪制同時(shí)釋放動(dòng)態(tài)數(shù)組。

      2 曲線擬合的實(shí)現(xiàn)

      曲線擬和算法設(shè)計(jì),是本次設(shè)計(jì)的最重要的部分,算法的主要思想如下:

      要使整個(gè)曲線處處光滑,必須是所有的銜接點(diǎn)兩側(cè)斜率相等[3]。做法如下:首先對(duì)繪圖面上三個(gè)點(diǎn)即點(diǎn)1,點(diǎn)2,點(diǎn)3用一條光滑的二次曲線進(jìn)行擬和,畫出點(diǎn)1到點(diǎn)3的一段曲線,并求出點(diǎn)3在本坐標(biāo)系下的斜率。再在繪圖面上再點(diǎn)擊一個(gè)點(diǎn)4,并針對(duì)后三個(gè)點(diǎn)進(jìn)行坐標(biāo)變換,然后在變換的坐標(biāo)系下用三次曲線進(jìn)行擬和,用2,點(diǎn)3和點(diǎn)4的坐標(biāo)和點(diǎn)3的斜率確定一條光滑的三次曲線,畫出點(diǎn)3到點(diǎn)4的一段曲線,并計(jì)算出點(diǎn)4的斜率。再點(diǎn)擊一個(gè)點(diǎn),依照上面的方法繼續(xù)進(jìn)行坐標(biāo)變換和三次曲線進(jìn)行擬和,畫出最后兩點(diǎn)間的一段曲線,每次都要用前次的斜率并計(jì)算新加入點(diǎn)的斜率。重復(fù)加入新點(diǎn),畫出最后兩點(diǎn)間的一段曲線,直到最后一個(gè)點(diǎn)[4]。

      擬和部分:

      已知:三點(diǎn)坐標(biāo)(X1,Y1),(X2,Y2),(X3,Y3),Y2'

      用三次曲線 A X13 + B X2 + C X + D = Y 擬和,代入三點(diǎn)坐標(biāo)和Y2' 得:

      A X13 + B X12 + C X1 + D = Y1

      X23 + B X22 + C X2 + D = Y2

      X33 + B X32 + C X3 + D = Y3

      3 A X22 +2 B X2 + C = Y2'

      以A、B、C、D為變?cè)蠼獯朔匠探M,得A、B、C、D的值,從X2到X3畫出三次曲線 A X3 + B X2 + C X + D = Y,求出X3點(diǎn)的斜率

      3 A X32 +2 B X3 + C

      此部分算法主要如下:

      g.DrawCurve(new Pen(foreColor,n),pointArray);

      ig.DrawCurve(new Pen(foreColor,n),pointArray);

      points1 = new ArrayList();

      坐標(biāo)變換部分:

      坐標(biāo)變換引入了對(duì)矩陣對(duì)象的支持,矩陣是變換的核心,在繪制圖形時(shí),定義圖位置相當(dāng)重要。GDI+中使用三種坐標(biāo)系來表示位置信息:世界坐標(biāo)、頁面坐標(biāo)、設(shè)備坐標(biāo)。

      本部分所說的坐標(biāo)變換是指從頁面坐標(biāo)到頁面坐標(biāo)的變換,即重新設(shè)置頁面坐標(biāo),而且坐標(biāo)原點(diǎn)、X軸、Y軸都要變換。實(shí)現(xiàn)坐標(biāo)變換的過程是:取數(shù)組的后兩個(gè)元素,即后兩個(gè)點(diǎn)連成一條直線且直線作為X軸,通過新加入的點(diǎn)向直線做垂線,并設(shè)置其交點(diǎn)為新的原點(diǎn),垂線作為Y軸。示意圖如圖1。

      圖1 坐標(biāo)變換示意圖

      坐標(biāo)變換過程要用到平移變換和旋轉(zhuǎn)變換:平移變換,假設(shè)有一個(gè)點(diǎn)A,其坐標(biāo)為(x,y),對(duì)A點(diǎn)進(jìn)行平移變換(以dx,dy做為在水平和垂直方向的變化量)的結(jié)果是A點(diǎn)的新坐標(biāo)(x1,y1)為:x1=x+dx,y1=y+dy.用到的相應(yīng)的變換矩陣為:

      旋轉(zhuǎn)變換,假設(shè)有一個(gè)點(diǎn)A,其坐標(biāo)為(x,y),對(duì)A點(diǎn)進(jìn)行旋轉(zhuǎn)(角度為a),轉(zhuǎn)換結(jié)果是,點(diǎn)的新坐標(biāo)(x1,y1)為:

      x1=x*cos(a)+y*sia(a),y1=x*sia(a)+y*cos(a).

      旋轉(zhuǎn)變換對(duì)應(yīng)的變換矩陣為:

      坐標(biāo)變換的結(jié)果都體現(xiàn)在矩陣變換的疊加上。

      主要代碼如下:

      Matrix myMatri = new Matrix();

      myMatrix.Rotate(30.0f)//旋轉(zhuǎn)30度

      myMatrix.Translate(1.0f,2.0f,MatrixOrder.Append);

      //垂直方向上放大兩倍

      …………………

      myMatrix.Translate(5.0f,0.0f,MatrixOrder.Append);

      //水平方向上平移5個(gè)單位

      參考文獻(xiàn)

      [1] 駱開華,李紹強(qiáng).在.NET中使用X mL的安全性研究[J].科技信息,2010(17).

      [2] 田原.VB.NET繪圖功能研究[J].軟件導(dǎo)刊,2005(22).

      [3] 王雪,晉浩.NET中繪圖控件的編程技術(shù)與實(shí)現(xiàn)[J].電腦知識(shí)與技術(shù)(學(xué)術(shù)交流),2006(36).

      [4] 王美瓊.用VB編程繪制圖形的方法和技巧[J].考試周刊,2009(49).

      猜你喜歡
      曲線擬合
      高精度傳感器溫度漂移補(bǔ)償分析與研究
      葉輪類零件多軸數(shù)控機(jī)床加工的誤差控制與優(yōu)化——基于NURBS曲線擬合優(yōu)化方案
      Optimization Design of Miniature Air Quality Monitoring System Based on Multi-Sensor Fusion Technology
      不同階曲線擬合擾動(dòng)場(chǎng)對(duì)下平流層重力波氣候特征影響研究*
      基于MATLAB 和1stOpt 的非線性曲線擬合比較
      淺談Lingo 軟件求解非線性曲線擬合
      曲線擬合的方法
      基于曲線擬合的投棄式剖面儀電感量算法
      Matlab曲線擬合工具箱在地基沉降預(yù)測(cè)模型中的應(yīng)用
      Matlab曲線擬合法在地基沉降預(yù)測(cè)中的應(yīng)用
      金寨县| 玛曲县| 文安县| 安丘市| 贡嘎县| 昌宁县| 沙田区| 双鸭山市| 平阴县| 塘沽区| 拜泉县| 霍州市| 江城| 新安县| 宝坻区| 特克斯县| 左云县| 雅江县| 滨海县| 汉川市| 博白县| 平山县| 武夷山市| 栾城县| 长沙县| 南丰县| 眉山市| 汶上县| 长海县| 沧源| 噶尔县| 耿马| 缙云县| 雅安市| 永泰县| 忻城县| 临安市| 高青县| 九龙县| 临泉县| 通渭县|