图形变换程序设计.docx

上传人:b****4 文档编号:24394806 上传时间:2023-05-27 格式:DOCX 页数:14 大小:22.07KB
下载 相关 举报
图形变换程序设计.docx_第1页
第1页 / 共14页
图形变换程序设计.docx_第2页
第2页 / 共14页
图形变换程序设计.docx_第3页
第3页 / 共14页
图形变换程序设计.docx_第4页
第4页 / 共14页
图形变换程序设计.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

图形变换程序设计.docx

《图形变换程序设计.docx》由会员分享,可在线阅读,更多相关《图形变换程序设计.docx(14页珍藏版)》请在冰豆网上搜索。

图形变换程序设计.docx

图形变换程序设计

 

图形变换程序设计

概述

此图形转换程序主要是运用写显存的方式去实现。

可以实现矩形、三角形和圆形的绘制及图形颜色变换。

一、设计要求

完成一个图形变换的程序,系统具有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、汇编的写显存程序设计是一项很有意思的工作,在设计过程中你会得到很多乐趣,由此

能不断提升自己的学习兴趣,这种学习方法适合于其它知识的学习。

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

当前位置:首页 > 农林牧渔 > 林学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1