图形变换程序设计.docx
- 文档编号:24394806
- 上传时间:2023-05-27
- 格式:DOCX
- 页数:14
- 大小:22.07KB
图形变换程序设计.docx
《图形变换程序设计.docx》由会员分享,可在线阅读,更多相关《图形变换程序设计.docx(14页珍藏版)》请在冰豆网上搜索。
图形变换程序设计
图形变换程序设计
概述
此图形转换程序主要是运用写显存的方式去实现。
可以实现矩形、三角形和圆形的绘制及图形颜色变换。
一、设计要求
完成一个图形变换的程序,系统具有4种可选择的功能,按字母“y”画一个用点组成的圆;按字母“s”画一个用不同颜色填充的三角形;按字母“z”画一个用不同颜色填充的矩形;按“q”键退出。
二、设计思想
(一)、界面控制
程序开始显示一行提示信息。
键盘输入“y”进入画圆子程序,输入“s”进入画三角形子程序,输入“z”进入画矩形子程序。
(二)、画圆
通过写算法来确定圆边点的位置,利用写像素方式画出圆边点,用尽量多的点能较完
整地表现出一个圆。
算法
首选确定圆心位置O(OX,OY),设置圆半径为Radius,圆边任一位置A(X,Y)可由圆心位置和圆半径及方向角θ(见下图)确定。
本程序首先设立大概连续的多个数值(本程序为90个)以确定SINθ值及其相对应的COSθ值。
A点位置可由以下表达式确定。
<画圆算法解图>
X=SINθ*Radius+OX
Y=COSθ*Radius+OY
由A点又可求出与其相关的三点A’,B,B’(见上图)。
(三)、画三角形
首先确定开始位置,然后通过行数和列数的变化一行一行地画三角形的分解部分。
由设定的字符(本题为“*”)作为填充三角形元素,行数增1,字符数加2,依此往上画能形成三角形。
三角形颜色的变换是在已画好图的基础上在图原位置重画,但改变相应字符的颜色。
(四)画矩形
在文本方式下首先利用字符(本题为“*”)的随光标的移动而显示画一个矩形框,然后通过设置卷屏(本题为下卷)区域为矩形框内部,改变确定区域的背景颜色即可完成矩形框的颜色变换。
三、程序流程图
(一)、主流程图
关键代码
;主程序
MAINPROCFAR
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
INPUT:
LEADX,SYSINFO;存偏移地址到DX
CALLCL_SCREEN
CALLDISPLAY;调用显示子程序
;键盘输入
MOVAH,8;键盘输入功能号(无回显)
INT21H;调用DOS系统中断
;----------------------------------
;根据AL判断画哪个图
CMPAL,'Y'
JZCIRCLE1
CMPAL,'S'
JZTRIANGLE1
CMPAL,'Z'
JZTECTANGLE1
;----------------------------------
CMPAL,'Q'
JEEXIT;键盘输入'Q'字符,退出
CALLERRORDIS
JMPINPUT
CIRCLE1:
CALLCIRCLE
MOVAX,3;显示方式
INT10H;调用BIOS中断
JMPINPUT
TRIANGLE1:
CALLTRIANGLE
JMPINPUT
TECTANGLE1:
CALLRECTANGLE
JMPINPUT
EXIT:
CALLCL_SCREEN
MOVAH,4CH;退出程序,返回DOS
INT21H
MAINENDP;主程序结束
(二)、子程序画圆流程图
(三)、子程序画三角形流程图
注:
通过光标的行号列号的改变来一行一行地画三角形的各部分。
关键在于每画一行(写显存)在光标位置显示字符的个数应增加两个。
让三角形变色就是重画一次三角形,字符属性值BL相应地改变。
本程序BL从9变到15,三角形颜色从亮蓝变到亮黄。
(四)子程序画矩形流程图
四、程序源代码
RUZHANMACRO;定义宏
PUSHAX
PUSHBX
PUSHCX
PUSHDX
PUSHSI
PUSHDI
ENDM;结束宏
CHUZHANMACRO;定义宏
POPDI
POPSI
POPDX
POPCX
POPBX
POPAX
ENDM;结束宏
;----------------------------------------------------------
DATASEGMENT;定义数据段
SYSINFODB'PLEASECHOOSETHELETTERY,S,Z&'
DB'INPUTQTOQUIT','$'
MYINFODB' DESIGNBYDAWNY ',0DH,0AH,'$'
ERRINFODB'CHOOSEERROR!
','$'
SINEDW00,02,03,05,07,09,11,12,14,16;用于设定SIN函数值0到1
DW17,19,21,23,24,26,28,29,31,33
DW34,36,37,39,41,42,44,45,47,49
DW50,52,53,54,56,57,59,60,62,63
DW64,66,67,68,69,71,72,73,74,75
DW77,78,79,80,81,82,83,84,85,86
DW87,87,88,89,90,91,91,92,93,93
DW94,95,95,96,96,97,97,97,98,98
DW98,99,99,99,99,100,100,100,100
DW100,100
MMDW?
;定义操作数为字的助记符MM代表像素点的列增量(为正)
F_MMDW?
;定义操作数为字的助记符MM代表像素点的列增量(为负)
NN DW?
;定义操作数为字的助记符NN代表像素点的行增量(为正)
F_NNDW?
;定义操作数为字的助记符NN代表像素点的行增量(为负)
OXEQU120;圆中心的列像素
OYEQU240;圆中心的行像素
RADIUSDW60;圆的半径
COLOURDB2;圆边的颜色
KKDW100
COUNTDB90
DATAENDS
;----------------------------------------------------------
CODESEGMENT;定义代码段
;主程序
MAINPROCFAR
ASSUMEDS:
DATA,SS:
STACK,CS:
CODE
START:
MOVAX,DATA
MOVDS,AX
;置光标位置
INPUT:
MOVAH,2;置光标功能号
MOVBH,0;页号
MOVDH,0;行号
MOVDL,20;列号
INT10H;调用BIOS中断
LEADX,SYSINFO;存偏移地址到DX
CALLCL_SCREEN
CALLDISPLAY;调用显示子程序
;键盘输入
MOVAH,8;键盘输入功能号(无回显)
INT21H;调用DOS系统中断
;----------------------------------
;根据AL判断画哪个图
CMPAL,'Y'
JZCIRCLE1
CMPAL,'S'
JZTRIANGLE1
CMPAL,'Z'
JZTECTANGLE1
;----------------------------------
CMPAL,'Q'
JEEXIT;键盘输入'Q'字符,退出
CALLERRORDIS
JMPINPUT
CIRCLE1:
CALLCIRCLE
MOVAX,3;显示方式
INT10H;调用BIOS中断
JMPINPUT
TRIANGLE1:
CALLTRIANGLE
JMPINPUT
TECTANGLE1:
CALLRECTANGLE
JMPINPUT
EXIT:
CALLCL_SCREEN
MOVAH,4CH;退出程序,返回DOS
INT21H
MAINENDP;主程序结束
;----------------------------------------------------------
;子程序,显示DS中内容
DISPLAYPROCNEAR
MOVAH,9
INT21H
RET
DISPLAYENDP
;----------------------------------------------------------
;子程序,显示错误信息
ERRORDISPROCNEAR
RUZHAN
CONTIUNE:
MOVAH,2
MOVBH,0
MOVDH,12
MOVDL,30
INT10H
LEADX,ERRINFO;存偏移地址到DX
CALLCL_SCREEN
CALLDISPLAY;调用显示子程序
;检验键盘状态
MOVAH,0BH;功能号,返回参数AL
INT21H
CMPAL,0
JETMP
;键盘输入,无回显
MOVAH,07H;功能号
INT21H
TMP:
JZCONTIUNE
CHUZHAN
RET
ERRORDISENDP
;----------------------------------------------------------
;子程序,清屏
CL_SCREENPROCNEAR
RUZHAN
MOVAH,7;卷屏功能号
MOVAL,0;初始化屏幕
MOVBH,7;卷入行属性,上此处为正常显示
MOVCH,0;左上角行号
MOVCL,0;左上角列号
MOVDH,24;右下角行号
MOVDL,79;右下角列号
INT10H
CHUZHAN
RET
CL_SCREENENDP
;----------------------------------------------------------
;子程序,画圆
CIRCLEPROCNEAR
RUZHAN;调用宏,保存寄存器
CALLSCREEN;调用屏幕子程序
MOVCOUNT,90
MOVSI,OFFSETSINE+89*2;转化为用于设定COS函数值1到0
MOVDI,OFFSETSINE
AGAIN:
CALLCOMPUTE;调用计算圆边像素点
CALLWRITE;描圆边
SUBSI,2;SI与源操作数相减
ADDDI,2;DI与源操作数相加
DECCOUNT
JNZAGAIN;标志符ZF不为0跳转
CHUZHAN;调用宏,恢复寄存器
RET
CIRCLEENDP
;----------------------------------------------------------
;子程序,设置屏幕
SCREENPROCNEAR
MOVAX,12H;显示方式
INT10H;调用BIOS中断
MOVAH,0BH;置彩色调板
MOVBX,0;BH为彩色调色板ID,BL为ID配套使用的颜色
INT10H
RET
SCREENENDP
;----------------------------------------------------------
;子程序,计算圆边像素点
COMPUTEPROCNEAR
MOVAX,[SI];地址SI所指向内容赋给AX,SI++依次得到所有圆边点
MULRADIUS;目的操作数AX与源操作数RADIUS相乘,结果放AX
DIVKK;得到圆边像素点的列位置
MOVMM,AX
NEGAX;将AX转化为二进制补码,以求相对应的像素点
MOVF_MM,AX;补码形式的AX放入F_MM
MOVAX,[DI]
MULRADIUS
DIVKKMOVNN,AX
NEGAX
MOVF_NN,AX
RET
COMPUTEENDP
;----------------------------------------------------------
;子程序,描点
WRITEPROC
MOVDX,F_MM;对应像素列
ADDDX,OY
MOVCX,NN ;对应像素行
ADDCX,OX
CALLWR_DOT
MOVCX,F_NN
ADDCX,OX
CALLWR_DOT
MOVDX,MM
ADDDX,OY
CALLWR_DOT
MOVCX,NN
ADDCX,OX
CALLWR_DOT
RET
WRITEENDP
;----------------------------------------------------------
;子程序,写像素
WR_DOTPROC
MOVAH,0CH;写像素功能号
MOVAL,COLOUR;颜色值
MOVBH,0;页号
INT10H
RET
WR_DOTENDP
;----------------------------------------------------------
;子程序,画三角形
TRIANGLEPROCNEAR
RUZHAN;保存寄存器
MOVBL,9;字符属性,暗蓝
GOON:
MOVCH,1;1代表走,0代表暂停
COLOR:
MOVAH,0BH;检验键盘状态
INT21H
CMPAL,0
JNZAA
CMPCH,1
JNZCOLOR
;置光标位置
MOVCX,1;显示字符个数
MOVAH,2;功能号
MOVBH,0;页号
MOVDH,6;行号
MOVDL,36;列号
INT10H
HUATU:
MOVAH,2;置光标
INT10H
;在光标位置显示字符和属性
MOVAH,9;功能号
MOVBH,0;显示页
MOVAL,2AH;字符,'*'
INT10H
INCDH;行数加1,DOS窗口向下画
DECDL;列号减1,以便形成三角形
ADDCX,2;每画一行,显示字符数加2个
CMPCX,21;画完为止
JNZHUATU
INCBL
CMPBL,15
JNZGOON
AA:
MOVAH,7
INT21H
CMPAL,'Q'
JNZBB
JMPEE
BB:
CMPCH,0
JZCC
MOVCH,0
JMPCOLOR
CC:
MOVCH,1
JMPCOLOR
EE:
CHUZHAN;恢复寄存器
RET
TRIANGLEENDP
;----------------------------------------------------------
;子程序,画矩形
RECTANGLEPROCNEAR
RUZHAN;保存寄存器
;设置显示方式
;MOVAH,0
;MOVAL,12H
;INT10H
;置光标初始位置
MOVCX,1
MOVAH,2
MOVBH,0
MOVDH,6
MOVDL,6
INT10H
;光标右移,向右画
RIGHT:
MOVAH,2;置光标位置
INT10H
MOVAH,9;功能号9,显示字符和属性
MOVAL,2AH;字符,'*'
MOVBL,0FAH;字符属性,背景为白,前景为红
;MOVCX,6
INT10H
INCDL;列数增加
CMPDL,20
JNERIGHT;当ZF为1时光标继续右移,为0时跳转
JMPDOWN
;光标下移,向下画
DOWN:
MOVAH,2
INT10H
MOVAH,9
MOVAL,2AH
MOVBL,0FAH
;MOVCX,6
INT10H
INCDH
CMPDH,12
JNZDOWN
JMPLEFT
;光标左移,向左画
LEFT:
MOVAH,2
INT10H
MOVAH,9
MOVAL,2AH
MOVBL,0FAH
;MOVCX,6
INT10H
DECDL
CMPDL,6
JNZLEFT
JMPUP
;光标上移,向上画
UP:
MOVAH,2
INT10H
MOVAH,9
MOVAL,2AH
MOVBL,0FAH
;MOVCX,6
INT10H
DECDH
CMPDH,6
JNZUP
;**********************************************************
;矩形框内部颜色变化
COLOUR2:
MOVBH,0
MOVBL,0
CHANGE2:
MOVAH,0BH
INT21H
CMPAL,0
JNEC
CMPBL,0
JNECHANGE2
MOVAH,7
MOVAL,14
MOVCH,7
MOVCL,7
MOVDH,11
MOVDL,19
INT10H
CALLDELAY;调用延时子程序
ADDBH,0FH
CMPBH,0F0H
JNZCHANGE2
JMPCOLOUR2
C:
MOVAH,07H
INT21H
CMPAL,'Q'
JNED
JMPE
D:
CMPBL,0
JES
MOVBL,0
JMPCHANGE2
S:
MOVBL,1
JMPCHANGE2
E:
;**********************************************************
CHUZHAN;保存寄存器
RET
RECTANGLEENDP
;----------------------------------------------------------
;延时程序
DELAYPROCNEAR
RUZHAN
MOVAX,6
NEXT1:
MOVCX,10
NEXT2:
LOOPNEXT2
DECAX
JNZNEXT1
CHUZHAN
RET
DELAYENDP
;----------------------------------------------------------
ENDSTART;程序结束
五、遇到的问题及解决方法
主要问题存在于画圆那一部分。
一开始不知道怎样才能画出一个圆形,后来经过各方面
资料收集,得到一种解决办法(见本文档设计要求画圆算法部分)。
因为画圆是用的写像素方法,面画三角形和画矩形是用的显示字符方法,两种方法所工
作的DOS显示方式明显不同,造成了画圆和画其它图形的转换时不能达到设计的要求,后来在过渡时加了条改变显示方式的语句:
MOVAX,03HINT10H,问题得到解决。
运用BIOS中断,检验键盘输入时,总是得不到想要结果,后查明原因是:
返回参数AL
的值在相应的时候需要调用键盘输入给“吃掉”。
六、设计心得
1、学习汇编语言,首要问题是学习80X86指令系统。
如果能将指令系统中的各个助记符、
格式等都能完全掌握并灵活运用,大部分工作就已经完成了。
指令系统确定了CPU所能完成
的功能,是用汇编语言进行程序设计的最基本部分。
如果不熟悉汇编指令的功能及其有关规
定,肯定不能灵活使用汇编语言。
2、汇编的写显存程序设计是一项很有意思的工作,在设计过程中你会得到很多乐趣,由此
能不断提升自己的学习兴趣,这种学习方法适合于其它知识的学习。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形 变换 程序设计
![提示](https://static.bdocx.com/images/bang_tan.gif)