文档详情

汇编语言课程设计粒子运动动画报告

nu****n
实名认证
店铺
DOC
481.52KB
约48页
文档ID:157451771
汇编语言课程设计粒子运动动画报告_第1页
1/48

汇编语言实训任务书题目:粒子运动动画 学生姓名学号: 钟磊;13740133 班级: 13级软件工程 题目类型: 软件工程(R) 指导教师: 刘树群 一、设计目的用汇编语言编程设计一个简单的动画程序,实现粒子的运动通过设计,掌握显示输出和基本数据像素颜色指令的应用,进一步提高综合运用知识的能力 二、设计内容(包括原始数据、技术参数、条件、设计要求等):  随机数量的种子,每个种子随机的像素颜色,任意方向自由随机的分散或集中,并且种子数量不断地增加三、设计要求题目的选择是根据汇编语言的特点主要针对系统内部的一些中断调用、系统功能调用、系统数据处理、文件数据处理、以及相关的API而设计的,是对所学课程知识较为系统的应用  由于汇编语言编程相对其他语言编程比较复杂,因此,在设计上应把重点放在程序的功能实现上,不要太在意程序的结构和显示界面的设计不要局限于题目所规定的要求,可以灵活裁减,设计出功能更完善程序  另外,也可以自己设计题目,同时,提出详细的功能描述,经指导老师审查同意后也可作为课程设计的题目 四、提交的成果1. 设计说明书一份,内容包括:包含任务书一份1) 中文摘要100字,关键词3-5个。

2) 实训题目、内容、要求3)总体设计(包含几大功能模块)4)详细设计(各功能模块的具体实现算法——流程图)5)数据结构设计描述,各模块(函数)的功能介绍,参数说明等6)调试分析(包含各模块的测试用例,及测试结果7)总结(实训完成了哪些功能,还有哪些地方需要改进,及通过实训有何收获,调试程序的体会等)8) 参考文献、致谢等五、主要参考资料[1]李敬兆等编.《汇编语言程序设计》.合肥:中国科学技术大学出版社,2008.9 [2]李敬兆等编.《汇编语言程序设计实验教程及习题解答》.合肥:中国科学技术大学出版社,2008.9 [3]王爽等编.《汇编语言》.北京:清华大学出版社,2003.5 [4]曹加恒等编.《新一代汇编语言课程设计》.北京:高等教育出版社,2003.6 [5]杨路明等编.《汇编语言程序设计》.长沙:中南大学出版社,2005.8 [6]詹仕华等编.《汇编语言程序设计》.北京:中国电力出版社,2008.2 [7]詹仕华等编.《汇编语言程序设计习题解答及课程设计、设计》.北京:中国电力出版社,2008.2 [8]宋彩莉等编.《汇编语言程序设计学习指导》.西安:西安交通大学出版社,2008.2 六、各阶段时间安排(共1周)日期内容地点星期一教师讲解设计要求,准备参考资料实验室星期二分析系统,方案设计实验室星期三方案设计,编程实验室星期四调试程序,书写实训说明书实验室星期五完成实训说明书,答辩实验室摘要  此次汇编语言课程说明书根据设计任务阐述粒子运动动画汇编程序的设计基本思想与方案,绘制程序流程图,运用8086CPU提供的指令、伪指令、宏指令,同时给出说明注释。

并利用计算机提供的软件调试工具对所编写程序进行调试,记录下整个调试分析的过程与运行结果 关键词:粒子运动动画、汇编语言、方案、调试 目录1、概述 - 1 -1.1课程设计的目的 - 1 -1.2课程设计的要求 - 1 -2、 系统分析 - 3 -2.1 主程序设计思想 - 3 -2.2粒子动画设计思想 - 3 -(1)建立窗口 - 3 -(2)生成种子 - 4 -(3)呈现游走动画效果 - 4 -(4)本程序所涉及的主要知识点 - 4 -2.3 本章小结 - 4 -3、 详细设计 - 5 -3.1主程序流程图 - 5 -3.2部分模块说明 - 6 -(1)主程序: - 6 -(2)初始化种子子程序 - 7 -(3) 单步(n个像素距离内的)随机行走部分 - 8 -3.3其他主要子程序说明 - 11 -(1)绘制路线子程序 - 11 -(2) 随机数发生器子程序 - 13 -(4) 弱化内存设备数据区像素的颜色子程序 - 13 -(5)其他功能子程序 - 13 -3.4本章小结 - 13 -4、 程序的调试与运行结果说明 - 14 -4.1程序调试 - 14 -4.2程序运行 - 14 -4.3本章小结 - 15 -5、 课程设计总结 - 16 -5.1设计的特点、不足 - 16 -5.2收获与体会 - 16 -参考文献 - 17 -致谢 - 18 -附录:程序清单 - 19 -1 概述1.1课程设计的目的汇编语言是计算机能够提供给用户使用的最快而又最有效的语言,也是能够利用计算机硬件特性并能直接控制硬件的唯一语言。

汇编语言程序设计课程设计是在教学实践基础上进行的一次大型实验,也是对该课程所学理论知识的深化和提高因此,要求我们能综合应用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验的基本技能方面上进行一次全面的训练对我们掌握知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力进行考核培养我们综合运用所学知识独立完成汇编程序课题的能力使我们能够较全面地巩固和应用课堂中所学的基本理论和程序设计方法,能够较熟练地完成汇编语言程序的设计和调试提高我们对工作认真负责、一丝不苟,对同学团结友爱,协作攻关的基本素质培养我们从资料文献、科学实验中获得知识的能力,提高我们从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力培养我们勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质1.2课程设计的要求动画程序设计要求完成一个在显示器上显示一个图形动画设计,即当程序运行时可看到移动的图形或图像比如:当程序运行之后,即可让一个图形或图像实现在窗口中央集中,然后在黄口范围内只有运动此程序涉及到宏和I/O中断的调用,要求我们掌握对宏的定义和使用,使用汇编语言对I/O中断的使用。

小组成员分工协作完成要求我们每个成员有自己相对独立的模块,同时要了解其他组员完成的内容学生查阅相关资料,自学具体课题中涉及到的新知识,能够按照老师的要求对待设计的系统的程序流程图进行正确地绘制学生在老师的指导下,能够写出相应的源程序代码,采用结构化、模块化程序设计方法,功能要完善,界面要美观所设计的系统原则上要能够运行无误,结果准确在条件允许的情况下,学生能够最终将系统所要实现的功能演示出来最后经验收合格后,按要求写出课程设计报告总体设计应配合软件总体模块结构图来说明软件应具有的功能详细设计应用传统或N-S流程图和屏幕抓图说明,调试的叙述应配合出错场景的抓图来说明出现了哪些错误,如何解决的2 系统分析2.1 主程序设计思想 本程序主要实现在窗口内粒子的运动,可以分为三大块:首先窗口界面的生成,其次随机生成N个随机种子变量,使其实现在窗口中央集中最后第三部分是运动轨迹的绘制,主要实现种子在窗口中各方向实运动的动态效果,动画的原理实质上是在屏幕上连续的间隔较小的地方显示相同的图案由于人眼具有视觉暂留的特性,我们就会看到“运动”的画面模块图如下: 总体窗口的建立 生成种子呈现游走动画效果 图2-1 模块图2.2粒子动画设计思想(1)建立窗口此模块要呈现一个窗口用来作为显示动画的幕布。

首先要选用ProcWinMain定义主要的窗口函数,在用PAINT消息完成客户区的更新或失效区域的绘制,然后建立窗口在窗口程序中利用invoke、uMsg == WM_COMMAND、DIB_RGB_COLORS等一系列的函数以及窗口消息函数,来实现种子初始化、窗口像素淡化等一系列子程序的调用与实现因为要实现一系列的条件判断,所以用了大量的if条件的嵌套使用每隔一定的时间关标要移动,才能画出完整的图形,所以还需设置延时的时间2)生成种子此模块主要是想实现多种子在窗口内的生成联系实际,可以通过定义多变量以及一个过滤的定义来实现为类是程序达到可编程性要求使用while 语句所以需要根据需要来设置时间和行列变化方向,可根据想要呈现的图形效果具体设计3)呈现游走动画效果此模块主要是想呈现一个游走动画效果,联想现实生活中的动画,物体要车呈现一定规律,想要使程序呈现出这种动态效果,必须是人眼看到粒子是在移动的,而产生移动效果则可通过绘制不同方向的轨迹来实现,同样也需要采用延时,才能显示出更好的效果,本程序基本设计为粒子的随机移动4)本程序所涉及的主要知识点模块化设计方法:模块化设计方法是按照各部分程序所实现的不同功能把程序划分成多个模块,各个模块在明确各自的功能和相互间的连接约定后,就可以分别编制和调试程序,最后再把它们连接起来,形成一个大程序。

这是一种很好的程序设计方法,而子程序结构就是模块化程序设计的基础子程序:子程序又称为过程,它相当于高级语言中的过程和函数在一个程序的不同部分,往往要用到类似的程序段,这些程序段的功能和结构形式都相同,只是某些变量的赋值不同,此时就可以把这些程序段写成子程序的形式,以便需要时可以调用它2.3 本章小结通过初步的设计,我设计出了程序所要实现的效果,整体把握了程序的实现方法,并整理了整个程序的实现思路,在这过程中,最初想了几种实现方案,最后通过对程序实现的可行性和效率的分析,选了一种最适合的实现方案通过本阶段的设计、分析,做出了一个总体设计方案3 详细设计3.1主程序流程图 程序主要是设计为子程序调用的方法来实现,将各个模块设计为不同的子程序,然后在主程序中来调用这些子程序,每个子程序中都会调用延时子程序,以便达到想要的效果,主程序流程图如下: 开始定义相关变量建立并显示窗口口调用初始化种子的子程序重设相关变量调用单步随机行走子程序 调用窗口程序关闭窗口 结束图3-1 主程序流程图3.2部分模块说明 (1)主程序: 主程序定义了许多变量,是为后面画图形做一个标志和跳转的作用,这里没有用寄存器的原因是,此程序需要存值的地方很多,而寄存器的数量有限,为避免寄存器的值相互干扰,故另外定义变量。

在主程序中,设定了变量的值,然后调用子程序,依次实现动画效果dataxClient DWORD 600 ; 客户区宽度yClient DWORD 400 ; 客户区高度view DWORD 1 ; 生成模式:0无轨迹模式,1拖轨模式,2轨迹模式smode DWORD 1 ; 种子模式:0分散,1集中seed DWORD 1001 ; 种子数astep DWORD 16 ; 单步次数speed DWORD 18 ; 速度控制值(毫秒)ftime DWORD 0 ; 时钟标志:0没用,100时钟编号rngs DWORD 242343,5436,5675,67,678979098,890,32545436,657563453,23435345,143545,45976768,6754,743453455,67546,754,754324783ridx DWORD 0tn DWORD 0A2F59C2Eh ; 随机数初始值的工作变量ra DWORD 19 ; 随机数因子rb DWORD 91 ; 随机数平移rn DWORD 0A2F59C2Eh ; 随机数初始值r0rs DWORD 16 ; 随机数向右移位的次数ma DWORD 3 ; 随机数掩码mf DWORD 0 ; 位0:方向数(取值4或8),位1:绝对方向行走模式还是相对模式(A或R)bkcolor DWORD 0FFFFFFHbmFile BITMAPFILEHEADER <04D42H, 0, 0, 0, 54>bmInfo BITMAPINFOHEADER bmFilter BYTE "位图文件(*.BMP)", 0, "*.BMP", 0, "所有文件(*.*)", 0, "*.*", 0, 0bmDefExt BYTE "BMP", 0szCap BYTE "粒子运动动画", 0format BYTE "%u",0.data?hInstance DWORD ?hWinMain DWORD ?hdcTemp HDC ?seedxch DWORD ?strtemp BYTE 1024 dup (?)hBitmapTemp HBITMAP ?mTemp DWORD ?bitmapTemp BITMAP ; 背景位图信息ofn OPENFILENAME filename BYTE MAX_PATH dup(?)pathname BYTE MAX_PATH dup(?)ALIGN 16ats ATOMST 10000 dup() ; 种子数组att DWORD 10000 dup(?)crCustColors DWORD 16 dup(?) .constszClassName db 'rpClass',0;-------------------------------------(2)初始化种子子程序 此程序设计的是先初始化种子,分散的种子。

随机产生n个初始点和颜色对于此部分,我把它设计为一个子程序,然后在中分别调用其他子程序来实现想要的效果,具体实现代码如下:RandProc proc hDlg:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD .if uMsg == WM_INITDIALOG invoke setIPs, hDlg, IDC_EDIT01, ra invoke setIPs, hDlg, IDC_EDIT03, rb invoke setIPs, hDlg, IDC_EDIT02, rn invoke setIPs, hDlg, IDC_EDIT04, rs jmp ItRet0 .elseif uMsg == WM_COMMAND .if wParam == IDOK invoke getIPs, hDlg, IDC_EDIT01 or eax, 1 mov ra, eax invoke getIPs, hDlg, IDC_EDIT03 mov rb, eax invoke getIPs, hDlg, IDC_EDIT02 mov rn, eax invoke getIPs, hDlg, IDC_EDIT04 ; 限制移位的范围 .if eax < SDWORD PTR 0 mov eax, 0 .elseif eax > 28 mov eax, 28 .endif mov rs, eax invoke EndDialog, hDlg, wParam mov eax, TRUE jmp ItRet .elseif wParam == IDCANCEL invoke EndDialog, hDlg, wParam mov eax, TRUE jmp ItRet .endif .endif ItRet0: xor eax, eax ItRet: retRandProc endp(3) 单步(n个像素距离内的)随机行走部分 此段程序使用循环体以及条件语句的嵌套使用实现各个种子的随机游走,同时配合其余子程序模块实现其始终处于冲口内部。

该子程序是整个程序的核心部分,具体实现代码如下:第一部分:Step proc uses ebx, hdcT:HDC, _n:DWORD LOCAL _k:DWORD .if view == 3 mov ebx, offset ats mov edx, offset att mov ecx, seed .while ecx mov eax, [ebx] mov [edx], eax add ebx, 8 add edx, 4 dec ecx .endw .endif mov ecx, 0 .while ecx < _n push ecx mov ebx, offset ats mov eax, seed mov _k, eax .while _k call rnd ; rnd()为:产生0,1,2,3的随机数发生器 and eax, 3 .if eax == 0 inc [ebx].ATOMST.x ; 向右行走一个像素的距离 .elseif eax == 1 dec [ebx].ATOMST.y ; 向上行走一个像素的距离 .elseif eax == 2 dec [ebx].ATOMST.x ; 向左行走一个像素的距离 .elseif eax == 3 inc [ebx].ATOMST.y ; 向下行走一个像素的距离 .elseif eax == 4 inc [ebx].ATOMST.x dec [ebx].ATOMST.y .elseif eax == 5 dec [ebx].ATOMST.x dec [ebx].ATOMST.y .elseif eax == 6 dec [ebx].ATOMST.x inc [ebx].ATOMST.y .else inc [ebx].ATOMST.x inc [ebx].ATOMST.y .endif    此程序主要是图像的移动,通过不同的值的定义实现图像向不同方向的移动。

第二个子程序:; 水平方向上的越界检查(越界时进行回绕处理) movsx eax, [ebx].ATOMST.x .if eax < SDWORD PTR 0 mov eax, xClient dec eax mov [ebx].ATOMST.x, ax .elseif eax >= xClient mov eax, 0 mov [ebx].ATOMST.x, ax .endif ; 垂直方向上的越界检查(也做回绕处理) movsx edx, [ebx].ATOMST.y .if edx < SDWORD PTR 0 mov edx, yClient dec edx mov [ebx].ATOMST.y, dx .elseif edx >= yClient mov edx, 0 mov [ebx].ATOMST.y, dx .endif ; 绘制当前状态(向@hDc设备绘制一点) movzx eax, [ebx].ATOMST.x movzx edx, [ebx].ATOMST.y .if view != 3 invoke SetPixel,hdcT,eax,edx,[ebx].ATOMST.color .endif add ebx, sizeof ATOMST dec _k .endw pop ecx inc ecx .endw此程序是利用如.if eax < SDWORD PTR 0类的条件语句规定程序的执行范围,使种子图像始终在窗口内来回不同轨迹的游走。

3.3其他主要子程序说明(1)绘制路线子程序 此程序用于绘制粒子运动的不同轨迹,在不同的时间使其粒子想不通的方向产生运动轨迹绘制整条直线及用算法实现范围的计算,分别定义长和宽为_x,_xx,_y,_yy,利用坐标思维_xx-_x,_yy-_y来实现场合矿的计算利用坐标点绘制直线来实现横向和竖向的运动轨迹效果如下图所示:横向路线轨迹分解: 图3-3 颜色变换一 图3—1轨迹分解图代码如下:; 绘制直线drawLine proc uses ebx esi edi, _x:SWORD, _y:SWORD, _xx:SWORD, _yy:SWORD, _color:DWORD LOCAL incx:SDWORD, incy:SDWORD mov eax, bitmapTemp.bmHeight movzx ecx, _y sub eax, ecx dec eax imul eax, bitmapTemp.bmWidthBytes movzx edx, _x shl edx, 2 add eax, edx mov edi, mTemp add edi, eax ; 计算两个方向的画线距离 movzx eax, _xx movzx edx, _x sub eax, edx ; dx = xx - x movzx edx, _y movzx ecx, _yy sub edx, ecx ; dy = yy - y ; 计算两个方向的步长 mov ebx, 4 .if (eax < SDWORD PTR 0) neg ebx neg eax .elseif !eax mov ebx, eax .endif mov incx, ebx mov ecx, bitmapTemp.bmWidthBytes .if (edx < SDWORD PTR 0) neg ecx neg edx .elseif !edx mov ecx, edx .endif mov incy, ecx mov ebx, _color ; 绘制整条直线 .while ecx mov [edi], ebx add esi, eax add edi, incy .if esi >= SDWORD PTR 0 add edi, incx sub esi, edx .endif dec ecx .endw .endif ; mov [edi], ebx retdrawLine endp(2) 随机数发生器子程序此程序用于产生随机数,对应种子时间内的路径。

4) 弱化内存设备数据区像素的颜色子程序 此程序用于弱化内存设备数据区像素的颜色,使其背景显示纯色 (5)其他功能子程序 选取背景颜色程序子程序,获取对话框中指定编辑框的整数设置子程序,对话框中指定编辑框的初始值保存位图文件选择框子程序,获取有效的全路径文件名子程序,将内存设备位图写到文件系统参数设置对话框过程子程序等子程序共同下更好的实现程序要求3.4本章小结 整个代码部分的设计,本小组分工合作完成,程序难点在于行列变换的情况较复杂,所以需跳转很多次,定义了许多变量来存放定义的值,起着标志的作用,通过比较值是否与预设的值相等,来实现跳转完成此部分后,我对子程序设计方法有了更进一步的了解,对于跳转语句的使用更加熟练,程序设计的能力也有所提升,思维更加严谨4 程序的调试与运行结果说明4.1程序调试程序的分析、代码的编写完成后,开始对代码进行编译和调试,,程序调如图如下:图4—1 调试图4.2程序运行1) 程序执行后建立窗口,在窗口中实现粒子种子的初始化并调用如下图使粒子种子集中于中央并显示图4—2运行图(1)2)窗口建立调用粒子种子,程序嗲用字程序实现粒子种子在窗口内的随机行走。

图4—3运行图(2)2)如图程序实现了对粒子种子的范围划定 图4—4运行图(3)4.3本章小结 通过对程序的编译、调试和运行,我对代码的调试方法更加熟悉,并了解到自己程序的不足之处,知道怎样去修改代码以及简化代5 课程设计总结5.1设计的特点、不足在动画程序中,通过对变量的定义以及对各子程序的调用,实现了对粒子的显示并移动,使其呈现动画效果让人在视觉上产生美感,程序尚有不足,比如效果不是很多,动画单一等5.2收获与体会在编程的过程中,遇到了很多没有预料到的困难,有很多知识点之前了解的很模糊,于是在编程变成完成之后,有很多细节上面的错误,不仅繁杂,而且有时候错误很隐蔽,给查找错误带来很大的困难这次实验让我明白了流程图的重要性,刚开始写程序的时候,直接就动手了,结果程序写的很乱,执行起来的效果也不好后来动手画了流程图,把大概的框架写好,然后依据框架一点一点编写程序,发现写程序变得简单了很多,通过流程图,每一步要做什么事情,完成什么任务变得很清晰思路清晰以后,不仅程序编写更加容易,查找错误也更加轻松通过这次课设,我认识到我以前对流程图的观点是错误的,也更加熟悉了流程图的使用。

通过这次课程设计,我懂得了理论和实际相结合的重要性,在理论方面,看上去很容易实现的东西,实际操作起来,并没有那么容易经过这次编程,我提高了自己的动手能力和独立思考的能力,解决了很多难题参考文献[1]李敬兆等编.《汇编语言程序设计》.合肥:中国科学技术大学出版社,2008.9 [2]李敬兆等编.《汇编语言程序设计实验教程及习题解答》.合肥:中国科学技术大学出版社,2008.9 [3]王爽等编.《汇编语言》.北京:清华大学出版社,2003.5 [4]曹加恒等编.《新一代汇编语言课程设计》.北京:高等教育出版社,2003.6 [5]杨路明等编.《汇编语言程序设计》.长沙:中南大学出版社,2005.8 [6]詹仕华等编.《汇编语言程序设计》.北京:中国电力出版社,2008.2 [7]詹仕华等编.《汇编语言程序设计习题解答及课程设计、设计》.北京:中国电力出版社,2008.2 [8]宋彩莉等编.《汇编语言程序设计学习指导》.西安:西安交通大学出版社,2008.2 致谢汇编语言课程设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题能力的重要环节,是对学生实际动手能力的具体训练和考察过程。

随着科学技术发展的日新日异,计算机的在生活各方面中的广泛应用到达了空前的阶段差不多一周的时间过去了,回顾这段日子,至今我仍感慨良多从选课题到定稿,从理论到实践,在这过程中有苦也有甜通过这次课设不仅巩固了我们平时所学的知识,查缺补漏;同时也让我们学到了许多在课本上没有的知识;使我懂得了理论与实际相结合的重要性,光有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才算是真正掌握了一门知识,并使自己得到提升在此次设计的过程中我们遇到了许多难题,比如说设计一个程序应该从哪着手,如何调试程序,发现问题如何解决等,但经过小组的讨论与学习,我们共同解决了这些问题,并在这过程中建立了深厚的友谊,更使我们认识到团队合作的重要性,与团结的力量,这给我们今后的生活有很大的启发在刘树群老师的辛勤的指导与小组成员的共同努力下,此次汇编语言课程设计终于顺利完成!其间遇到的许多问题都游逆而解!同时,从刘树群老师的身上我学到了许多知识,在此我向刘老师表示我深切的感谢之情!与此同时,对我们小组内的各成员以及给过我帮助的所有同学与老师也表示我忠心的祝福与感谢!附录:程序清单 .486 .model flat,stdcall option casemap:none;--------------------------------------------------------------------include D:\MASMplus\INCLUDE\windows.incinclude D:\MASMplus\INCLUDE\gdi32.incincludelib D:\MASMplus\LIB\gdi32.libinclude D:\MASMplus\INCLUDE\user32.incincludelib D:\MASMplus\LIB\user32.libinclude D:\MASMplus\INCLUDE\kernel32.incincludelib D:\MASMplus\LIB\kernel32.libinclude D:\MASMplus\include\comctl32.incincludelib D:\MASMplus\lib\comctl32.libinclude D:\MASMplus\include\comdlg32.incincludelib D:\MASMplus\lib\comdlg32.libIDD_ABOUTBOX equ 200IDD_RNDPARAM equ 201IDD_SYSPARAM equ 202IDC_EDIT01 equ 1000IDC_EDIT02 equ 1001IDC_EDIT03 equ 1002IDC_EDIT04 equ 1003IDC_RADIO1 equ 1004IDC_RADIO2 equ 1005IDC_RADIO3 equ 1006IDC_RADIO4 equ 1007IDC_RADIO5 equ 1008IDC_RADIO6 equ 1009IDC_RADIO7 equ 1010IDC_RADIO8 equ 1011IDC_RADIO9 equ 1012IDC_RADIO10 equ 1013IDC_AWALK equ 4000IDM_RESTART equ 2000IDM_DELAY equ 2001IDM_SAVEIMG equ 2002IDM_EXIT equ 2003IDM_SYSPARAM equ 2004IDM_RNDPARAM equ 2005IDM_BKCOLOR equ 2006IDM_ABOUT equ 2007MainMenu equ 3000;--------------------------------------------------------------------; 种子点结构:种子坐标(x,y),颜色colorATOMST STRUCT x SWORD ? y SWORD ? color DWORD ?ATOMST ENDS.dataxClient DWORD 600 ; 客户区宽度yClient DWORD 400 ; 客户区高度view DWORD 1 ; 生成模式:0无轨迹模式,1拖轨模式,2轨迹模式smode DWORD 1 ; 种子模式:0分散,1集中seed DWORD 1001 ; 种子数astep DWORD 16 ; 单步次数speed DWORD 18 ; 速度控制值(毫秒)ftime DWORD 0 ; 时钟标志:0没用,100时钟编号rngs DWORD 242343,5436,5675,67,678979098,890,32545436,657563453,23435345,143545,45976768,6754,743453455,67546,754,754324783ridx DWORD 0tn DWORD 0A2F59C2Eh ; 随机数初始值的工作变量ra DWORD 19 ; 随机数因子rb DWORD 91 ; 随机数平移rn DWORD 0A2F59C2Eh ; 随机数初始值r0rs DWORD 16 ; 随机数向右移位的次数ma DWORD 3 ; 随机数掩码mf DWORD 0 ; 位0:方向数(取值4或8),位1:绝对方向行走模式还是相对模式(A或R)bkcolor DWORD 033FF00hbmFile BITMAPFILEHEADER <04D42H, 0, 0, 0, 54>bmInfo BITMAPINFOHEADER bmFilter BYTE "位图文件(*.BMP)", 0, "*.BMP", 0, "所有文件(*.*)", 0, "*.*", 0, 0bmDefExt BYTE "BMP", 0szCap BYTE "粒子运动动画", 0format BYTE "%u",0.data?hInstance DWORD ?hWinMain DWORD ?hdcTemp HDC ?seedxch DWORD ?strtemp BYTE 1024 dup (?)hBitmapTemp HBITMAP ?mTemp DWORD ?bitmapTemp BITMAP ; 背景位图信息ofn OPENFILENAME filename BYTE MAX_PATH dup(?)pathname BYTE MAX_PATH dup(?)ALIGN 16ats ATOMST 10000 dup() ; 种子数组att DWORD 10000 dup(?)crCustColors DWORD 16 dup(?) .constszClassName db 'rpClass',0;--------------------------------------------------------------------.code; 初始化种子initSeed proc uses ebx, _n:DWORD LOCAL x0:SDWORD,y0:SDWORD, tt mov ecx, seed mov ebx, offset ats mov eax, tn .if !smode ; 分散的种子。

随机产生n个初始点和颜色 .while ecx mul ra ; eax = a*r add eax, rb ; eax = a*r+b cdq mov tn, eax idiv xClient mov [ebx].ATOMST.x, dx mov eax, tn mul ra add eax, rb cdq mov tn, eax idiv yClient mov [ebx].ATOMST.y, dx mov eax, tn mul ra add eax, rb mov tn, eax mov edx, eax shr edx, 8 and edx,7F7F7FH ; 限制随机颜色的亮度 mov [ebx].ATOMST.color, edx add ebx, sizeof ATOMST dec ecx .endw .else ; 集中的种子使用当前窗口的中心点作为所有种子的初始位置 mov edx, xClient shr edx, 1 mov x0, edx mov edx, yClient shr edx, 1 mov y0, edx .while ecx mov edx, x0 mov [ebx].ATOMST.x, dx mov edx, y0 mov [ebx].ATOMST.y, dx mul ra add eax, rb mov tn, eax mov edx, eax shr edx, 8 and edx, 7F7F7FH mov [ebx].ATOMST.color, edx add ebx, sizeof ATOMST dec ecx .endw .endif retinitSeed endp; 将内存设备数据区用color进行覆盖bkSetcolor proc _m:DWORD, _color:DWORD LOCAL _k:DWORD, _N:DWORD mov edx, _m mov eax, bitmapTemp.bmHeight mov _N, eax .while _N mov eax, bitmapTemp.bmWidth mov _k, eax mov eax, _color .while _k mov DWORD PTR [edx], eax add edx, 4 dec _k .endw dec _N .endw retbkSetcolor endp; 弱化内存设备数据区像素的颜色bkGrey proc _m:DWORD, _color:DWORD LOCAL _k:DWORD, _N:DWORD LOCAL _r:DWORD, _g:DWORD, _b:DWORD movzx eax, BYTE PTR _color mov _r, eax movzx eax, BYTE PTR _color+1 mov _g, eax movzx eax, BYTE PTR _color+2 mov _b, eax mov edx, _m mov eax, bitmapTemp.bmHeight mov _N, eax .while _N mov eax, bitmapTemp.bmWidth mov _k, eax .while _k ; 新像素 = (原像素 + 背景颜色) / 2 movzx eax, BYTE PTR [edx] add eax, _r shr eax, 1 mov [edx], al movzx eax, BYTE PTR [edx+1] add eax, _g shr eax, 1 mov [edx+1], al movzx eax, BYTE PTR [edx+2] add eax, _b shr eax, 1 mov [edx+2], al add edx, 4 dec _k .endw dec _N .endw retbkGrey endp; 随机数发生器(产生0-3或0-7的随机数)rnd proc mov eax, ra mov edx, tn imul eax, edx ; eax = a*r add eax, rb ; eax = a*r+b mov ecx, rs mov tn, eax ; rn = a*r+b shr eax, cl ; eax = (a*r+b)/(2^s) .if mf&2 ; 相对方向模式,从当前方向算起 add eax, edx .endif and eax, ma ; eax = ((a*r+b)/(2^s))%m为返回值 retrnd endp; 绘制直线drawLine proc uses ebx esi edi, _x:SWORD, _y:SWORD, _xx:SWORD, _yy:SWORD, _color:DWORD LOCAL incx:SDWORD, incy:SDWORDmov eax, bitmapTemp.bmHeight movzx ecx, _y sub eax, ecx dec eax imul eax, bitmapTemp.bmWidthBytes movzx edx, _x shl edx, 2 add eax, edx mov edi, mTemp add edi, eax ; 计算两个方向的画线距离 movzx eax, _xx movzx edx, _x sub eax, edx ; dx = xx - x movzx edx, _y movzx ecx, _yy sub edx, ecx ; dy = yy - y ; 计算两个方向的步长 mov ebx, 4 .if (eax < SDWORD PTR 0) neg ebx neg eax .elseif !eax mov ebx, eax .endif mov incx, ebxmov ecx, bitmapTemp.bmWidthBytes .if (edx < SDWORD PTR 0) neg ecx neg edx .elseif !edx mov ecx, edx .endif mov incy, ecx mov ebx, _color; 计算较大的方向长度 .if (eax >= edx) shl edx, 1 mov esi, edx mov ecx, eax sub esi, eax shl eax, 1 ; 绘制整条直线 .while ecx mov [edi], ebx add esi, edx add edi, incx .if esi >= SDWORD PTR 0 add edi, bitmapTemp.bmWidthBytes sub esi, eax .endif dec ecx .endw .else shl eax, 1 mov esi, eax mov ecx, edx sub esi, edx shl edx, 1 ; 绘制整条直线 .while ecx mov [edi], ebx add esi, eax add edi, incy .if esi >= SDWORD PTR 0 add edi, incx sub esi, edx .endif dec ecx .endw .endif ; mov [edi], ebx retdrawLine endp; 单步(n个像素距离内的)随机行走Step proc uses ebx, hdcT:HDC, _n:DWORD LOCAL _k:DWORD .if view == 3 mov ebx, offset ats mov edx, offset att mov ecx, seed .while ecx mov eax, [ebx] mov [edx], eax add ebx, 8 add edx, 4 dec ecx .endw .endif mov ecx, 0 .while ecx < _n push ecx mov ebx, offset ats mov eax, seed mov _k, eax .while _k call rnd ; rnd()为:产生0,1,2,3的随机数发生器 and eax, 3 .if eax == 0 inc [ebx].ATOMST.x ; 向右行走一个像素的距离 .elseif eax == 1 dec [ebx].ATOMST.y ; 向上行走一个像素的距离 .elseif eax == 2 dec [ebx].ATOMST.x ; 向左行走一个像素的距离 .elseif eax == 3 inc [ebx].ATOMST.y ; 向下行走一个像素的距离 .elseif eax == 4 inc [ebx].ATOMST.x dec [ebx].ATOMST.y .elseif eax == 5 dec [ebx].ATOMST.x dec [ebx].ATOMST.y .elseif eax == 6 dec [ebx].ATOMST.x inc [ebx].ATOMST.y .else inc [ebx].ATOMST.x inc [ebx].ATOMST.y .endif ; 水。

下载提示
相关文档
正为您匹配相似的精品文档