【正文】
, B 39。在窗體設(shè)計(jì)器中增加2個(gè)命令按鈕和2個(gè)文本框,文本框用于輸入小矩形的長(zhǎng)度和寬度。沿x軸方向劃分最小外接矩形 Dim j As Integer j = 1 p = Val() k = ( ) \ p sx(0) = Do While j = k sx(j) = sx(j 1) + p j = j + 1 Loop sx(j + 1) = 39。Do While k = j + 1 39。k = k + 1 39。沿y軸方向劃分最小外接矩形 Dim j1 As Integer j1 = 1 q = Val() k1 = ( ) \ q hx(0) = Do While j1 = k1 hx(j1) = hx(j1 1) + q j1 = j1 + 1 Loop hx(j1 + 1) = 39。Do While k1 = j1 + 1 39。k1 = k1 + 1 39。判斷小矩形在五邊形內(nèi)還是外有三種方法,現(xiàn)分別介紹如下:第一種方法是求交法。對(duì)于相交的那些線(xiàn),求出它們與五邊形的交點(diǎn),判斷這些交點(diǎn)是位于該中心點(diǎn)的兩側(cè)還是一側(cè),若交點(diǎn)位于中心點(diǎn)的兩側(cè),則該中心點(diǎn)位于五邊形內(nèi);若交點(diǎn)是位于中心的一側(cè)的話(huà),那么該中心點(diǎn)就不在五邊形內(nèi),即在五邊形外。圖 44 第二種方法是將五邊形的五條邊柵格化。如圖45所示。如果小矩形的中心點(diǎn)與五邊形的各個(gè)頂點(diǎn)連接組成的三角形的面積之和等于五邊形的面積,那么該中心點(diǎn)就位于五邊形內(nèi);如果小矩形的中心點(diǎn)與五邊形的各個(gè)頂點(diǎn)連接組成的三角形的面積之和不等于五邊形的面積,那么該中心點(diǎn)就位于五邊形外。如圖46所示,1號(hào)點(diǎn)位于多邊形的內(nèi)部,它與多邊形的各個(gè)頂點(diǎn)連接組成的三角形的面積之和等于多邊形的面積;而2號(hào)點(diǎn)位于多邊形的外部,它與多邊形各個(gè)頂點(diǎn)連接組成的三角形的面積之和不等于多邊形的面積。如圖47所示,2號(hào)雖然位于多邊形的內(nèi)部,但它與多邊形的各個(gè)頂點(diǎn)連接組成的三角形的面積之和并不等于多邊形的面積。圖 47這里為了對(duì)多邊形進(jìn)行填充用的是第三種方法,即面積法。用辛普森法求多邊形的面積 Dim j As Integer s = 0 Do While i 4 area1 = (your(i).y + your(i + 1).y) * (your(i).x your(i + 1).x) / 2 s = s + area1 i = i + 1 Loop area1 = (your(4).y + your(0).y) * (your(4).x your(0).x) / 2 s = s + area1 s = Abs(s) Do While j 4 39。求劃分得到的小矩形的中心坐標(biāo) j = 0 Do While j 50 zd(i, j).x = sx(i) + p / 2 zd(i, j).y = hx(j) + q / 2 j = j + 1 Loop i = i + 1LoopEnd SubPrivate Sub Command7_Click() Dim i As Integer, j As Integer, k As Integer, n As Integer i = 0 39。用三角形法求多邊形面積 Do While i 50 j = 0 Do While j 50 k = 0 m = 0 Do While k 4 bzc = (bc(k) + L(i, j, k) + L(i, j, k + 1)) / 2 mj(i, j, k) = Sqr(bzc * (bzc bc(k)) * (bzc L(i, j, k)) * (bzc L(i, j, k + 1))) m = m + mj(i, j, k) k = k + 1 Loop bzc = (bc(4) + L(i, j, 4) + L(i, j, 0)) / 2 mj(i, j, 4) = Sqr(bzc * (bzc bc(4)) * (bzc L(i, j, 4)) * (bzc L(i, j, 0))) m = m + mj(i, j, 4) mjz(i, j) = Abs(m) j = j + 1 Loop i = i + 1 LoopEnd Sub第五步:對(duì)位于多邊形內(nèi)部的小矩形進(jìn)行填充。對(duì)于有些小矩形,雖然它的中心點(diǎn)也位于多邊形的內(nèi)部,但是它到多邊形的一條邊的距離小于所要填充的小圓圈的半徑,這種情況下,這些小矩形不進(jìn)行填充,那么就需要判斷小矩形的中心點(diǎn)到多邊形的邊的距離是否大于所填小圓圈的半徑。填充圓 i = 0 Do While i 50 j = 0 Do While j 50 If Abs(s mjz(i, j)) Then k = 0 flag = 1 Do While k 5 If (2 * mj(i, j, k) / bc(k)) p / qp Then flag = 0 End If k = k + 1 Loop If flag = 1 Then Circle (zd(i, j).x, zd(i, j).y), p / qp End If End If j = j + 1 Loop i = i + 1 LoopEnd Sub運(yùn)行結(jié)果如圖48 圖 48 第三節(jié) 設(shè)計(jì)使用說(shuō)明書(shū)在VB中,建立應(yīng)用程序用戶(hù)界面,選擇“新建”工程,雙擊窗體的空白部分,進(jìn)入到代碼編輯窗口,單擊“對(duì)象”下拉列表框右邊的箭頭按鈕,從中選擇Form對(duì)象,在:“過(guò)程”下拉列表框中選擇MouseDown事件,再選擇Load事件,編寫(xiě)畫(huà)任意多邊形的代碼,如圖49。圖 410運(yùn)行程序,點(diǎn)擊“運(yùn)行”的圖標(biāo),在運(yùn)行界面依次點(diǎn)擊各控件按鈕,如圖411。結(jié) 束 語(yǔ)第一章主要介紹了有關(guān)VB的基礎(chǔ)知識(shí)。許多商用軟件公司為適應(yīng)這一趨勢(shì)推出了不少Windows環(huán)境下的軟件開(kāi)發(fā)工具,如Visual C++、Visual Basic、Borland C++、Delphi、PowerBuilder等等。 本章主要介紹了VB的基礎(chǔ)知識(shí),易為初學(xué)者理解、掌握、運(yùn)用。此次畢業(yè)設(shè)計(jì)的重點(diǎn)放在解決實(shí)際問(wèn)題上,所以本章主要介紹了VB中最常用到的功能,而不是面面懼到地介紹VB的所有功能。它們都采用“面向?qū)ο蟆本幊碳夹g(shù)的簡(jiǎn)化版—可視化編程。第二章主要介紹了有關(guān)符號(hào)的基本概念?,F(xiàn)實(shí)世界盡管形態(tài)各異,千變?nèi)f化,但是在空間資料抽象表達(dá)時(shí),將其分為點(diǎn)狀地物、線(xiàn)狀地物和面狀地物,因而表達(dá)地物的符號(hào)也相應(yīng)地有點(diǎn)狀符號(hào)、線(xiàn)狀符號(hào)和面狀符號(hào)。線(xiàn)狀符號(hào)是長(zhǎng)度依比例尺表示而寬度不依比例尺表示的符號(hào),用于表示呈線(xiàn)狀或細(xì)條帶狀延伸的地物。第三章主要介紹的是有關(guān)區(qū)域填充方面的知識(shí)。區(qū)域填充可以分為兩類(lèi):一類(lèi)是多邊形填充;一類(lèi)是種子填充。要完成多邊形的填充有許多方法,比如按掃描線(xiàn)順序,計(jì)算掃描線(xiàn)與多邊形的相交區(qū)間,再用要求的顏色或圖案顯示這些區(qū)間的像素,從而完成多邊形的填充。VB是所有的編程語(yǔ)言中比較容易掌握和理解的一門(mén)語(yǔ)言,所以我用VB來(lái)實(shí)現(xiàn)多邊形的填充。那么又如何判斷哪些小矩形在多邊形內(nèi)部,哪些在多邊形的外部?這個(gè)問(wèn)題可以這樣來(lái)解決:找出所有小矩形的中心點(diǎn),再用面積法來(lái)判斷哪些小矩形位于多邊形的內(nèi)部。以上就是多邊形填充的具體實(shí)現(xiàn)方法。像用面積法來(lái)判斷小矩形是否在多邊形內(nèi),就有缺陷。通過(guò)這次的畢業(yè)設(shè)計(jì),就掌握一門(mén)語(yǔ)言來(lái)講,我對(duì)VB的認(rèn)識(shí)有了更深的理解;就使用一種工具來(lái)講,我對(duì)使用VB更加得心應(yīng)手,在原有基礎(chǔ)上又上了一臺(tái)階;就對(duì)面狀符號(hào)的填充來(lái)講,我對(duì)如何實(shí)現(xiàn)這一過(guò)程的思想有了具體的了解。在此災(zāi)一次地感謝我的指導(dǎo)老師葛永慧教授的指導(dǎo)以及其他各位畢業(yè)設(shè)計(jì)指導(dǎo)老師的幫助及學(xué)友、師兄、師姐的幫助。葛老師淵博的學(xué)識(shí)、敏銳的思維、民主而嚴(yán)謹(jǐn)?shù)淖黠L(fēng)使學(xué)生受益非淺,并終生難忘。感謝我的學(xué)友和朋友對(duì)我的關(guān)心和幫助。求各頂點(diǎn)的最大、最小值 Do While i 5 If (your(i).X ) Then = your(i).X End If If (your(i).Y ) Then = your(i).Y End If If (your(i).Y ) Then = your(i).Y End If If (your(i).X ) Then = your(i).X End If i = i + 1 LoopEnd SubPrivate Sub Command2_Click() 39。畫(huà)最小外接矩形End SubPrivate Sub Command3_Click() Dim k As Integer 39。k = 0 39。Line (sx(k), )(sx(k), ) 39。LoopEnd SubPrivate Sub Command4_Click() Dim k1 As Single 39。k1 = 0 39。Line (, hx(k1))(, hx(k1)) 39。LoopEnd SubPrivate Sub Command5_Click() Dim i As Integer, area1 As Double 39。求多邊形各邊長(zhǎng)的長(zhǎng)度 bc(j) = Sqr((your(j).X your(j + 1).X) ^ 2 + (your(j).Y your(j + 1).Y) ^ 2) j = j + 1 Loop If j = 4 Then bc(4) = Sqr((your(4).X your(0).X) ^ 2 + (your(4).Y your(0).Y) ^ 2) End IfEnd SubPrivate Sub Command6_Click() Dim i As Integer, j As Integeri = 0Do While i 50 39。求小矩形中心到各頂點(diǎn)的距離 Do While i 50 j = 0 Do While j 50 n = 0 Do While n 5 L(i, j, n) = Sqr((your(n).X zd(i, j).X) ^ 2 + (your(n).Y zd(i, j).Y) ^ 2) n = n + 1 Loop j = j + 1 Loop i = i + 1 LoopEnd SubPrivate Sub Command8_Click() Dim bzc As Double Dim m As Double Dim k As Integer Dim i As Integer Dim j As Integer i = 0 39。填充圓 i = 0 Do While i 50 j = 0 Do While j 50 If Abs(s mjz(i, j)) Then k = 0 flag = 1 Do While k 5 If (2 * mj(i, j, k) / bc(k)) p / qp Then flag = 0 End If k = k + 1 Loop If flag = 1 Then Circle (zd(i, j).X, zd(i, j).Y), p / qp End If End If j = j + 1 Loop i = i + 1 LoopEnd SubPrivate Sub Form_Load() sum = 0End SubPrivate Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If sum = 4 Then 3