您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 市场营销 > 动态画实心圆汇编实验报告
动态画实心圆一、程序设计要求1.动态画一个实心圆球2.位置在屏幕中央,变化情况是:逐渐“膨胀”的或者逐渐“收缩”的。二、程序设计思路主程序设计思路:第一步:设定初始半径和画圆的次数第二步:调用图形方式BIOS的0号功能,采用模式12来初始化屏幕第三步:由初始半径R开始,在屏幕上画一个圆,调用BIOS的软中断实现延时;增加半径R,再次在屏幕上画圆,至达到规定的半径停止,即实现动态画一个实心圆。第四步:调用INT21的9号功能在屏幕上显示提示用户退出该程序的信息,再调用INT21的1号功能等待用户键入一个字符后退出程序,同时调用BIOS的屏幕功能的0号功能恢复到原来80*25黑白文本方式,随后返回DOS。画实心圆思路:从坐标原点开始依次向X轴正向和负向画从直线14AA和直线23AA直至画到圆的最右和最左边界(如右图)。具体步骤如下:第一步:将第一象限横坐标A置0;第二步:由A的值计算第一象限纵坐标H的值。由(A,H)求出与该点对应的四个值RIGHT、LEFT、UP和DOWN,其中:320RIGHTA,320LEFTA240UPH,240DOWNH则得到与该点对应的四个象限的点分别为:1234,,,AAAA。第三步:分别画出直线14AA和直线23AA。第四步:将A增加1,重复第二步,直至A等于R三、程序设计流程图初始半径1-R画圆的次数-COUNT调用宏SCREEN调用宏WRITE在屏幕上画圆调用宏DELAY延迟t时间R+1-RCOUNT-1-COUNTCOUNT=0?显示信息提示用户如何退出调用INT21的1号功能恢复原屏幕显示方式返回DOSYN主程序结束开始宏WRITE画圆0-A调用SORT子程序0-CHA-CLCX+XX-CXCX-RIGHT-CX-CXCX+XX-CXCX-LEFTH-DXDX+YY-DXDX-UPH-DX-DX-DXDX+YY-DXDX-DOWN调用宏LINELEFT,DOWN,UP调用宏LINERIGHT,DOWN,UP0-CHA-CLINCAR-ALA=AL?结束NY宏LINE画直线伪指令LOCAL0-BHCOLOR-AHX-CXY1-DXDX=Y2?0C-AHINT10DX=1-DXN结束YA-ALAL*AL-ALAX-A2R-ALAL*AL-ALAX-A2-AX0-CXCX-DXDX+DX-DXDX+1-DXAX-DX-AXAX=DXCX+1-CXCX-H结束YN宏SORT计算纵坐标四、源程序;---------------------------------------------------------------------------------------------------------------------;程序功能:在屏幕中央上动态的画一个实心圆球;---------------------------------------------------------------------------------------------------------------------.486;宏的作用:屏幕初始化;---------------------------------------------------------------------------------------------------------------------SCREENMACROMOVAX,12HINT10H;设置屏幕显示方式MOVAH,0BH;选择背景色/选择调试板INT10HENDM;---------------------------------------------------------------------------------------------------------------------;功能:实现动态显示;---------------------------------------------------------------------------------------------------------------------DELAYMACRO;调用BIOS的软中断实现延时MOVAH,86HMOVCX,T1MOVDX,T2INT15HENDM;---------------------------------------------------------------------------------------------------------------------;功能:画一条竖线;哑元意义:x为竖线的列值;Y1和Y2分别为竖线的两端点的行值;---------------------------------------------------------------------------------------------------------------------LINEMACROX,Y1,Y2;画列值为x,行值从Y1到Y2的直线LOCALLL,FIRSTMOVCX,X;MOVAL,COLORMOVBH,0MOVDX,Y1JMPFIRSTLL:INCDX;行值加1FIRST:MOVAH,0CHINT10H;写一个像素点CMPDX,Y2JNZLL;判断Y1和Y2是否相等,若相等则完成ENDM;---------------------------------------------------------------------------------------------------------------------;功能:通过分别在左右平面画垂直于x轴的弦来画一个实心圆;---------------------------------------------------------------------------------------------------------------------WRITEMACROMOVA,0;初始化圆的横坐标AGA:CALLSQRT;计算纵坐标的值MOVCH,0MOVCL,AADDCX,XXMOVRIGHT,CX;右平面弦的列值MOVCH,0MOVCL,ANEGCXADDCX,XXMOVLEFT,CX;左平面弦的列值MOVDX,HADDDX,YYMOVUP,DX;弦的上端点的行值MOVDX,HNEGDXADDDX,YYMOVDOWN,DX;弦的下端点的行值LINELEFT,DOWN,UP;在左平面画弦LINERIGHT,DOWN,UP;在右平面画弦INCA;继续画其他弦至画出圆MOVAL,RCMPA,ALJNZAGAENDM;---------------------------------------------------------------------------------------------------------------------DATASEGMENTUSE16;数据段RDB?;R为圆的半径R2DW?ADB?;存放圆的横坐标A2DW?HDW?;存放圆的纵坐标YYEQU240;纵坐标的行值XXEQU320;横坐标的列值COLOREQU4;像素值RIGHTDW?;存放右平面的列值LEFTDW?;存放左平面的列值UPDW?;存放上半平面的行值DOWNDW?;存放下半平面的行值T1EQU0;延迟时间T2EQU10000COUNTDB?MESGDB'pleasestrikeanykey!',0DH,0AH,'$'DATAENDS;---------------------------------------------------------------------------------------------------------------------CODESEGMENTUSE16;代码段ASSUMECS:CODE,DS:DATABEG:MOVAX,DATAMOVDS,AXMOVR,1MOVCOUNT,100SCREEN;屏幕初始化LAST:WRITE;在屏幕上画出半径为R的圆DELAY;延迟T再画圆INCRDECCOUNTJNZLAST;增大半径,再画圆MOVAH,9H;提示用户如何退出MOVDX,OFFSETMESGINT21HMOVAH,1HINT21HMOVAX,2INT10HMOVAH,4CHINT21H;---------------------------------------------------------------------------------------------------------------------SQRTPROC;计算行坐标MOVAL,AMULALMOVA2,AXMOVAL,RMULALSUBAX,A2MOVCX,0LAST1:MOVDX,CXADDDX,DXINCDXSUBAX,DXJCEXIT1INCCXJMPLAST1EXIT1:MOVH,CX;计算结果保存在H单元内RETSQRTENDP;---------------------------------------------------------------------------------------------------------------------CODEENDSENDBEG五、实验总结所遇问题及解决方法:问题1:画实心圆通过一圈圈画圆环来实现时,会出现很多稀疏点。原因:横坐标能取得显示范围内的所以列值,而纵坐标无法在显示范围内取遍所以值,故出现稀疏点。解决方法:每次记录垂直与X轴的弦的两段点的行值,通过从坐标原点分别向X轴正向和负向画弦。问题3:每次画圆都将之前画的圆覆盖,没有利用之前的已有的圆,使得程序的执行时间较长,但由于延迟时间有一定限制,所以这样可以更明显的显示出动态过程。解决方法:每次将画圆时都将前一次圆的边界保存,画弦时只需要将原弦加长。但该程序的实现较为麻烦,由于时间问题没有实现该程序。
本文标题:动态画实心圆汇编实验报告
链接地址:https://www.777doc.com/doc-7239389 .html