图形变换程序设计 概述
此图形转换程序主要是运用写显存的方式去实现。可以实现矩形、三角形和圆形的绘制及图形颜色变换。 一、设计要求
完成一个图形变换的程序,系统具有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 CALL CL_SCREEN
CALL DISPLAY ;调用显示子程序 ;键盘输入
MOVAH,8 ;键盘输入功能号(无回显) INT 21H ;调用DOS系统中断 ;---------------------------------- ;根据AL判断画哪个图 CMPAL,'Y' JZCIRCLE1 CMPAL,'S' JZTRIANGLE1 CMPAL,'Z'
JZTECTANGLE1
;---------------------------------- CMPAL,'Q'
JEEXIT ;键盘输入'Q'字符,退出 CALL ERRORDIS JMPINPUT CIRCLE1: CALL CIRCLE
MOVAX,3 ;显示方式
INT 10H ;调用BIOS中断 JMPINPUT TRIANGLE1:
CALL TRIANGLE JMPINPUT TECTANGLE1: CALL RECTANGLE JMPINPUT EXIT:
CALL CL_SCREEN
MOVAH,4CH ;退出程序,返回DOS INT 21H
MAINENDP ;主程序结束 (二)、子程序画圆流程图 (三)、子程序画三角形流程图
注:通过光标的行号列号的改变来一行一行地画三角形的各部分。关键在于每画一行(写显存)在光标位置显示字符的个数应增加两个。让三角形变色就是重画一次三角形,字符属性值BL相应地改变。本程序BL从9变到15,三角形颜色从亮蓝变到亮黄。 (四)子程序画矩形流程图
四、程序源代码
RUZHANMACRO ;定义宏 PUSHAX PUSHBX PUSHCX PUSHDX PUSHSI PUSHDI
ENDM ;结束宏
CHUZHANMACRO ;定义宏 POPDI POPSI POPDX POPCX POPBX POPAX
ENDM ;结束宏
;---------------------------------------------------------- DATA SEGMENT ;定义数据段
SYSINFODB 'PLEASE CHOOSE THE LETTER Y,S,Z &' DB ' INPUT Q TO QUIT','$'
MYINFODB ' DESIGN BY DAWNY ',0DH,0AH,'$' ERRINFODB 'CHOOSE ERROR!','$'
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 COUNT DB90 DATA ENDS
;---------------------------------------------------------- CODESEGMENT ;定义代码段 ;主程序
MAINPROCFAR
ASSUMEDS:DATA,SS:STACK,CS:CODE START:
MOVAX,DATA MOVDS,AX ;置光标位置 INPUT:
MOVAH,2 ;置光标功能号 MOVBH,0 ;页号 MOVDH,0 ;行号 MOVDL,20 ;列号
INT 10H ;调用BIOS中断
LEADX,SYSINFO ;存偏移地址到DX CALL CL_SCREEN
CALL DISPLAY ;调用显示子程序 ;键盘输入
MOVAH,8 ;键盘输入功能号(无回显) INT 21H ;调用DOS系统中断 ;---------------------------------- ;根据AL判断画哪个图
CMPAL,'Y' JZCIRCLE1 CMPAL,'S' JZTRIANGLE1 CMPAL,'Z'
JZTECTANGLE1
;---------------------------------- CMPAL,'Q'
JEEXIT ;键盘输入'Q'字符,退出 CALL ERRORDIS JMPINPUT CIRCLE1: CALL CIRCLE
MOVAX,3 ;显示方式
INT 10H ;调用BIOS中断 JMPINPUT TRIANGLE1: CALL TRIANGLE JMPINPUT TECTANGLE1: CALL RECTANGLE JMPINPUT EXIT:
CALL CL_SCREEN
MOVAH,4CH ;退出程序,返回DOS INT 21H
MAINENDP ;主程序结束
;---------------------------------------------------------- ;子程序,显示DS中内容 DISPLAYPROCNEAR MOVAH,9 INT 21H RET
DISPLAYENDP
;---------------------------------------------------------- ;子程序,显示错误信息 ERRORDISPROCNEAR RUZHAN CONTIUNE: MOVAH,2 MOVBH,0 MOVDH,12 MOVDL,30