語言課設圖形設計程序_第1頁
語言課設圖形設計程序_第2頁
語言課設圖形設計程序_第3頁
語言課設圖形設計程序_第4頁
語言課設圖形設計程序_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領

文檔簡介

/書目摘要 11. 方案選擇 11.1字符構(gòu)成圖形 21.2在圖片模式下干脆導入相關圖形的圖片 21.3在圖片模式下接受計算求點寫像素的方法繪圖 21.4在圖片模式下接受鼠標繪圖 22. 編程思想 23. 程序設計 23.1 主程序設計 23.2矩形子程序設計 33.3三角形子程序設計 43.3圓形子程序設計 43.4公共運用子程序設計 54. 硬件原理 55. 調(diào)試結(jié)果 5結(jié)束語 6參考文獻 6附錄1 7附錄2宏文件 21

摘要本繪圖程序人機交互性好,可以便利的調(diào)整矩形,三角,圓的大小和形態(tài)。在接受bresenham算法提高了運行速度同時,圖形的顯示方法是接受寫像素的方法定位精確軌跡平滑。同時還增加了動態(tài)顯示效果,可以直觀的看到像素點的移動。程序在編譯之后只有2KB大小占用內(nèi)存小運算快速。關鍵字:繪圖動態(tài)顯示隨意大小計算機圖形顯示軟件設計方案選擇1.1字符構(gòu)成圖形 在圖形由字符構(gòu)成時,屏幕的顯示模式為為文字型。編程簡潔但是圖像質(zhì)量和交互性很差1.2在圖片模式下干脆導入相關圖形的圖片 程序較易實現(xiàn),顯示的效果特殊好。但是圖片在取模之后很大,在讀取像素寫像素時較慢。交互性也不好1.3在圖片模式下接受計算求點寫像素的方法繪圖 程序編程困難,算法困難。繪圖效果較好,程序很靈敏可以顯示各種形態(tài)大小的三角,矩形和圓。交互性很好而且還可以變更顏色,添加動態(tài)顯示,實現(xiàn)圖像移動等效果。1.4在圖片模式下接受鼠標繪圖 程序的交互性很好,可以很便利的確定圖形繪制的位置和大小。但是編程太困難,查閱了有關資料。是運用dos中斷來調(diào)用鼠標,之后對鼠標跟蹤限制。 在綜合比較之下,程序的性能是首要考慮的指標。方案三和方案四比起來較易編寫一些。所以最終接受的是方案三。編程思想 在程序設計時接受先整體再分塊,模塊化編程的思想。首先整體設計出程序的框架,寫好主程序。再分模塊寫好各個子函數(shù)。調(diào)試好一個功能后再去編寫下一個模塊。主函數(shù)的主體是一個分支選擇程序。包含了三個繪圖模塊圓,三角,矩形的數(shù)據(jù)定義和分支入口程序段。而三個繪圖子模塊中又各自包含了若干子函數(shù)。同時為了使程序緊湊,還編寫了一些各個子模塊公共運用的子函數(shù)。程序概要框架圖如下 圖1:程序概要框架圖程序設計3.1 主程序設計主程序主體是一個分支選擇程序,包含了提示菜單,輸入部分和選擇部分。接受MOVAH,9INT21H中斷在屏幕上輸出提示信息。MOVAH,1INT21H從鍵盤輸入一個字符將它的存在AL中再和1,2,3,q相比較跳轉(zhuǎn)到響應的子函數(shù)入口程序段中。同時還設計了檢驗輸入的程序段再輸入不為1,2,3q,時將自動跳轉(zhuǎn)提示重新輸入。圖2:主程序流程圖3.2矩形子程序設計在矩形子程序中接受寫像素點的方法,點動成線將四條線一條一條的畫出來。首先提示輸入信息輸入矩形的長和寬。調(diào)用一個輸入函數(shù)將輸入數(shù)據(jù)以16進制的方式存入AX中,再轉(zhuǎn)存到L_S,W_S中。之后將屏幕的模式設為圖像模式640*480*16色,將長和寬一次存入CX中接受循環(huán)LOOP指令。保持X不變Y依次增加或者Y不變X依次增加將四條直線一一畫出。同時為了使顯示效果更好一些對線條進行了加粗,寬度為兩個像素。為了使程序結(jié)構(gòu)清晰編寫了WRITE_PIXEL宏指令,每調(diào)用一次就畫出一個點。而且可以認為的設定點的位置顏色等。在函數(shù)中還加入了延時子程序,每畫完一個點之后就調(diào)用一個延時子程序。這樣就可以在屏幕上實現(xiàn)動態(tài)顯示。在這部分的程序設計中也是接受模塊化的思想,先畫出一條直線。變更參數(shù)就可以畫出另外的三條直線。同時在屏幕模式設定時也編寫宏指令SETMODE。調(diào)用的宏指令如下WRITE_PIXELMACROPAGE1,ROW,COLUMN,COLOR MOVAH,0CH MOVAL,COLOR MOVBH,PAGE1 MOVDX,ROW MOVCX,COLUMN INT10H ENDMSETMODEMACROMODE1 MOVAH,0 MOVAL,MODE1 INT10H ENDM子程序流程圖如下圖3:矩形子程序流程圖3.3三角形子程序設計 在三角形繪制中程序也分為幾個部分,首先是三個頂點的輸入子程序。然后將三個頂點壓棧,再調(diào)用Bresenham畫線子程序。在Bresenham畫線子程序中依次調(diào)用寫像素子程序和延時子程序?qū)崿F(xiàn)三條線段的動態(tài)顯示。 三角部分整體程序框架圖如圖4:三角子程序框架圖Bresenham畫線算法是繪制三角形的核心程序,分析如下Bresenham算法是計算機圖形學中為了“顯示器(屏幕或打印機)系由像素構(gòu)成”的這個特性而設計出來的算法,使得在求直線各點的過程中全部以整數(shù)來運算,因而大幅度提升計算速度。Bresenham算法是計算機圖形學領域運用最廣泛的直線掃描轉(zhuǎn)換方法。其原理是過各行、各列像素中心構(gòu)造一組虛擬網(wǎng)格線,按直線從起點到終點依次計算直線各垂直網(wǎng)格線的交點,然后確定該列像素中和此交點最近的像素。該算法的優(yōu)點在于可以接受增量計算,使得對于每一列,只要檢查一個誤差項的符號,就可以確定該列所求的像素。例如對于直線方程Y=kX+b;A:0<K<1時候的算法

1:輸入線段的兩個端點Point1和Point2,并且存儲到Point1(x1,y1)和Point2(x2,y2)中;

2:將Point1載入楨緩存,繪畫第一個起始點;

3:計算常量△x、△y、2△y和2(△y-△x),并且獲得一個決策參數(shù)的第一個值:P=2△y-△x;

4:從n=0起先,在沿線經(jīng)過每個Xn處,進行下面的檢測:

假如Pn<0,下一個點繪制的是(Xn+1,yn),并且Pn+1=Pn+2△y假如P0>=0,下一個點繪制的是(Xn+1,Yn+1),并且Pn+1=Pn+2(△y-△x)

5:重復執(zhí)行△x-1次步驟4;B:斜率k=1或斜率k=0時候的算法

對于斜率等于0或者斜率等于1時候,不須要通過算法干脆的對于其中單一坐標變量進行處理。C:斜率k<0的狀況算法將起始點和中止點坐標Point1和Point2交換,可以轉(zhuǎn)化到斜率為0和1之內(nèi)的算法去實現(xiàn)。3.3圓形子程序設計圖5:圓形子程序框架圖在圓繪制模塊中同樣是接受Bresenham畫線算法。先由鍵盤輸入圓半徑,再設置成圖形模式。在調(diào)用圓Bresenham子程序?qū)⑾嚓P點堆棧,然后再調(diào)用圓畫點子程序在屏幕上下左右四個點上向兩邊同時起先畫點。每畫一個點就調(diào)用一下延時子程序?qū)崿F(xiàn)繪圖的動態(tài)顯示。3.4公共運用子程序設計為了使程序結(jié)構(gòu)較清晰,將三個子模塊和主函數(shù)共同運用的子函數(shù)統(tǒng)一編寫。它們是數(shù)據(jù)輸入子函數(shù)READ可以講鍵盤輸入的數(shù)據(jù)轉(zhuǎn)化為16進制存在AX中。在各個子函數(shù)的數(shù)據(jù)輸入模塊都是調(diào)用的這個子函數(shù)。還有寫像素子函數(shù)PIXEL。它的作用是把經(jīng)過Bresenham算法堆棧的數(shù)據(jù)用寫像素的方法寫在屏幕上。延時子函數(shù)DELAY它的作用是延時使圖像動態(tài)顯示。清屏CLEAR它的作用是調(diào)背景色清屏。便于在圖形模式和文字模式之間進行轉(zhuǎn)換。在其中的延時子程序接受了雙層循環(huán)的方法,因為各個子程序運行用時不同為了便于調(diào)試和取得更好的效果。不同的子模塊對應不同的延時子程序。硬件原理顯示器有字符顯示模式和圖形顯示兩種工作方式在圖形方式下的屏幕由一個一個的像素做成。通過讀寫屏幕上的各個像素就可以顯示出各種各樣的圖形。 在匯編語言中供應了多種圖形顯示模式。設置模式的方法是:AL=模式號,AH=00H,然后通過BIOS功能調(diào)用INT10H來實現(xiàn)。 表1常見的圖形顯示模式顯示模式號辨別率色調(diào)數(shù)適用顯卡0DH320*20016EGAVGAOEH640*20016EGAVGA0FH640*3502EGAVGA10H640*35016EGAVGA11H640*4802MCGAVGA12H640*48016VGA13H320*200256MCGAVGAVGA顯卡上256KB顯存,被劃分為4個64KB的位平面。比如屏幕上像素的位置是(X,Y),則改像素在顯存位平面中字節(jié)地址的計算公式為:字節(jié)地址=A0000H+Y*(640/8)+XMOD8(屏幕中有640列,每字節(jié)8位)調(diào)試結(jié)果圖6:主菜單截屏矩形繪制輸入長168,寬100圖7:矩形截屏三角形輸入圖8:三角形截屏圖9:圓形截屏結(jié)束語這次的微機課設用的時間很久,從接到題目分析。到后來的程序編寫調(diào)試費了很多的功夫。收獲很多,一方面是專業(yè)學問。計算機怎么來顯示圖形,顯存是怎么工作的。怎樣將內(nèi)容干脆寫到內(nèi)存中在屏幕上反映出來。對這些學問有了更深化的了解,同時對于分支選擇程序。子程序的調(diào)用壓棧出棧斷點愛惜有了更深化的理解。在程序就要調(diào)試完成的時候突然發(fā)覺了一個致命的錯誤。畫完圓之后無法再畫矩形。為了排查這個問題花了好長的時間始終沒有解決。后來經(jīng)過請教同學和細致的思索后發(fā)覺。在畫圓程序中運用過CX,而在畫矩形時矩形的大小是由CX來確定的。雖然前面加入了壓棧出棧,但是CX值已經(jīng)被變更了。再寫入數(shù)據(jù)后只是把低位覆蓋高位照舊是有數(shù)據(jù)的。就造成了程序的錯誤。類似這樣的錯誤還有很多。調(diào)試程序的過程也是一個不斷檢測錯誤不斷反思的過程。而且通過這次課設更是深化的體會到匯編語言做為底層語言在速度和大小方面有著很強的優(yōu)勢。程序很小但是運行速度很快,功能能夠?qū)崿F(xiàn)的或很多。更重要的是可以干脆的限制計算機的硬件。在另一方面的收獲就是愛好或許在一起先時是很重要的,之后讓人堅持下去的就是克服困難的志氣和決心。為了讓程序的功能更加的多樣化,我嘗試著在其中添加各種各樣的子程序。大部分的想法都實現(xiàn)了,可以畫出隨意的三角,矩形和圓。但是原本設想的圖形移動和加入聲音因為時間的緣由沒有再做。算是一點缺憾吧。在這次課設中自己也犯了一個錯誤,寫比較大的程序時最好是和別人分工合作。相互探討這樣做的會更加完備一些,特殊是在程序調(diào)試時有人協(xié)商一下是很好的可以發(fā)覺一些自己不簡潔發(fā)覺的問題和錯誤。在這方面因為其他人想做別的題目所以沒有這么做。總的來說收獲很多,想起了以前上的一門選修課。夏老師講的先整體再部分來設計系統(tǒng)。還有對問題的思索方法在這次課設中讓我少走了很多彎路。參考文獻新編匯編語言程序設計,楊文顯微機原理和接口技術(shù),周佩玲80X86匯編語言程序設計,王元珍匯編程序三角形畫法,李永飛附錄1主序代碼部分INCLUDEYLIB.HDATASSEGMENT ;*********************************************** ;主函數(shù)菜單運用的提示字符串 ;***********************************************MESS1DB0DH,0AH,MESS2DB0DH,0AH,"Pleaseinputanumber(1--3)tochoseaprogram:$"MESS3DB0DH,0AH,"Press1todrawasquareness$"MESS4DB0DH,0AH,"Press2todrawatriangle$"MESS5DB0DH,0AH,"Press3todrawacircle$"MESS6DB0DH,0AH,"Yourchoice:$" MESS7DB0DH,0AH,"Press0tomainmeue,pressqtoquit:$" MESS8DB0DH,0AH,"sorry!Inputerroe.$" MESS9DB0DH,0AH,"Pressqtoquit$" ;*********************************************** ;各個子函數(shù)公共運用的數(shù)據(jù)定義部分 ;*********************************************** COLORDW02 BKCOLORDW0 ;黑色為0 BUFFERDB6,?,6DUP(?);輸入函數(shù)暫存buffer C10DW10 ;*********************************************** ;圓用的數(shù)據(jù)段定義和提示語 ;*********************************************** MESS1_CDB0DH,0AH,"Pleaseinputtheradius(1--200):$" OL_CDB? ;保存原來屏幕格式用 XDW280 ;圓心位置 YDW240 RADIUSDW150 ;半徑長度 ;*********************************************** ;矩形用的數(shù)據(jù)段定義和提示字符串 ;*********************************************** OL_SDB? ;矩形的原來圖像模式 X_SDW50 ;矩形的起始坐標 Y_SDW50 ;矩形的起始坐標 L_SDW? W_SDW? COLOR_SDB2 MESS1_SDB0DH,0AH,"Pleaseinputthelength(1--500):$" MESS2_SDB0DH,0AH,"Pleaseinputthewidth(1--500):$" MESS3_SDB0DH,0AH,"Press0tomainmenu,1todrawagain,otherkeytoquit.$" ;*********************************************** ;三角用的數(shù)據(jù)段定義和提示字符 ;*********************************************** POINTDB24,?,24DUP(?) OL_TDB?MESS1_TDB0DH,0AH,"Pleaseinputthefristpoint$" MESS2_TDB0DH,0AH,"Pleaseinputthesecondpoint$" MESS3_TDB0DH,0AH,"Pleaseinputthethirdpoint$" MESS5_TDB0DH,0AH,"X:$" MESS6_TDB0DH,0AH,"Y:$" MESS7_TDB0DH,0AH,"Inputerror$" DATASENDSSTACKSSEGMENT DW100DUP(0)STACKSENDSCODESSEGMENTASSUMECS:CODES,DS:DATASSTART:MOV AX,DATASMOV DS,AX LEA DX,MESS1 MOV AH,9 INT 21H;***********************************************;顯示主菜單提示字符串;*********************************************** DISPLAY: LEA DX,MESS2 MOV AH,9 INT 21H LEA DX,MESS3 MOV AH,9 INT 21H LEA DX,MESS4 MOV AH,9 INT 21H LEA DX,MESS5 MOV AH,9 INT 21H LEA DX,MESS9 MOV AH,9 INT 21H LEA DX,MESS6 MOV AH,9 INT 21H;***********************************************;主菜單選擇部分;*********************************************** INPUT: MOV AH,1 INT 21H CMP AL,'1' JB DISPLAY JE SQUAR CMP AL,'2' JE TRIA CMP AL,'3' JE CRIC CMP AL,'q' JE OUTPUT JMP DISPLAYSQUAR: ;矩形子程序的入口部分 CALL SQUAR_P JMP OUTPUTTRIA: ;三角子程序的入口部分 CALL TRIA_P JMP OUTPUTCRIC: ;圓形子程序的入口部分 CALL CRIC_P JMP OUTPUTOUTPUT: ;退出程序段 MOV AH,9 INT 21H MOV AH,4CHINT 21H;***********************************************;方塊繪制子程序段;***********************************************SQUAR_PPROCNEAR PUSH CXLONG: ;輸入矩形的長度部分 LEA DX,MESS1_S MOV AH,9 INT 21H XOR AX,AX CALL READ ;調(diào)用輸入子函數(shù)數(shù)據(jù)放在AX CMP AX,0 JB LONG_ER CMP AX,01F4H JA LONG_ER MOV WORDPTR[L_S],AX JMP WIDTH_S LONG_ER: ;在輸入錯誤時的程序段 CALL INPUT_ER JMP LONGWIDTH_S: ;輸入矩形的寬度部分 LEA DX,MESS2_S MOV AH,9 INT 21H XOR AX,AX CALL READ ;調(diào)用輸入子函數(shù)數(shù)據(jù)放在AX CMP AX,0 JB WIDTH_ER CMP AX,01F4H JA WIDTH_ER MOV WORDPTR[W_S],AX MOV AH,0FH INT 10H MOV OL_S,AL SETMODE12H ;設置640*480*16圖形模式 XOR CX,CX ;將CX清零,防止干擾 MOV CX,WORDPTR[L_S] MOV DX,Y_S JMP L1_SWIDTH_ER: ;在輸入錯誤時的程序段 CALL INPUT_ER JMP WIDTH_S L1_S: ;畫第一條直線 PUSHCX ;壓棧愛惜 WRITE_PIXEL0,Y_S,X_S,COLOR_S;調(diào)用寫像素的宏叮囑 CALL DELAY_S ;延時實現(xiàn)動態(tài)效果 INC X_S POP CX LOOP L1_S ;循環(huán)畫點 XOR CX,CX MOV CX,WORDPTR[W_S] ;將寬度存入CXL2_S: PUSH CX ;畫其次條直線 WRITE_PIXEL0,Y_S,X_S,COLOR_S CALL DELAY_S INC Y_S POP CX LOOP L2_S XOR CX,CX MOV CX,WORDPTR[L_S]L3_S: ;畫第三條直線 PUSH CX WRITE_PIXEL0,Y_S,X_S,COLOR_S CALL DELAY_S DEC X_S POP CX LOOP L3_S XOR CX,CX MOV CX,WORDPTR[W_S]L4_S: ;畫第四條直線 PUSH CX WRITE_PIXEL0,Y_S,X_S,COLOR_S CALL DELAY_S DEC Y_S POP CX LOOP L4_S MOV AH,0 INT 16H MOV AH,0 MOV AL,OL_S ;復原原來屏幕格式 INT 10H LEA DX,MESS3_S ;提示菜單信息 MOV AH,9 INT 21H MOV AH,1 INT 21H CMP AL,'1' JE LONG CMP AL,'0' JE DISPLAY CMP AL,'q' JE OUTPUT POP CX JE OUTPUT RETSQUAR_PENDP;***********************************************;三角繪制子程序;***********************************************TRIA_PPROCNEAR PUSH CX CALL INPUT_TMOV AH,0FH INT 10H MOV OL_T,AL ;保存原來屏幕格式,用來復原的 MOV AX,0A000H ;顯存 MOV ES,AX SETMODE12H ;設置640*480*16圖形模式???? LEA SI,POINT NEXT: MOV AX,0012H INT 10H MOV AL,2 CALLSET_WRITE_MODE MOV AX,BKCOLOR CALL CLEAR ;將背景清成黑色 CALL OUTPUT_T ;調(diào)用輸出子函數(shù)MOV AH,0 INT 16H MOV AH,0 MOV AL,OL_T INT 10H LEA DX,MESS3_S ;提示菜單 MOV AH,9 INT 21H MOV AH,1 INT 21H CMP AL,'0' JE DISPLAY CMP AL,'q' POP CX JE OUTPUT RETTRIA_PENDP;***********************************************;圓繪制子程序;***********************************************CRIC_PPROCNEAR MOV AX,DATAS MOV DS,AXINPUT_C: ;半徑輸入程序段 LEA DX,MESS1_C MOV AH,9 INT 21H CALL READ CMP AX,0 JB RADIUS_ER CMP AX,0C8H JA RADIUS_ER MOV WORDPTR[RADIUS],AX JMP NEXT_CRADIUS_ER: ;輸入錯誤時提示 CALL INPUT_ER JMP INPUT_C NEXT_C: MOV AH,0FH INT 10H MOV OL_C,AL ;保存原來屏幕格式,用來復原的 MOV AX,0A000H ;顯存 MOV ES,AX SETMODE12H INT 10H ;設置640*480*16圖形模式???? MOV AL,2 CALL SET_WRITE_MODE ;將寫模式設為寫模式2 MOV AX,BKCOLOR CALL CLEAR ;將背景清成黑色 MOV AX,WORDPTR[X] ;將圓心坐標和半徑壓棧 PUSH AX MOV AX,WORDPTR[Y] PUSH AX MOV AX,WORDPTR[RADIUS] PUSH AX CALL CIRCLE ;調(diào)用畫圓子程序 MOV AH,0 ;復原成文本格式的 INT 16H MOV AH,0 MOV AL,OL_C INT 10H LEA DX,MESS7 ;提示菜單 MOV AH,9 INT 21H MOV AH,1 INT 21H CMP AL,'0' JE DISPLAY CMP AL,'q' JE OUTPUT RETCRIC_PENDP;***********************************************;畫像素點子程序;***********************************************PIXELPROC PUSH BP ;壓棧愛惜 PUSH BX PUSH CX PUSH DS MOV BP,SP MOV AX,80 MOV BX,WORDPTR[BP+12];BX<=Y MUL BX ;(DX:AX)<=80*Y MOV BX,AX MOV AX,WORDPTR[BP+14];AX<--X MOV CL,8 DIV CL ;AL<=商(X/8),AH<=余數(shù)(X%8)SP->|| MOV CL,AH ;CL<=AH|DS|<-BP MOV AH,0 ;|CX|<-BP+2 ADD BX,AX ;BX(OFFSET)<=80*Y+X/8|BX|<-BP+4 MOV AL,80H ;|BP|<-BP+6 SHR AL,CL ;AL(MASK)<=(80H>>CL)|返回地址|<-BP+8 PUSH AX ;|COLOR|<-BP+10 MOV DX,3CEH ;|Y|<-BP+12 MOV AL,8 ;|X|<-BP+14 OUT DX,AL MOV DX,3CFH ;PIXEL堆棧結(jié)構(gòu) POP AX OUT DX, MOV AL,ES:[BX] MOV AX,WORDPTR[BP+10];AX<=COLOR MOV BYTEPTRES:[BX],AL POP DS POP CX POP BX POP BP RET 6PIXELENDP;***********************************************;清屏函數(shù);***********************************************CLEARPROCNEAR MOV BX,0 CLR1: MOVES:[BX],AL ;ES中放的是顯存的地址 INC BX CMP BX,9600H ;80*480 JNB CLR2 JMP CLR1 CLR2:RET CLEARENDP;***********************************************;Bresenham算法實現(xiàn)的畫圓函數(shù);***********************************************CIRCLEPROCNEAR PUSH BP MOV BP,SP SUB SP,6 MOV WORDPTR[BP-2],0 ;X<=0|| MOV AX,WORDPTR[BP+4] ;|| MOV WORDPTR[BP-4],AX ;Y<=RSP->|| MOV AX,0FFFEH ;|P|<-BP-6 IMUL WORDPTR[BP+4] ;AX<=RADIUS*(-2)|Y|<-BP-4 ADD AX,3 ;AX<=3-2*RADIUS|X|<-BP-2 MOV WORDPTR[BP-6],AX ;P=3-2*RADIUS|BP|<-BP C0: MOVAX,WORDPTR[BP-2];AX<=X|返回地址|<-BP+2 CMP AX,WORDPTR[BP-4] ;IFX<Y,JMPC00|RADIUS|<-BP+4 JL C00 ;|YC|<-BP+6 JMP C3 ;|XC|<-BP+8 C00: PUSHWORDPTR[BP+8];CIRCLE堆棧結(jié)構(gòu) PUSH WORDPTR[BP+6]; PUSH WORDPTR[BP-2] PUSH WORDPTR[BP-4] CALL CIRCLE_POINT CMP WORDPTR[BP-6],0 JGE C1 MOV AX,4 MUL WORDPTR[BP-2] ADD AX,6 ADD AX,WORDPTR[BP-6] MOV WORDPTR[BP-6],AX JMP C2 C1: MOVAX,WORDPTR[BP-2] SUB AX,WORDPTR[BP-4] MOV BX,4 IMUL BX ADD AX,10 ADD AX,WORDPTR[BP-6] MOV WORDPTR[BP-6],AX DEC WORDPTR[BP-4] C2: INCWORDPTR[BP-2] JMP C0 C3: MOVAX,WORDPTR[BP-2] CMP AX,WORDPTR[BP-4] JNE C4 PUSH WORDPTR[BP+8] PUSH WORDPTR[BP+6] PUSH WORDPTR[BP-2] PUSH WORDPTR[BP-4] CALL CIRCLE_POINT C4: MOVSP,BP POP BP RET 6 CIRCLEENDP;***********************************************;圓畫點子程序 ;***********************************************CIRCLE_POINTPROCNEAR PUSH BP MOV BP,SP SUB SP,16 MOV AX,WORDPTR[BP+10] ADD AX,WORDPTR[BP+6] MOV WORDPTR[BP-2],AX ;XC+X MOV AX,WORDPTR[BP+10] SUB AX,WORDPTR[BP+6] MOV WORDPTR[BP-4],AX ;XC-X MOV AX,WORDPTR[BP+10] ;|| ADD AX,WORDPTR[BP+4] ;|| MOV WORDPTR[BP-6],AX ;XC+Y|| MOV AX,WORDPTR[BP+10] ;SP->|| SUB AX,WORDPTR[BP+4] ;|YC-Y|<-BP-16 MOV WORDPTR[BP-8],AX ;XC-Y|YC+Y|<-BP-14 MOV AX,WORDPTR[BP+8] ;|YC-X|<-BP-12 ADD AX,WORDPTR[BP+6] ;|YC+X|<-BP-10 MOV WORDPTR[BP-10],AX ;YC+X|XC-Y|<-BP-8 MOV AX,WORDPTR[BP+8] ;|XC+Y|<-BP-6 SUB AX,WORDPTR[BP+6] ;|XC-X|<-BP-4 MOV WORDPTR[BP-12],AX ;YC-X|XC+X|<-BP-2 MOV AX,WORDPTR[BP+8] ;|BP|<-BP ADD AX,WORDPTR[BP+4] ;|返回地址|<-BP+2 MOV WORDPTR[BP-14],AX ;YC+Y|Y|<-BP+4 MOV AX,WORDPTR[BP+8] ;|X|<-BP+6 SUB AX,WORDPTR[BP+4] ;|YC|<-BP+8 MOV WORDPTR[BP-16],AX ;YC-Y|XC|<-BP+10 PUSH WORDPTR[BP-2] ;|| PUSH WORDPTR[BP-14] ;CIRCLE_POINT堆棧結(jié)構(gòu) PUSH COLOR CALL PIXEL CALL DELAY_C PUSH WORDPTR[BP-4] PUSH WORDPTR[BP-14] PUSH COLOR CALL PIXEL CALL DELAY_C PUSH WORDPTR[BP-2] PUSH WORDPTR[BP-16] PUSH COLOR CALL PIXEL CALL DELAY_C PUSH WORDPTR[BP-4] PUSH WORDPTR[BP-16] PUSH COLORCALL PIXELCALL DELAY_C PUSH WORDPTR[BP-6] PUSH WORDPTR[BP-10] PUSH COLOR CALL PIXEL CALL DELAY_C PUSH WORDPTR[BP-8] PUSH WORDPTR[BP-10] PUSH COLOR CALL PIXEL CALL DELAY_C PUSH WORDPTR[BP-6] PUSH WORDPTR[BP-12] PUSH COLOR CALL PIXEL CALL DELAY_C PUSH WORDPTR[BP-8] PUSH WORDPTR[BP-12] PUSH COLOR CALL PIXEL CALL DELAY_C MOV SP,BP POP BP RET 8CIRCLE_POINTENDP;***********************************************;設置寫模式的函數(shù);***********************************************SET_WRITE_MODEPROCNEAR PUSH AX MOV DX,3CEH MOV AL,5 OUT DX,AL MOV DX,3CFH POP AX OUT DX, MOV DX,3CEH MOV AL,8 OUT DX, MOV DX,3CFH MOV AL,0FFH OUT DX, RETSET_WRITE_MODEENDP;***********************************************;輸入子函數(shù)READ將數(shù)字轉(zhuǎn)化為二進制存入AX中;***********************************************READPROCNEAR PUSH CX LEA DX,BUFFER MOV AH,0AH INT 21H MOV AX,0 MOV CL,BUFFER+1 MOV CH,0 LEA BX,BUFFER+2ONE: MUL C10 MOV DL,[BX] AND DL,0FH ADD AL,DL ADC AH,0 INC BX LOOP ONE POP CX RETREADENDP;***********************************************;輸入錯誤提示子程序共用部分;***********************************************INPUT_ERPROCNEAR PUSH CX PUSH AX PUSH DXLEA DX,MESS8 MOV AH,9 INT 21H POP DX POP AX POP CX RETINPUT_ERENDP;***********************************************;三角輸出的子函數(shù);***********************************************OUTPUT_TPROCNEAR MOV CX,3DDD:;將指定三角形的三頂點坐標壓棧 PUSH CX;壓棧依據(jù)line函數(shù)要求的規(guī)則 PUSH SI MOV AX,[SI] PUSH AX MOV AX,[SI+2] PUSH AX MOV AX,[SI+4] PUSH AX MOV AX,[SI+6] PUSH AX CALL LINE_T ;運用延時函數(shù)實現(xiàn)動畫效果 CALL DELAY_T;調(diào)用Line函數(shù)畫線 POP SI ADD SI,8 POP CX LOOP DDDRETOUTPUT_TENDP;***********************************************;三角Bresenham畫線算法 ;***********************************************LINE_TPROCNEAR PUSH BP MOV BP,SP SUB SP,16 MOV WORDPTR[BP-6],0;X=0 MOV WORDPTR[BP-8],0;Y=0 MOV WORDPTR[BP-14],1;INCX=1 MOV WORDPTR[BP-16],1;INCY=1 MOV AX,WORDPTR[BP+6];AX<=X2 SUB AX,WORDPTR[BP+10];AX<=X2-X1 JNC L1;IFX2>=X1,JMPL1 NEG AX;IFX2<X1,DELTA_X=-DELTA_X MOV WORDPTR[BP-14],-1;INCX<=-1L1: CMP AX,0;IFDELTA_X!=0,JMPL11 JNE L11 MOV WORDPTR[BP-14],0;INCX<=0L11: MOV WORDPTR[BP-10],AX;DELTA_X<=AX MOV AX,WORDPTR[BP+4];AX<=Y2 SUB AX,WORDPTR[BP+8];AX<=Y2-Y1 JNC L2;IFY2>=Y1,JMPL2 NEG AX;IFY2<Y1,DELTA_Y=-DELTA_Y MOV WORDPTR[BP-16],-1;INCY<=-1L2: ; CMP AX,0;IFDELTA_Y!=0,JMPL22 JNE L22; MOV WORDPTR[BP-16],0;INCY<=0 L22: MOVWORDPTR[BP-12],AX;DELTA_Y<=AX LP4: MOVAX,WORDPTR[BP-10];AX<=DELTA_X CMP AX,WORDPTR[BP-12]; JG LP5;DELTA_X>DELTA_Y MOV AX,WORDPTR[BP-12]; MOV WORDPTR[BP-4],AX;DISTANCE<=DELTA_Y JMP LP51;LP5: MOV AX,WORDPTR[BP-10]; MOV WORDPTR[BP-4],AX;DISTANCE<=DELTA_XLP51: INC AX MOV WORDPTR[BP-2],AXLP6: PUSH WORDPTR[BP+10] PUSH WORDPTR[BP+8] PUSH COLOR CALL PIXEL PUSH CX CALL DELAY_T POP CX MOV AX,WORDPTR[BP-6];AX<=X ADD AX,WORDPTR[BP-10];AX<=X+DELTA_X MOV WORDPTR[BP-6],AX;X=X+DELTA_X MOV AX,WORDPTR[BP-8];AX<=Y ADD AX,WORDPTR[BP-12];AX<=Y+DELTA_Y MOV WORDPTR[BP-8],AX;Y=Y+DELTA_Y MOV AX,WORDPTR[BP-6];AX<=X CMP AX,WORDPTR[BP-4] JLE LP7;IFX<=DISTANCE,JMPLP7 MOV AX,WORDPTR[BP-6];X>DISTANCE SUB AX,WORDPTR[BP-4];AX<=X-DISTANCE MOV WORDPTR[BP-6],AX;X=X-DISTANCE MOV AX,WORDPTR[BP+10];AX<=X1 ADD AX,WORDPTR[BP-14];AX<=X1+INCX MOV WORDPTR[BP+10],AX;X1=X1+INCXLP7: MOV AX,WORDPTR[BP-8];AX<=Y CMP AX,WORDPTR[BP-4] JLE LP8;IFY<=DISTANCE,JMPLP8 MOV AX,WORDPTR[BP-8];Y>DISTANCE SUB AX,WORDPTR[BP-4];AX<=Y-DISTANCE MOV WORDPTR[BP-8],AX;Y=Y-DISTANCE MOV AX,WORDPTR[BP+8];AX<=Y1 ADD AX,WORDPTR[BP-16];AX<=Y1+INCY MOV WORDPTR[BP+8],AX;Y1=Y1+INCYLP8: DEC WORDPTR[BP-2];IFT!=0,JMPLP6 JZ LP9 JMP LP6LP9: MOV SP,BP POP BP RET 8LINE_TENDP;***********************************************;三角三個頂點輸入子程序;***********************************************INPUT_TPROCNEAR LEA SI,POINT;; LEA DX,MESS1_T MOV AH,9 INT 21H LEA DX,MESS5_T MOV AH,9 INT 21H ;顯示輸入提示信息xx1: CALL READ ;調(diào)用getchar輸入3位數(shù) CMP AX,0;驗證輸入數(shù)字在要求的范圍內(nèi) jl wx1 cmp AX,600 jg wx1 mov [si],AX;驗證通過,輸入下一個數(shù) mov [si+8],AX jmp yy1wx1:LEA DX,MESS7_T MOV AH,9 INT 21H ;驗證失敗,顯示提示信息并重新輸入 jmp xx1 yy1: LEA DX,MESS6_

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論