收藏 分享(赏)

图形变换程序设计.docx

上传人:yjrm16270 文档编号:8089391 上传时间:2019-06-08 格式:DOCX 页数:13 大小:41.95KB
下载 相关 举报
图形变换程序设计.docx_第1页
第1页 / 共13页
图形变换程序设计.docx_第2页
第2页 / 共13页
图形变换程序设计.docx_第3页
第3页 / 共13页
图形变换程序设计.docx_第4页
第4页 / 共13页
图形变换程序设计.docx_第5页
第5页 / 共13页
点击查看更多>>
资源描述

1、 图形变换程序设计概述此图形转换程序主要是运用写显存的方式去实现。可以实现矩形、三角形和圆形的绘制及图形颜色变换。一、设计要求完成一个图形变换的程序,系统具有 4 种可选择的功能,按字母“y”画一个用点组成的圆;按字母“s”画一个用不同颜色填充的三角形;按字母“ z”画一个用不同颜色填充的矩形;按“q ”键退出。二、设计思想(一)、界面控制程序开始显示一行提示信息。键盘输入“y”进入画圆子程序,输入“s” 进入画三角形子程序,输入“z” 进入画矩形子程序。(二)、画圆通过写算法来确定圆边点的位置,利用写像素方式画出圆边点,用尽量多的点能较完整地表现出一个圆。算法首选确定圆心位置 O(OX ,O

2、Y),设置圆半径为 Radius,圆边任一位置A(X ,Y)可由圆心位置和圆半径及方向角 (见下图)确定。本程序首先设立大概连续的多个数值(本程序为 90 个)以确定 SIN 值及其相对应的 COS 值。A 点位置可由以下表达式确定。 X=SIN*Radius+OXY=COS*Radius+OY由 A 点又可求出与其相关的三点 A,B,B(见上图)。(三)、画三角形首先确定开始位置,然后通过行数和列数的变化一行一行地画三角形的分解部分。由设定的字符(本题为“*”)作为填充三角形元素,行数增 1,字符数加2,依此往上画能形成三角形。三角形颜色的变换是在已画好图的基础上在图原位置重画,但改变相应字

3、符的颜色。(四)画矩形在文本方式下首先利用字符(本题为“*”)的随光标的移动而显示画一个矩形框,然后通过设置卷屏(本题为下卷)区域为矩形框内部,改变确定区域的背景颜色即可完成矩形框的颜色变换。三、程序流程图(一)、主流程图关键代码;主程序MAIN PROC FARASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AXINPUT:LEA DX,SYSINFO ;存偏移地址到 DXCALL CL_SCREENCALL DISPLAY ;调用显示子程序;键盘输入MOV AH,8 ;键盘输入功能号(无回显)INT 21H ;调用 DOS 系统

4、中断;-;根据 AL 判断画哪个图CMP AL,YJZ CIRCLE1CMP AL,SJZ TRIANGLE1CMP AL,ZJZ TECTANGLE1;-CMP AL,QJE EXIT ;键盘输入Q字符,退出CALL ERRORDISJMP INPUTCIRCLE1:CALL CIRCLEMOV AX,3 ;显示方式INT 10H ;调用 BIOS 中断JMP INPUTTRIANGLE1:CALL TRIANGLEJMP INPUTTECTANGLE1:CALL RECTANGLEJMP INPUTEXIT:CALL CL_SCREENMOV AH,4CH ;退出程序,返回 DOSINT

5、21HMAIN ENDP ;主程序结束(二)、子程序画圆流程图(三)、子程序画三角形流程图注:通过光标的行号列号的改变来一行一行地画三角形的各部分。关键在于每画一行(写显存)在光标位置显示字符的个数应增加两个。让三角形变色就是重画一次三角形,字符属性值 BL 相应地改变。本程序 BL 从 9 变到 15,三角形颜色从亮蓝变到亮黄。(四)子程序画矩形流程图四、程序源代码RUZHAN MACRO ;定义宏PUSH AXPUSH BXPUSH CXPUSH DXPUSH SIPUSH DIENDM ;结束宏CHUZHAN MACRO ;定义宏POP DIPOP SIPOP DXPOP CXPOP B

6、XPOP AXENDM ;结束宏;-DATA SEGMENT ;定义数据段SYSINFO DB PLEASE CHOOSE THE LETTER Y,S,Z 用于设定 SIN 函数值 0 到 1DW 17,19,21,23,24,26,28,29,31,33DW 34,36,37,39,41,42,44,45,47,49DW 50,52,53,54,56,57,59,60,62,63DW 64,66,67,68,69,71,72,73,74,75DW 77,78,79,80,81,82,83,84,85,86DW 87,87,88,89,90,91,91,92,93,93DW 94,95,95

7、,96,96,97,97,97,98,98DW 98,99,99,99,99,100,100,100,100DW 100,100MM DW ? ;定义操作数为字的助记符 MM 代表像素点的列增量(为正)F_MM DW ? ;定义操作数为字的助记符 MM 代表像素点的列增量(为负)NN DW ? ;定义操作数为字的助记符 NN 代表像素点的行增量(为正)F_NN DW ? ;定义操作数为字的助记符 NN 代表像素点的行增量(为负)OX EQU 120 ;圆中心的列像素OY EQU 240 ;圆中心的行像素RADIUS DW 60 ;圆的半径COLOUR DB 2 ;圆边的颜色KK DW 100C

8、OUNT DB 90DATA ENDS;-CODE SEGMENT ;定义代码段;主程序MAIN PROC FARASSUME DS:DATA,SS:STACK,CS:CODESTART:MOV AX,DATAMOV DS,AX;置光标位置INPUT:MOV AH,2 ;置光标功能号MOV BH,0 ;页号MOV DH,0 ;行号MOV DL,20 ;列号INT 10H ;调用 BIOS 中断LEA DX,SYSINFO ;存偏移地址到 DXCALL CL_SCREENCALL DISPLAY ;调用显示子程序;键盘输入MOV AH,8 ;键盘输入功能号(无回显)INT 21H ;调用 DOS

9、 系统中断;-;根据 AL 判断画哪个图CMP AL,YJZ CIRCLE1CMP AL,SJZ TRIANGLE1CMP AL,ZJZ TECTANGLE1;-CMP AL,QJE EXIT ;键盘输入Q字符,退出CALL ERRORDISJMP INPUTCIRCLE1:CALL CIRCLEMOV AX,3 ;显示方式INT 10H ;调用 BIOS 中断JMP INPUTTRIANGLE1:CALL TRIANGLEJMP INPUTTECTANGLE1:CALL RECTANGLEJMP INPUTEXIT:CALL CL_SCREENMOV AH,4CH ;退出程序,返回 DOSI

10、NT 21HMAIN ENDP ;主程序结束;-;子程序,显示 DS 中内容DISPLAY PROC NEARMOV AH,9INT 21HRETDISPLAY ENDP;-;子程序,显示错误信息ERRORDIS PROC NEARRUZHANCONTIUNE:MOV AH,2MOV BH,0MOV DH,12MOV DL,30INT 10HLEA DX,ERRINFO ;存偏移地址到 DXCALL CL_SCREENCALL DISPLAY ;调用显示子程序;检验键盘状态MOV AH,0BH ;功能号,返回参数 ALINT 21HCMP AL,0JE TMP;键盘输入,无回显MOV AH,0

11、7H ;功能号INT 21HTMP:JZ CONTIUNECHUZHANRETERRORDIS ENDP;-;子程序,清屏CL_SCREEN PROC NEARRUZHANMOV AH,7 ;卷屏功能号MOV AL,0 ;初始化屏幕MOV BH,7 ;卷入行属性,上此处为正常显示MOV CH,0 ;左上角行号MOV CL,0 ;左上角列号MOV DH,24 ;右下角行号MOV DL,79 ;右下角列号INT 10HCHUZHANRETCL_SCREEN ENDP;-;子程序,画圆CIRCLE PROC NEARRUZHAN ;调用宏,保存寄存器CALL SCREEN ;调用屏幕子程序MOV C

12、OUNT,90MOV SI,OFFSET SINE+89*2 ;转化为用于设定 COS 函数值 1 到 0MOV DI,OFFSET SINEAGAIN:CALL COMPUTE ;调用计算圆边像素点CALL WRITE ;描圆边SUB SI,2 ;SI 与源操作数相减ADD DI,2 ;DI 与源操作数相加DEC COUNTJNZ AGAIN ;标志符 ZF 不为 0 跳转CHUZHAN ;调用宏,恢复寄存器RETCIRCLE ENDP;-;子程序, 设置屏幕SCREEN PROC NEARMOV AX,12H ;显示方式INT 10H ;调用 BIOS 中断MOV AH,0BH ;置彩色调

13、板MOV BX,0 ;BH 为彩色调色板 ID,BL 为 ID 配套使用的颜色INT 10HRETSCREEN ENDP;-;子程序,计算圆边像素点COMPUTE PROC NEARMOV AX,SI ;地址 SI 所指向内容赋给 AX,SI+依次得到所有圆边点MUL RADIUS ;目的操作数 AX 与源操作数 RADIUS 相乘,结果放 AXDIV KK ;得到圆边像素点的列位置MOV MM,AXNEG AX ;将 AX 转化为二进制补码,以求相对应的像素点MOV F_MM,AX ;补码形式的 AX 放入 F_MMMOV AX,DIMUL RADIUSDIV KK MOV NN,AXNEG

14、 AXMOV F_NN,AXRETCOMPUTE ENDP;-;子程序,描点WRITE PROCMOV DX,F_MM ;对应像素列ADD DX,OYMOV CX,NN ;对应像素行ADD CX,OXCALL WR_DOTMOV CX,F_NNADD CX,OXCALL WR_DOTMOV DX,MMADD DX,OYCALL WR_DOTMOV CX,NNADD CX,OXCALL WR_DOTRETWRITE ENDP;-;子程序,写像素WR_DOT PROCMOV AH,0CH ;写像素功能号MOV AL,COLOUR ;颜色值MOV BH,0 ;页号INT 10HRETWR_DOT E

15、NDP;-;子程序,画三角形TRIANGLE PROC NEARRUZHAN ;保存寄存器MOV BL,9 ;字符属性,暗蓝GOON:MOV CH,1 ;1 代表走,0 代表暂停COLOR:MOV AH,0BH ;检验键盘状态INT 21HCMP AL,0JNZ AACMP CH,1JNZ COLOR;置光标位置MOV CX,1 ;显示字符个数MOV AH,2 ;功能号MOV BH,0 ;页号MOV DH,6 ;行号MOV DL,36 ;列号INT 10HHUATU:MOV AH,2 ;置光标INT 10H;在光标位置显示字符和属性MOV AH,9 ;功能号MOV BH,0 ;显示页MOV A

16、L,2AH ;字符,*INT 10HINC DH ;行数加 1,DOS 窗口向下画DEC DL ;列号减 1,以便形成三角形ADD CX,2 ;每画一行,显示字符数加 2 个CMP CX,21 ;画完为止JNZ HUATUINC BLCMP BL,15JNZ GOONAA: MOV AH,7INT 21HCMP AL,QJNZ BBJMP EEBB: CMP CH,0JZ CCMOV CH,0JMP COLORCC: MOV CH,1JMP COLOREE: CHUZHAN ;恢复寄存器RETTRIANGLE ENDP;-;子程序,画矩形RECTANGLE PROC NEARRUZHAN ;保

17、存寄存器;设置显示方式;MOV AH,0;MOV AL,12H;INT 10H;置光标初始位置MOV CX,1MOV AH,2MOV BH,0MOV DH,6MOV DL,6INT 10H;光标右移,向右画RIGHT:MOV AH,2 ;置光标位置INT 10HMOV AH,9 ;功能号 9,显示字符和属性MOV AL,2AH ;字符,*MOV BL,0FAH ;字符属性,背景为白,前景为红;MOV CX,6INT 10HINC DL ;列数增加CMP DL,20JNE RIGHT ;当 ZF 为 1 时光标继续右移,为 0 时跳转JMP DOWN;光标下移,向下画DOWN:MOV AH,2I

18、NT 10HMOV AH,9MOV AL,2AHMOV BL,0FAH;MOV CX,6INT 10HINC DHCMP DH,12JNZ DOWNJMP LEFT;光标左移,向左画LEFT:MOV AH,2INT 10HMOV AH,9MOV AL,2AHMOV BL,0FAH;MOV CX,6INT 10HDEC DLCMP DL,6JNZ LEFTJMP UP;光标上移,向上画UP:MOV AH,2INT 10HMOV AH,9MOV AL,2AHMOV BL,0FAH;MOV CX,6INT 10HDEC DHCMP DH,6JNZ UP;*;矩形框内部颜色变化COLOUR2:MOV

19、BH,0MOV BL,0CHANGE2:MOV AH,0BHINT 21HCMP AL,0JNE CCMP BL,0JNE CHANGE2MOV AH,7MOV AL,14MOV CH,7MOV CL,7MOV DH,11MOV DL,19INT 10HCALL DELAY ;调用延时子程序ADD BH,0FHCMP BH,0F0HJNZ CHANGE2JMP COLOUR2C: MOV AH,07HINT 21HCMP AL,QJNE DJMP ED:CMP BL,0JE SMOV BL,0JMP CHANGE2S: MOV BL,1JMP CHANGE2E:;*CHUZHAN ;保存寄存器

20、RETRECTANGLE ENDP;-;延时程序DELAY PROC NEARRUZHANMOV AX,6NEXT1:MOV CX,10NEXT2:LOOP NEXT2DEC AXJNZ NEXT1CHUZHANRETDELAY ENDP;-END START ;程序结束五、遇到的问题及解决方法主要问题存在于画圆那一部分。一开始不知道怎样才能画出一个圆形,后来经过各方面资料收集,得到一种解决办法(见本文档设计要求画圆算法部分)。因为画圆是用的写像素方法,面画三角形和画矩形是用的显示字符方法,两种方法所工作的 DOS 显示方式明显不同,造成了画圆和画其它图形的转换时不能达到设计的要求,后来在过渡

21、时加了条改变显示方式的语句:MOV AX ,03H INT 10H,问题得到解决。运用 BIOS 中断,检验键盘输入时,总是得不到想要结果,后查明原因是:返回参数 AL的值在相应的时候需要调用键盘输入给“吃掉” 。六、设计心得1、学习汇编语言,首要问题是学习 80X86 指令系统。如果能将指令系统中的各个助记符、格式等都能完全掌握并灵活运用,大部分工作就已经完成了。指令系统确定了CPU 所能完成的功能,是用汇编语言进行程序设计的最基本部分。如果不熟悉汇编指令的功能及其有关规定,肯定不能灵活使用汇编语言。2、汇编的写显存程序设计是一项很有意思的工作,在设计过程中你会得到很多乐趣,由此能不断提升自己的学习兴趣,这种学习方法适合于其它知识的学习。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报