计算机图形学 课程设计作品
计算机图形学的课程设计

计算机图形学课程设计设计题目:画三次Bezier曲线和三次B样条曲线班级:姓名:学号:一、总体目标和要求1 课程设计目的本课程主要内容包括计算机图形学的研究内容、发展与应用,图形输入输出设备,图形显示原理,图形软件标准,基本图形生成算法,图形几何变换与裁剪,自由曲线和曲面,三维实体造型,分形几何造型,分形艺术,隐藏面消除,光照模型,颜色模型,光线跟踪,纹理细节模拟,常用的计算机动画技术和软件等。
通过本课程设计,使自己了解计算机图形学的有关原理、算法及系统,掌握基本图形显示程序设计方法,及二维和三维图形变换程序设计方法,为进一步学习计算机辅助设计方面的技术知识打下基础。
2 目标以图形学算法为目标,深入研究。
续而策划设计实现一个能够表现计算机图形学算法原理的或完整过程的演示系统,并能从某些方面做出评价和改进意见。
通过完成一个完整程序,经历策划、设计、开发、总结。
达到:(1)巩固和实践计算机图形学课程中的理论和算法;(2)学习表现计算机图形学算法的技巧;(3)培养认真学习积极探索的精神。
3总体要求策划、设计并实现一个能够充分表现图形学算法的系统,界面要求美观大方,能清楚地演示算法执行的每一个步骤。
二、内容与要求1设计题目画三次Bezier曲线和三次B样条曲线。
2设计要求利用计算机图形学原理画出三次Bezier曲线和三次B样条曲线。
三、算法描述(1)画三次Bezier曲线根据Q(t)=∑P i•B• C i n t i(1-t)n-i(∑中的n=3)并且 C i nBEZ 0,3BEZ 1,3(u)=3u(1-u)(1-u)BEZ2,3(u)=3uu(1-u)BEZ3,3(u)=3uuu三次Bezier函数可以写成P(u)=[u3 u2 u 1]×M×[a b c d] 其中M=[ -1 3 -3 1 ]3 -6 -3 0-3 3 0 01 0 0 0i=0(2)画三次B样条曲线Q i,3(t)=∑P i+l F l,3(t)= P i F0,3(t)+ P i+1 F1,3(t)+ P i+2 F2,3(t)+ P i+ 3 F3,3(t)(其中∑中的n=3)因为四个调和函数F0,3(t)、F1,3(t)、F2,3(t)和F3,3(t) 已知(参看公式7-5-3)因此只要给出四个控制点的位置矢量的坐标,当t在[0,1]范围内取离散地取100个点时(dt=0.01),分别求出每一个曲线上点,相邻点用直线段连接起来,就可以得到相应的B样条曲线。
计算机图形学课程设计——扫雷游戏程序设计

计算机图形学课程设计——扫雷游戏程序设计《计算机图形学》课程设计报告VC++扫雷游戏的程序设计专业班级:小组成员:指导老师:日期:2012年12月24日1、需求分析本课程设计实现类似于Windows XP操作系统自带的扫雷游戏。
该设计以V isual C++ 6.0为开发环境, Windows 7/XP为程序运行平台。
在程序设计中,把整个雷区看成一个二维数组,把雷方块定义为具有所在雷区二维数组的行和列、当前状态、方块属性、历史状态的结构体,采用了MFC机制解决问题的方法。
整个游戏程序包括了布雷、扫雷过程和结果三个阶段,在处理鼠标响应事件中伴随着GDI绘图。
程序通过调试运行,实现简单的设计目标,满足扫雷游戏初学者的需要。
通过本课程设计,以便更好的巩固计算机图形学相关知识,掌握课程设计基本的方法和技巧,同时增加同学之间的团队合作精神以及培养分析问题、解决问题的能力。
2.总体设计2.1 功能概述扫雷游戏的游戏界面如图1所示。
在这个界面中,由众多面积均等的小方块所组成的区域称之为雷区,雷区的大小由用户设置的游戏等级决定。
图1游戏开始时,系统会在雷区中随机布下若干个地雷。
安放地雷的小方块称之为雷方块,其他的称之为非雷方块。
部署完毕后,系统会在其他非雷方块中填充一些数字。
某一个具体数字表示与其紧邻的8个方块中有多少雷方块。
玩家可以根据这些信息去判断是否可以鼠标点击方块,并把认为是地雷的方块打上标识。
当玩家将所有地雷找出后,其余的非雷方块区域都已打开,此时游戏结束。
在游戏过程中,一旦错误地打开了雷方块则立即失败,游戏结束。
游戏规则总结:●开始:按左键开始游戏,按按钮或菜单重新开始。
●左键:按下时,是雷则结束,非雷则显示数字。
●数字:代表此数字周围一圈八格中雷的个数。
●右键:奇次按下表示雷,偶数按下表示对上次的否定。
●结束:左键按到雷结束,找出全部雷结束。
在游戏开始后,雷区上方有两个计数器。
右边的计数器显示用户扫雷所花费的总时间,以秒为单位;左边的计数器显示当前还剩余多少个雷方块。
计算机图形学课程设计

课程设计报告课程名称计算机图形学课题名称飘扬的旗帜专业计算机科学与技术班级计算机0502学号200503010203姓名蒋维琴指导教师刘长松2008年7 月10 日湖南工程学院课程设计任务书课程名称计算机图形学课题飘扬的旗帜专业班级计算机0502学生姓名蒋维琴学号200503010203指导老师刘长松审批任务书下达日期2008年6 月28 日任务完成日期2008 年7 月10 日一、设计内容与设计要求1.设计内容:飘扬的旗帜,要求该旗帜中有几何图形,旗帜不停地飘动,同时可断地移动,移动的路线可以随机,要求按ESC停止转动,按↑加快速度,按↓减慢速度。
2.设计要求:在屏幕上连续出现飘扬的旗帜,同时不断地在上、下、左、右移动;按↑加快移动速度,按↓减慢移动速度。
3.算法提示:可用自由曲线(Bezier曲线、或B样条曲线)或自由曲面(Bezier曲面、或B样条曲面)来设计旗帜的形状,并将坐标用数组保存;不断改变曲线或曲面的坐标值,可得到不同的曲线形状。
对三维曲面,还可用坐标变换来改变曲线的形状;对移动的路线可以选择一条规则曲线,用随机函数来产生它的起始值和幅度。
当旗帜移动到屏幕的两端时又产生一条新的确良曲线。
这样屏幕上用将产生了不同的移动曲线。
二、进度安排第18 周星期五8 时00分——12时00分星期五14 时30分——18时30分星期六8 时00分——12时00分附:课程设计报告装订顺序:封面、任务书、目录、正文、附件(A4大小的图纸及程序清单)、评分。
正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序原代码)。
目录一、主要功能 (1)二、功能模块的划分 (1)2.1画旗杆 (1)2.2画旗面 (1)2.3画五角星 (1)2.4飘动速度 (1)三、主要功能的实现 (2)3.1总体流程图 (2)3.2画旗面 (2)3.3画五角星 (3)四、程序调试 (4)4.1调试问题 (4)4.2调试结果 (5)五、总结 (5)六、附件: (6)源程序清单 (6)计算机科学与技术系课程设计评分表 (10)一、主要功能画一面红旗,包括旗杆、旗面、五角星。
计算机图形学课程设计

《计算机图形学》课程设计报告学院:专业:班级:姓名:学号:指导教师:年11 月15 日一、课程设计报告内容说明:1 、直线:1.1 点生成直线利用for 循环,用pDC->SetPixel(int x,int y,RGB(a,b,c))像素函数画出直线。
1.2 DDA :根据直线的微分方程来产生直线,即dy/dx=△y/△x=(12y y -)/(12x x -)=k其中(1x ,1y )、(2x ,2y )是直线的两个端点坐标。
DDA 算法的原理是增量法,即使x 和y 同时以很小的步长增长,每次增长量与x 和y 的一阶导数成正比。
直线的一阶导数是与△x 和△y 成正比的函数。
可以将x 和y 各递增ε△x 和ε△y 来产生线,ε是很小的量。
从当前画线任意点的位置(i x ,i y )上分别递增两个增量ε△x 和ε△y ,就可以得到直线增长的下一个(1+i x ,1+i y )的坐标位置公式如下1+i x =ix +ε△x1+i y =i y +ε△y1.3 金刚石将圆分为20份,利用直线生成的MoveTo 和LineTo 函数,使每个点与其他点相连。
展示图形为:点生成直线、数值微分法画直线、金刚石 2、曲线2.1 直角坐标系:写出参数表达式后,利用MoveTo 和LineTo 函数,连接各点。
如:正弦曲线:参数方程如下 x_SIN=1000*t; y_SIN=1000*sin(t);极坐标系:写出参数表达式后,利用MoveTo 和LineTo 函数,连接各点。
如:四叶图:参数方程如下r_SIYE=5000*sin(2*t); x_SIYE=r_SIYE*cos(t); y_SIYE=r_SIYE*sin(t);2.2 以实际工作中应用较多的参数样条曲线为例:参数样条曲线定义:给定n+1个控制点Pi (i =0,1,2,…,n ),n 次B 样条曲线段的参数表达式为: 。
依次用线段连接控制点Pi (i =0,1,2,…,n )组成的多边形称为B 样条曲线控制多边形。
计算机图形学课程设计--- 弹跳的彩球动画

课程设计任务书题目:弹跳的彩球动画课程设计任务书及成绩评定目录一、摘要 (1)二、总体设计方案及主要设计原理 (2)1.功能实现 (2)2.流程图 (2)2.1函数qiu的流程图 (2)2.2绘制球体的程序流程图 (2)2.3主程序流程图 (4)3.主要算法 (4)三、源程序代码 (5)四、测试及分析 (10)五、结束语 (11)一、摘要本课题实现一个着色的三维小球在一定的空间内按照一条给定的轨道(正弦衰弱曲线)不断弹跳并同时翻滚。
控制键为按ESC退出程序,按“↑”键完成运动加速,使得三维小球加快弹跳速度;按“↓”键完成运动减速,使得三维小球减慢弹跳速度。
并且小球在屏幕中连续不断的按照给定的曲线函数跳动,且三维小球自身也要进行翻滚。
该程序的主要模块分为如下部分:操作控制部分:该部分主要是实现对屏幕的操作,达到功能要求中按“ESC”结束程序,按“↑”加快三维小球运动,按“↓”减慢三维小球的运动。
球体绘制部分:该部分实现三维小球的绘制,其具体的是对三维球体的形状、大小、经纬线、以及在三维球体中填充颜色。
球体运动轨迹控制部分:该部分是确定球体在屏幕上的运动轨迹,从而达到程序要求的功能。
通过该部分,我们可以任意的对球体的运动轨迹进行设定,使得三维小球的运动丰富多彩。
背景控制部分:通过该部分,我们可以设定三维小球在什么样的背景下运动,对颜色的组合,使得背景更加丰富,从而完善程序的运行界面,达到美观的作用。
二、总体设计方案及主要设计原理1.功能实现通过运行程序,我们看到该程序的功能我们已经基本实现,当我们在三维小球在屏幕中按照预先给定的曲线函数路线进行运动,当我们从键盘输入“↑”时三维小球就加速运动。
当我们从键盘输入“↓”时,椭球体减速运动,按下“ESC”键就退出程序,最终达到了功能要求的目的。
2.流程图2.1函数qiu的流程图如图1所示为函数qiu的流程图:图1:函数qiu的流程图2.2绘制球体的程序流程图如图2、图3示为程序绘制球体的流程图:图2:球体绘制程序流程图1图3:球体绘制程序流程图22.3主程序流程图图4:主程序流程图3.主要算法可用绘制三维曲面(规则曲面、参数方程为:x=Rsin(α)cos(β), y=Rsin(α)sin(β), z=Rcos(α),0≤α≤180,0≤β≤360)来设计球体的形状,用轴测图将它绘制到屏幕上,并对球面上的小方格进行填充,选择5—10个不同方位的球体图形用getimage()命令将它们的图象保存;对以后路径上的图形只需用命令Putimage()调出即可。
计算机图形学课程设计

计算机图形学课程设计设计名称正四面体学号 092056132学生张译成目录1项目描述 (3)2任务配置 (3)3效果图 (3)4原理 (4)5算法 (5)6源代码 (5)7 总结 (10)项目描述本项目使用计算机图形学的知识,在屏幕是绘制一个四个面涂上不同颜色的正四面体,并且正四面体绕着其中一个顶点转动。
任务配置本程序使用Visual C++ 6.0,建立一个基于单文档的的项目。
效果图原理本程序的原理为先确定原始的正四面体的4个顶点,然后对其进行3维变换,再对其进行透视变化,然后将3维坐标转换为2维坐标,再判断每个面是否可见对其进行动态消影。
再将其画到屏幕上。
程序使用了双缓冲,并且使用定时器对坐标进行改变。
算法对坐标进行3维转换的坐标为先绕x转,再绕y转,最后绕z转,(这3个矩阵可以参考计算机图形学基础教程110面)将3个矩阵相乘可得ZH[0][0]=cos(b)*cos(c);ZH[0][1]=cos(b)*sin(c);ZH[0][2]=-sin(b);ZH[1][0]=cos(c)*sin(a)*sin(b)-cos(a)*sin(c);ZH[1][1]=sin(c)*sin(a)*sin(b)+cos(c)*cos(a);ZH[1][2]=sin(a)*cos(b);ZH[2][0]=cos(a)*sin(b)*cos(c)+sin(a)*sin(c);ZH[2][1]=cos(a)*sin(b)*sin(c)-cos(c)*sin(a);ZH[2][2]=cos(a)*cos(b);,对其进行透视变换时乘以矩阵(这个矩阵可以参考计算机图形学基础教程123面),将θ,φ都设置为45度,矩阵如下TZ[0][0]=-sqrt(2)/2;TZ[0][1]=-0.5;TZ[0][2]=-0.5;TZ[0][3]=0;TZ[1][0]=sqrt(2)/2;TZ[1][1]=-0.5;TZ[1][2]=-0.5;TZ[1][3]=0;TZ[2][0]=0;TZ[2][1]=sqrt(2)/2;TZ[2][2]=-sqrt(2)/2;TZ[2][3]=0;TZ[3][0]=0;TZ[3][1]=0;TZ[3][2]=700;TZ[3][3]=1;将3维坐标转换为2维坐标时,使用公式 x=x1/z1*d,y=y1/z1*d;对其进行动态消隐时,则在平面上取两个向量做差乘,获得其法向量,然后与视向量做数量级,并对其结果判断,大于0则画出该面,否则不画出该面。
计算机图形学课程设计报告简单图形的绘制

《计算机图形学》课程设计报告学生:学号:学院:班级:题目: 简单图形的绘制职称2015年7月1日目录目录 (I)一、选题背景 (1)二、算法设计 (2)2.1 绘制直线、圆、椭圆、抛物线 (2)2.1.1 绘制直线 (2)2.1.2 绘制圆 (2)2.1.3 绘制椭圆 (2)2.1.4 绘制抛物线 (2)2.2 三维几何变换 (2)三、程序及功能说明 (5)3.1 绘制直线、圆、椭圆、抛物线 (5)3.1.1 绘制直线 (5)3.1.2 绘制圆 (5)3.1.3 绘制椭圆 (6)3.1.4 绘制抛物线 (6)3.2 图形的平移 (6)3.3 图形的旋转 (7)3.4 图形的缩放 (7)四、结果分析 (8)4.1 绘制直线、圆、椭圆、抛物线 (8)4.1.1 直线 (8)4.1.2 圆 (8)4.1.3 椭圆 (9)4.1.4 抛物线 (9)4.2 图形的平移 (9)4.3 图形的旋转 (10)4.4 图形的缩放 (12)五、总结 (11)六、课程设计心得体会 (15)参考文献 (16)源程序 (17)一、选题背景二、算法设计2.1 绘制直线、圆、椭圆、抛物线2.1.1 绘制直线通过两个点的坐标来绘制直线。
计算机图形学中二维图形在显示输出之前需要扫描转换,生成直线的算法一般有DDA 算法和中点算法。
2.1.2 绘制圆通过运用圆的参数方程cos ;sin x a r y b r θθ=+=+来绘制圆的图形,其中[0,2]θπ∈,(a,b )为圆心,r 为半径,运用参数方程,只需要确定半径的长度和圆心的位置,即可绘制出圆。
2.1.3 绘制椭圆通过运用椭圆的参数方程cos ;sin x a y b θθ==来绘制椭圆的图形,其中[0,2]θπ∈,是已知的变量,a ,b 分别为长半轴,短半轴,当确定a 和b 后,通过参数方程即可得到这个椭圆的方程。
2.1.4 绘制抛物线根据点绘制抛物线图像是通过拟合完成,根据三个点的坐标,通过数据拟合,得到经过这三个点的函数关系式,从而再根据这个函数关系式绘制出抛物线上其他的点,形成一条连续的抛物线;或直接根据已知函数绘制图像是通过已知函数画出图像。
计算机图形学 课程设计

2、gluSphere(quadric, 0.45f, 40, 40)函数是在原点绘制图形,经过 glTranslatef* 和 glRotatef*平移和旋转可以随意改变球体位置:
glRotatef(-90.0f, 1.0f, 0.0f, 0.0f); // 将坐标系绕 X 轴旋转-90 度 glTranslatef(1.7f, 0.0f, 0.0f); // 将坐标系右移 1.7f
8、建立一个地球公转轨道,调用函数 glTranslatef*把球体平移一定距离,使其在自
4
己的轨道上运行。同时为了使月球跟随地球,glRotatef(fEarthOrbit , 0.0f, 1.0f, 0.0f); 将坐标系绕 Y 轴旋转地球公转的角度,控制月亮跟随地球,用函数 glTranslatef*平移使月 球轨道在地球周围而不与地球重叠。
5
参数代表要操作的目标,GL_PROJECTION 是对投影矩阵操作,GL_MODELVIEW 是对模型视景矩 阵操作,GL_TEXTURE 是对纹理矩阵进行随后的操作。 13、glutIdleFunc(void (*func)(void))在 glutIdleFunc(void (*func)(void))回调函数 中指定一个函数,如果不存在其他尚未完成的事件(例如,当事件循环处于空闲的时候), 就执行这个函数。这个回调函数接受一个函数指针作为它的唯一参数。如果向它传递 NULL(0),就相当于禁用这个函数。glutMainLoop 进入 GLUT 事件处理循环。在一个 GLUT 程 序中,这个例程被调用一次 。一旦被调用,这个程序将永远不会返回 无限循环。它将调用 必要的任何已注册的回调。程序最后调用这个函数,让程序循环执行下去,使运动继续下去。
9、OpenGl 把三维坐标中的球体绘制到而为坐标屏幕,绘制的顺序是按代码的顺序来进 行的。因此后绘制的物体会遮住先绘制的物体,既使后绘制的物体在先绘制的物体后面也是 一样,使用深度测试可以解决这个问题。使用方法是:以 GL_DEPTH_TEST 为参数调用 glEnable 函数,启动深度测试。在必要时(通常是每次绘制画面开始时)清空深度缓冲,即: glClear(GL_DEPTH_BUFFER_BIT) , 其 中 glClear(GL_COLOR_BUFFER_BIT) 与 glClear(GL_DEPTH_BUFFER_BIT) 可 以 合 并 写 为 glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT),且后者运行速度比前者快。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《计算机图形学Visual c++版》考试作业报告题目:计算机图形学图形画板专业:推荐IT学长淘宝日用品店530213班级:推荐IT学长淘宝日用品店530213学号:推荐IT学长淘宝日用品店530213姓名:推荐IT学长淘宝日用品店530213指导教师:推荐IT学长淘宝日用品店530213 完成日期: 2015年12月2日一、课程设计目的本课程设计的目标就是要达到理论与实际应用相结合,提高学生设计图形及编写大型程序的能力,并培养基本的、良好的计算机图形学的技能。
设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握计算机图形学基本知识和算法设计的基本技能术,掌握分析、解决实际问题的能力。
通过这次设计,要求在加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、设计内容推荐IT学长淘宝日用品店530213设计一个图形画板,在这个图形画板中要实现:1,画线功能,而且画的线要具备反走样功能。
2, 利用上面的画线功能实现画矩形,椭圆,多边形,并且可以对这些图形进行填充。
3,可以对选中区域的图形放大,缩小,平移,旋转等功能。
三、设计过程程序预处理:包括头文件的加载,常量的定义以及全局变量的定义#include "stdafx.h"#include "GraDesign.h"#include "GraDesignDoc.h"#include "GraDesignView.h"#include "math.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif//******自定义全局变量int type = -1;CPoint point1;CPoint point2;CPoint temp[2];CPoint remember;int i = 0;///////////////////////////////////////////////推荐IT学长淘宝日用品店530213//////////////////////////////// CGraDesignViewIMPLEMENT_DYNCREATE(CGraDesignView, CView)BEGIN_MESSAGE_MAP(CGraDesignView, CView)//{{AFX_MSG_MAP(CGraDesignView)ON_WM_LBUTTONDOWN()ON_WM_LBUTTONUP()ON_COMMAND(line, Online)ON_COMMAND(rectangle, Onrectangle)ON_COMMAND(ellipse, Onellipse)ON_COMMAND(polygon, Onpolygon)ON_COMMAND(fill, Onfill)ON_WM_RBUTTONDOWN()ON_COMMAND(tobig, Ontobig)//}}AFX_MSG_MAP// Standard printing commandsON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)END_MESSAGE_MAP()////////////////////////////推荐IT学长淘宝日用品店530213/////////////////////////////////////////////////// CGraDesignView construction/destructionCGraDesignView::CGraDesignView(){// TODO: add construction code here}CGraDesignView::~CGraDesignView(){}BOOL CGraDesignView::PreCreateWindow(CREATESTRUCT& cs){// TODO: Modify the Window class or styles here by modifying// the CREATESTRUCT csreturn CView::PreCreateWindow(cs);}/////////////////////////////////////////////////////////////////////////////// CGraDesignView drawingvoid CGraDesignView::OnDraw(CDC* pDC){CGraDesignDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here}/////////////////////////////////////////////////////////////////////////////// CGraDesignView printingBOOL CGraDesignView::OnPreparePrinting(CPrintInfo* pInfo){// default preparationreturn DoPreparePrinting(pInfo);}void CGraDesignView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: add extra initialization before printing}void CGraDesignView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/) {// TODO: add cleanup after printing}/////////////////////////////////////////////////////////////////////////////// CGraDesignView diagnostics#ifdef _DEBUGvoid CGraDesignView::AssertValid() const{CView::AssertValid();}void CGraDesignView::Dump(CDumpContext& dc) const{CView::Dump(dc);}CGraDesignDoc* CGraDesignView::GetDocument() // non-debug version is inline{ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CGraDesignDoc)));return (CGraDesignDoc*)m_pDocument;}#endif //_DEBUG推荐IT学长淘宝日用品店530213画直线:RunLine函数绘制任意斜率的直线,并且添加反走样算法,通过OnLButtonDown,OnLButtonUp函数记录鼠标的点击位置//************画线函数***********************void CGraDesignView::RunLine(CPoint CP0, CPoint CP1){CDC *pDC=GetDC();CPoint p,t;int x,y;double e,k,e1;x=CP1.x-CP0.x;//斜率无穷if(x==0){if(CP0.y>CP1.y){t=CP0;CP0=CP1;CP1=t;}p=CP0;while(p.y<CP1.y+1){pDC->SetPixelV(p,RGB(0,0,0));p.y++;}}else{y=CP1.y-CP0.y;k=double(y)/double(x);//斜率0至1if(k>=0 && k<1){//比较两个点中X轴坐标的大小if(CP0.x>CP1.x){t=CP0;CP0=CP1;CP1=t;}p=CP0;x=CP1.x-CP0.x;y=CP1.y-CP0.y;//画反走样k=double(CP0.y-CP1.y)/(CP0.x-CP1.x);e=k;while(p.x<CP1.x+1){e1=1-e;//反走样画两个像素点pDC->SetPixelV(p.x,p.y,RGB(e*255,e*255,e*255));pDC->SetPixelV(p.x,p.y+1,RGB(e1*255,e1*255,e1*255));p.x++;e=e+k;if(e>=1){e--;p.y++;}}}//斜率大于1if(k>=1){if(CP0.y>=CP1.y){t=CP0;CP0=CP1;CP1=t;}p=CP0;x=CP1.x-CP0.x;y=CP1.y-CP0.y;k=double(CP0.y-CP1.y)/(CP0.x-CP1.x);e=1/k;while(p.x<CP1.x+1){e1=1-e;pDC->SetPixelV(p.x,p.y,RGB(e*255,e*255,e*255));pDC->SetPixelV(p.x+1,p.y,RGB(e1*255,e1*255,e1*255));p.y++;e=e+1/k;if(e>=1){e--;p.x++;}}}//斜率-1至0if(k<0 && k>-1){if(CP0.x>CP1.x){t=CP0;CP0=CP1;CP1=t;}p=CP0;x=CP1.x-CP0.x;y=CP1.y-CP0.y;k=double(CP0.y-CP1.y)/(CP0.x-CP1.x);e=k;while(p.x<CP1.x+1){e1=1-e;pDC->SetPixelV(p.x,p.y,RGB(e*255,e*255,e*255));pDC->SetPixelV(p.x,p.y-1,RGB(e1*255,e1*255,e1*255));p.x++;e=e-k;if(e>=1){e--;p.y--;}}}//斜率小于等于-1if(k<=-1){if(CP0.y<CP1.y){t=CP0;CP0=CP1;CP1=t;}p=CP0;x=CP1.x-CP0.x;y=CP1.y-CP0.y;k=double(CP0.y-CP1.y)/(CP0.x-CP1.x);e=-1/k;while(p.y>CP1.y-1){e1=1-e;pDC->SetPixelV(p.x,p.y,RGB(e*255,e*255,e*255));pDC->SetPixelV(p.x+1,p.y,RGB(e1*255,e1*255,e1*255));p.y--;e=e-1/k;if(e>=1){e--;;p.x++;}}}}}推荐IT学长淘宝日用品店530213void CGraDesignView::Onrectangle(){type = 2;}画矩形:利用画线功能通过实现RunRectangle函数画出矩形//***************画矩形函数****************************void CGraDesignView::RunRectangle(CPoint CP0, CPoint CP1){CDC *pDC=GetDC();CPoint CP2,CP3;//0 1 在同一对角线,2和1在垂直方向,0 3在竖直方向CP2.x=CP1.x;CP2.y=CP0.y;CP3.x=CP0.x;CP3.y=CP1.y;//**********利用前面的功能画4条边************************** RunLine(CP0,CP2);RunLine(CP0,CP3);RunLine(CP1,CP2);RunLine(CP1,CP3);}void CGraDesignView::Onellipse(){type = 3;}画椭圆:利用画线功能通过实现RunEllipse函数画出椭圆//***************画椭圆函数****************************void CGraDesignView::RunEllipse(CPoint CP0, CPoint CP1){CDC *pDC=GetDC();CRect rect;GetClientRect(&rect);pDC->SetMapMode(8);pDC->SetWindowExt(rect.Width(),rect.Height());pDC->SetViewportExt(rect.Width(),-rect.Height());pDC->SetViewportOrg((CP0.x+CP1.x)/2,(CP0.y+CP1.y)/2);////////////////建立坐标轴//////////////////////double a,b,d,d2,a2,b2;CPoint p,p0;int endx,endy;a=abs(CP0.x-CP1.x)/2;b=abs(CP0.y-CP1.y)/2;a2=a*a;b2=b*b;endx=(int)(a2/sqrt(a2+b2));d=b2-b*a2+0.25*a2;p.x=0;p.y=(long)b;if(CP0.y == CP1.y){RunRectangle(CP0,CP1);}else{while(p.x<endx){pDC->SetPixelV(p,RGB(0,0,0));pDC->SetPixelV(p.x,-p.y,RGB(0,0,0));pDC->SetPixelV(-p.x,p.y,RGB(0,0,0));pDC->SetPixelV(-p.x,-p.y,RGB(0,0,0));if(d>=0){d=d+2*b2*p.x-2*a2*p.y+3*b2+2*a2;p.y--;}else {d=d+2*b2*p.x+3*b2;}p.x++;}d2=b2*(p.x+0.5)*(p.x+0.5)+a2*(p.y-1)*(p.y-1)-a2*b2;while(p.y>=0){pDC->SetPixelV(p,RGB(0,0,0));pDC->SetPixelV(p.x,-p.y,RGB(0,0,0));pDC->SetPixelV(-p.x,p.y,RGB(0,0,0));pDC->SetPixelV(-p.x,-p.y,RGB(0,0,0));p.y--;if(d2<0){d2=d2+2*b2*p.x-2*a2*p.y+2*b2+3*a2;p.x++;}else{d2=d2-2*a2*p.y+3*a2;}}}}void CGraDesignView::Onpolygon(){type = 4;}void CGraDesignView::Onfill(){type = 5;}画多边形:利用画线功能通过鼠标左键函数OnLButtonDown取点,用鼠标右键函数OnRButtonDown实现回到原点CPoint temp[2];CPoint remember;int i = 0;//多边形1if(4 == type){i++;temp[i%2] = point;if(1==i) { remember = temp[i]; return; }RunLine(temp[i%2],temp[(i+1)%2]);}//画多边形,按鼠标右键结束,并自动连接起始点,数据清零RunLine(temp[i%2],remember);i=0;temp[0].x=0;temp[0].y=0;temp[1].x=0;temp[1].y=0;CView::OnRButtonDown(nFlags, point);填充:通过实现RunFill函数实现填充CPoint stack[1000000];void CGraDesignView::RunFill(CPoint point){CPoint p;int top;COLORREF r;CClientDC dc(this);top=0;stack[top]=point;top++;while(top!=0){top--;p=stack[top];r=dc.GetPixel(p);if(r != RGB(255,255,255)) continue;dc.SetPixelV(p,RGB(0,255,0));r=dc.GetPixel(p.x+1,p.y);if(r == RGB(255,255,255) && r!=RGB(0,255,0)){stack[top].x=p.x+1;stack[top].y=p.y;top++;}r=dc.GetPixel(p.x-1,p.y);if(r == RGB(255,255,255) && r!=RGB(0,255,0)){stack[top].x=p.x-1;stack[top].y=p.y;top++;}r=dc.GetPixel(p.x,p.y+1);if(r == RGB(255,255,255)&& r!=RGB(0,255,0)){stack[top].x=p.x;stack[top].y=p.y+1;top++;}r=dc.GetPixel(p.x,p.y-1);if(r == RGB(255,255,255) && r!=RGB(0,255,0)){stack[top].x=p.x;stack[top].y=p.y-1;top++;}}}void CGraDesignView::Ontobig(){type = 6;}推荐IT学长淘宝日用品店5302131.需求分析本程序将实现多功能画板的功能:1,画线功能,而且画的线要具备反走样功能。