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

合集下载

计算机图形学的课程设计

计算机图形学的课程设计

计算机图形学课程设计设计题目:画三次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),且后者运行速度比前者快。

计算机图形学课程设计透视投影图三视图

计算机图形学课程设计透视投影图三视图

计算机图形学程序课程设计题目:分别在四个视区内显示空间四面体的三视图、透视投影图。

学院:信息科学与技术学院专业:计算机科学与技术姓名:oc学号:oc电话:oc邮箱:oc目录一、设计概述(1)设计题目。

2(2)设计要求。

2(3)设计原理。

2(4)算法设计。

5(5)程序运行结果。

9二、核心算法流程图。

10三、程序源代码。

12四、程序运行结果分析。

24五、设计总结分析。

25六、参考文献。

26一.设计概述•设计题目计算机图形学基础(第二版)陆枫何云峰编著电子工业出版社:利用OpenGL中的多视区,分别在四个视区内显示图7-41所示空间四面体的主视图、俯视图、侧视图、透视投影图。

•设计要求设计内容:1. 掌握主视图、俯视图、侧视图和透视投影变换矩阵;2. 掌握透视投影图、三视图生成原理;功能要求:分别在四个视区内显示P228-图7-41所示空间四面体的主视图、俯视图、侧视图、透视投影图。

•设计原理正投影正投影根据投影面与坐标轴的夹角可分为三视图和正轴测图。

当投影面与某一坐标轴垂直时,得到的投影为三视图,这时投影方向与这个坐标轴的方向一致,否则,得到的投影为正轴测图。

1.主视图(V面投影)将三维物体向XOZ平面作垂直投影,得到主视图。

由投影变换前后三维物体上点到主视图上的点的关系,其变换矩阵为:Tv=Txoz= [1 0 0 0][0 0 0 0][0 0 1 0][0 0 0 1]Tv为主视图的投影变换矩阵。

简称主视图投影变换矩阵。

2.侧视图(W面投影)将三维物体向YOZ平面作垂直投影,得到侧视图。

为使侧视图与主视图在一个平面内,就要使W面绕Z轴正向旋转90°。

同时为了保证侧视图与主视图有一段距离,还要使W面再沿X方向平移一段距离x0,这样即得到侧视图。

变换矩阵为:Tv=Tyoz= [ 0 0 0 0 ][-1 0 0 0 ][ 0 0 1 0 ][-x0 0 0 1]Tv为主视图的投影变换矩阵。

计算机图形学课程设计----课程设计

计算机图形学课程设计----课程设计

计算机图形学课程设计学 院:计算机科学学院 班 级:学 号:学生姓名:指导教师:2008年1月设计一一、课题说明用所学算法编写实现图形比例,移动,旋转变换的程序二、概要设计比例变换矩阵:移动变换矩阵:旋转变换矩阵:由于在640*480默认的显示模式下,原点(0,0)坐标在屏幕的左上角,左上角向右下角走,x 值增大,左上角向右上角走,y 值增大。

为了便于显示与理解,把原点定在(320,240)点。

则移动变换与旋转变换的矩阵就会改变。

移动变换矩阵:旋转变换后,x 坐标变为:320+(x-320)*cos(a)-(240-y)*sin(a);y 坐标变为:240-(x-320)*sin(a)-(240-y)*cos(a)本程序通过一个三角形比例,移动,旋转变换演示比例,移动,旋转后的结果。

首先画出需要变换的三角形(通过给出三角形的三个顶点画出三角形),对三个三角形的顶点变换实现比例,移动,旋转变换操作。

三、源程序及注释#include <stdio.h> #include <graphics.h>/*加入c 图形库*/ #include <math.h>yidong(int dx,int dy)/*实现移动函数*/S x 0 0 0 S y 0 0 0 1 1 0 0 0 1 0 T x T y 1cos (a) sin (a) 0 -sin (a) cos (a) 0 0 0 11 0 00 1 0 T x -- T y 1{moveto(320+dx,240-dy);lineto(420+dx,120-dy);lineto(450+dx,140-dy);变换三角形三个点的坐标实现移动变换*/lineto(320+dx,240-dy);/*}实现比例函数*/bilie(float Sx,float Sy) /*{moveto(320*Sx,240*Sy);lineto(420*Sx,120*Sy);lineto(450*Sx,140*Sy);变换三角形三个点的坐标实现比列变换*/lineto(320*Sx,240*Sy); /*}实现旋转函数*/xuanzhuan(float a) /*{float p;moveto(320,240);lineto(320+(420-320)*cos(a)-(240-120)*sin(a),240-(420-320)*sin(a)-(240-120)*cos(a));lineto(320+(450-320)*cos(a)-(240-140)*sin(a),240-(450-320)*sin(a)-(240-140)*cos(a));变换三角形三个点的坐标实现旋转变换*/lineto(320,240); /*}main(){int i,j;float X,Y,bx,by,a;int gdriver=DETECT,gmode; /*初始化显示模式参数*/初始化显示为默认的640*480、16色模式 */ initgraph(&gdriver,&gmode,""); /*i=20;j=240;moveto(i,j);/*使用双循环画点函数画出表格中的纵坐标*/for(i=20;i<=620;i+=20)lineto(i,240);i=320;j=20;moveto(i,j);/*使用双循环画点函数画出表格中的横坐标*/for(j=20;j<=460;j+=20)lineto(320,j);moveto(320,240);lineto(420,120);lineto(450,140);lineto(320,240);/*画出需变换的三角形,其三个顶点分别为(320,240);(420,120) ;(450,140)*/printf("please input X,Y to move:"); scanf("%f%f",&X,&Y); /*输入移动量 */ yidong(X,Y);printf("please input bx,by to scale:"); scanf("%f%f",&bx,&by); /*输入x 方向,y 方向缩放大小 */ bilie(bx,by);printf("please input a to circumgyrate:"); scanf("%f",&a); /*输入旋转角度,a 为正,则逆时针旋转*/ xuanzhuan(a); }四、运行结果原始三角形移动(40,40)后的三角形旋转45o 后的三角x 轴方向上缩小0.5倍后的三角形设计二一、课题说明编写一个AutoLISP程序,其功能是:画一个轴衬的两个视图,如图4所示。

计算机图形学---多边形裁剪与填充-课程设计

计算机图形学---多边形裁剪与填充-课程设计
在 CGraphics 类的 CutRectangular(CRect)函数中实现对多边形的裁剪
多边形填充算法分析: 确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大 y 值(ymin 和
ymax),从 y=ymin 到 y=ymax, 每次用一条扫描进行填充。对一条扫描线填充的过程可分 为四个步骤: a.求交 b.排序 c.交点配对 d.区间填色。在 CGraphics 类中的 FillPlogon 函数中实现多边形的填充算法。
return 0; }
2、鼠标按下左键的响应函数
void CMyView::OnLButtonDown(UINT nFlags, CPoint point) {
//对鼠标按下左键的相应 CScrollView::OnLButtonDown(nFlags, point);
if(m_bDefineRect) {
成裁剪线,该线把平面分成两个部分:可见一侧,不可见一侧。用一条裁剪边 对多边形进行裁剪,得到一个顶点序列,作为下一条裁剪边处理过程的输入点。
对于每一条裁剪边,只是判断点在窗口的哪一测以及求线段与裁剪边的交 点算法应随之改变。 多边形填充算法分析: 确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大 y 值(ymin 和 ymax),从 y=ymin 到 y=ymax, 每次用一条扫描进行填充。对一条扫描线填充的 过程可分为四个步骤: a.求交 b.排序 c.交点配对 d.区间填色。
// fail to create
}
if (!m_wndStatusBar.Create(this) ||
!m_wndStatusBar.SetIndicators(indicators,
sizeof(indicators)/sizeof(UINT)))

计算机图形学课程设计

计算机图形学课程设计

函数的功能、接口说明
• 2.4.3设定观察视角函数(自带) • 函数名称:glStaff::set_mat_view(glm::lookAt( glm::vec3(12,12,12), glm::vec3(0,0,0), • glm::vec3(0,1,0) ) ); • 参数列表:观察者的三个方向上的向量 • 实现功能:设定好观察者的视角。
• • • •
2.4.4给场景模型设置平移变量函数(自带) 函数名称:glStaff::set_mat_model( glm::translate( glm::vec3(0,1,0) ) ); 参数列表:平移的量的大小 实现功能:对场景里所有物体进行平移变换,(0,1,0)代表y轴方向正向移动1个 单位
程序设计流程图
开始
一:初始化
二:绘制场景及对象 三:添加环境光和环境光

定义窗口
Gl初始化
设置观察视角 添加光源和环境 光 场景及对象绘制 否
移动光源
结束
数据结构
• 数组 • 用法介绍:一维数组用来存储光源的颜色数组,定义一个长度为4的数组,分 别存储RGB和亮度。 • 一维数组还可以用来表示向量,比如定义一个观察者的方向,用长度为3的数 组可以表示向量的xyz分量。 • 一维数组还可以表示场景中某一点的位置,比如点光源的位置,长度为3的数 组分布存储xyz。 • 使用示例: • GLfloat color[]={.8f, 0.8f, 0.8f, 1};light_pos[0] = glm::vec4(5,6,-2, 1); • 。
OpenGL阴影效果的生成
信息软件 杨亚南 130108010020
实验内容
• 绘制一个三维场景,其中包含影子效果,所构造的场景包含环境光、点光源、 可移动的观察点。

计算机图形学实验与课程设计

计算机图形学实验与课程设计

《计算机图形学》实验与课程设计张素智编著郑州轻工业学院计算机与通信工程学院2004年12月1日目录前言实验1 Visual C++图形程序设计 (4)一、实验目的 (4)二、实验任务 (4)三、基础知识和实验步骤 (4)3.1 Visual C++ 6.0应用程序开发方法 (4)3.1.1 Visual C++的集成开发环境 (4)3.1.2 应用程序工程的建立方法 (5)3.1.3 输入源程序进行程序设计 (8)3.2 图形设备接口和图形程序设计 (10)3.2.1 图形设备接口简介 (10)3.2.2 绘制基本图形 (11)3.2.3 画笔与画刷 (15)3.2.4 文本显示 (19)3.3 鼠标编程 (20)3.3.1 鼠标消息处理 (20)3.3.2 捕捉鼠标 (21)3.3.3 鼠标编程综合示例 (21)3.4 菜单程序设计 (26)3.4.1 菜单编辑器 (27)3.4.2 菜单消息响应 (29)3.4.3 综合示例 (29)四、实验总结 (32)实验二基本图形(元)生成技术(一) (33)一、实验目的 (33)二、实验任务 (33)三、基本知识和实验步骤 (33)任务一:实现DDA画线程序 (33)任务二、放大10倍后,算法演示程序 (34)任务三、加入鼠标功能,实现交互式画直线 (36)四、实验结果和分析 (38)五、实验总结 (38)实验三基本图形(元)生成技术(二) (39)一、实验目的 (39)二、实验任务 (39)三、实验内容 (39)任务一:中点画圆法的扫描转换算法 (39)任务二:添加鼠标程序,实现交互式画圆 (41)任务三:编写中点画椭圆法的扫描转换程序 (43)任务四:添加鼠标程序,实现交互式画椭圆 (45)四、实验结果、分析和总结 (46)实验四基本图形处理技术(一)......................................................... 错误!未定义书签。

计算机图形学课程设计--- 弹跳的彩球动画

计算机图形学课程设计--- 弹跳的彩球动画

课程设计任务书题目:弹跳的彩球动画课程设计任务书及成绩评定目录一、摘要 (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()调出即可。

计算机图形学作品设计报告

计算机图形学作品设计报告

计算机图形学作品设计报告题目:用VC++来制作一个五子棋的小游戏小组成员:徐毅____________________________二0一五年六月1 需求分析五子棋是传统的黑白棋之一,是非常经典的棋类,至今仍旧受到许多人的喜爱,但是如今网上有许多的五子棋小游戏,都只添加的人机对战的功能,而人机对战有一个无法忽视的缺点,就是程序都是实现写好的,电脑会主动拦截三点以上的棋路,但是利用这点摆连阵的话,赢过电脑会太简单,没有人人对战的实感,但很多五子棋小游戏在没有合适平台的情况下无法实现人人对战,所以我想开发一个能实现人人对战的五子棋小游戏2 总体设计首先,五子棋的游戏流程无非便是决定谁先落子,双方落子阶段,判定是否五子相连,如一方五子相连,则游戏结束,五子相连方胜利,因此,游戏类的结构图如下游戏结束3 详细设计首先是定义棋盘类,以下是棋盘的设计CMyDlg::CMyDlg(CWnd* pParent /*=NULL*/): CDialog(CMyDlg::IDD, pParent){//{{AFX_DATA_INIT(CMyDlg)// NOTE: the ClassWizard will add member initialization here //}}AFX_DATA_INIT// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 // SetTimer(1,2000,NULL);for(i = 0 ; i<14; i++)for(j= 0 ;j <14 ;j++)board[i][j] = 2; // 初始化棋盘数组for(i = 0 ; i <14 ; i++) //对14列进行隔行扫描,for(j=0 ; j <10 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i][count] = true;ctable[j+k][i][count] = true;}count ++;}for(i = 0 ; i <14 ; i++) //对14行进行隔行扫描for(j=0 ; j <10 ; j++){for( k = 0 ; k <5 ;k++){ptable[i][j+k][count] = true;ctable[i][j+k][count] = true;}count ++;}for(i = 0 ; i <10; i++) //对交叉的情况-东南-西北走向-进行扫描 for(j=0 ; j <10 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i+k][count] = true;ctable[j+k][i+k][count] = true;} count ++;}for(i = 0 ; i <10 ; i++) //对交叉的情况-东北-西南走向-进行扫描 for(j=13 ; j >= 4 ; j--){for( k = 0 ; k <5 ;k++){ptable[j-k][i+k][count] = true;ctable[j-k][i+k][count] = true;} count ++;}其中可以自己定义先后手的顺序,算法如下player = true;count = 0 ;m_board = new CBitmap;m_white = new CBitmap;m_black = new CBitmap;m_temp = new CBitmap;m_red = new CBitmap;// m_bitmap4 = new CBitmap;也可以用比权值大小的方法决定,算法如下pwin = false;cwin = false;player = true;over = false;computer = false;cgrade = 0 ;pgrade = 0 ;for(i = 0 ;i <14; i++)for(j = 0 ; j <14 ; j++){ ppgrade[i][j] = 0 ;ccgrade[i][j] = 0 ;}for(i=0 ; i <=1 ;i++)for(j=0 ; j<480 ; j++)win[i][j] = 0 ;count = 0 ;CDC thmem2 ; //thmem3CClientDC dc(this);thmem2.CreateCompatibleDC(&dc);thmem2.SelectObject(m_board);dc.BitBlt (0,0,320,320,&thmem2,0,0,SRCCOPY);Invalidate(false);}然后是落子阶段,算法如下void CMyDlg::Computer (){//以下函数时设置权值的功能,为计算机选择最佳的落子点做好准备for(i = 0 ; i<= 13 ; i++)for( j= 0 ; j <=13 ;j++){ppgrade[i][j] = 0 ;if(board[i][j] ==2)for(k=0 ; k <480 ; k++)if(ptable[i][j][k]){switch(win[0][k]){case 1:ppgrade[i][j] +=5;break;case 2:ppgrade[i][j] +=50;break;case 3:ppgrade[i][j] +=100;break;case 4:ppgrade[i][j] +=400;break;}}}for(i = 0 ; i<= 13; i++)for(j=0 ; j<=13;j++){ccgrade[i][j] = 0 ;if( board[i][j]==2)for(k=0 ; k <480 ; k++)if(ctable[i][j][k]){switch(win[1][k]){case 1:ccgrade[i][j] +=5;break;case 2:ccgrade[i][j] +=50;break;case 3:ccgrade[i][j] +=100;break;case 4:ccgrade[i][j] +=400;break;}}}if(start){//选择计算机开始落子的位子if( board[7][7] == 2){m = 7;n = 7;}else{m = 8 ;n = 8;}start = false;}else{for(i= 0 ; i<14 ; i++)for( j = 0 ; j<14;j++)if(board[i][j] ==2){//以下是选择计算机权值最大的点,和当时的权值if(ccgrade[i][j] >= cgrade){cgrade = ccgrade[i][j];mat = i;nat = j;}//以下是选择个人权值最大的点,和当时的权值if(ppgrade[i][j] >= pgrade){pgrade = ppgrade[i][j];mde = i;nde = j;}}//看计算机最大的值跟个人最大的值那个大,如果计算机大的话,那就进攻if(cgrade >= pgrade) //for attack;{m = mat;n = nat;}//否则的话那就防守else{m = mde;n = nde;}}cgrade = 0 ;pgrade = 0 ;board[m][n] = 1; //paste the computer chess in this position;ccount ++;if((ccount ==98 )&&(pcount ==98)){tie = true;over = true;}//跟人下好一个棋后所做的处理是一致的for( i= 0 ; i<480 ; i++){if(ctable[m][n][i]&&win[1][i] !=8 )win[1][i]++;if(ptable[m][n][i]){ptable[m][n][i] = false;win[0][i] = 8;}}player = true; //call the player to startcomputer = false;}而在落子阶段,每次落子都要扫描棋盘,有一方获胜则游戏结束void CMyDlg::dostep(){// TODO: Add your message handler code here and/or call defaultCDC thmem2 ; //thmem3CClientDC dc(this);thmem2.CreateCompatibleDC(&dc);// thmem3.CreateCompatibleDC(&dc);int ii,jj,kk;if(!over){if(computer)Computer();for(i=0 ; i<=1 ;i++)for(j=0 ; j<480 ; j++){if(win[i][j] == 5)// 看是否5子连书了,是的话,用红色的棋子显示以下,然后打出一句话if(i==0){ //人赢了pwin = true;over = true;for(ii= 0 ; ii <=13 ;ii++)for(jj = 0 ; jj <=13 ;jj++)if(ptable[ii][jj][j] == true){thmem2.SelectObject(m_temp);dc.BitBlt(jj*20+25,ii*20+15,20,20,&thmem2,0,0,MERGEPAINT);thmem2.SelectObject(m_red);dc.BitBlt(jj*20+25,ii*20+15,20,20,&thmem2,0,0,SRCAND);}// MessageBox("恭喜你,你赢了");for(ii= 0 ; ii <10000 ; ii++)for(jj = 0 ; jj <30000 ; jj++);break;}else{//计算机赢了cwin = true;over = true;for(ii= 0 ; ii <=13 ;ii++)for(jj = 0 ; jj <=13 ;jj++)if(ctable[ii][jj][j] == true){thmem2.SelectObject (m_temp);dc.BitBlt(jj*20+25,ii*20+15,20,20,&thmem2,0,0,MERGEPAINT);thmem2.SelectObject (m_red);dc.BitBlt(jj*20+25,ii*20+15,20,20,&thmem2,0,0,SRCAND);}// MessageBox("你输了,要继续请重新开始");for(ii= 0 ; ii <10000 ; ii++)for(jj = 0 ; jj <15000 ; jj++);break;}if(over)break;}}//没有五子连书的情况的下,就简单的把子显示一下for(i = 0 ; i <=13 ; i++)for( j = 0 ; j<= 13 ; j++){if(board[i][j]==0){thmem2.SelectObject (m_temp);dc.BitBlt(j*20+25,i*20+15,20,20,&thmem2,0,0,MERGEPAINT);thmem2.SelectObject (m_black);dc.BitBlt (j*20+25,i*20+15,20,20,&thmem2,0,0,SRCAND);// m_byColour = white ;// UpdataData(FALSE);for(ii= 0 ; ii <1000 ; ii++)for(jj = 0 ; jj <1000 ; jj++);// dc.TextOut (50,400," 轮到你了");}if(board[i][j] == 1){thmem2.SelectObject (m_temp);dc.BitBlt(j*20+25,i*20+15,20,20,&thmem2,0,0,MERGEPAINT);thmem2.SelectObject (m_white);dc.BitBlt (j*20+25,i*20+15,20,20,&thmem2,0,0,SRCAND);m_byColour = black;// UpdateData();for(ii= 0 ; ii <1000 ; ii++)for(jj = 0 ; jj <1000 ; jj++);}}//人赢,打出这句话if(pwin){ MessageBox("你赢得了胜利");// dc.TextOut (50,360,"你赢了,按下restart键,重新开始!");// KillTimer(1);}// 计算机赢,打出这句话if(cwin){ MessageBox("你失败了");//dc.TextOut (50,360,"你输了,按下restart键,重新开始!");// KillTimer(1);}同时,可以自己改变光标的类型BOOL CMyDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message){CPoint point, pt;::GetCursorPos(&point);ScreenToClient(&point);if (point.y>=15 && point.x>=25 && point.y <= 315 && point.x <=325&& !over){::SetCursor(AfxGetApp()->LoadCursor(m_byColour ? IDC_BLACK_CURSOR:IDC_WHITE_CURSOR));return TRUE;}return CDialog::OnSetCursor(pWnd, nHitTest, message);}/*BOOL CMyDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message){// TODO: Add your message handler code here and/or call defaultreturn CDialog::OnSetCursor(pWnd, nHitTest, message);}*/觉得这一局已经不想玩了,可以重新开始void CMyDlg::Onrestart(){// TODO: Add your control notification handler code herefor(i = 0 ; i<14; i++)for(j= 0 ;j <14 ;j++)board[i][j] = 2;for(i = 0 ; i <14 ; i++)for(j=0 ; j <10 ; j++){for( k = 0 ; k <5 ;k++)ptable[j+k][i][count] = true;ctable[j+k][i][count] = true;}count ++;}for(i = 0 ; i <14 ; i++)for(j=0 ; j <10 ; j++){for( k = 0 ; k <5 ;k++){ptable[i][j+k][count] = true;ctable[i][j+k][count] = true;}count ++;}for(i = 0 ; i <10; i++)for(j=0 ; j <10 ; j++){for( k = 0 ; k <5 ;k++){ptable[j+k][i+k][count] = true;ctable[j+k][i+k][count] = true;}count ++;}for(i = 0 ; i <10 ; i++)for(j=13 ; j >= 4 ; j--){for( k = 0 ; k <5 ;k++)ptable[j-k][i+k][count] = true;ctable[j-k][i+k][count] = true;}count ++;}4 源程序#include "stdafx.h"#include "五子棋.h"#include "五子棋Dlg.h"#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endifint board[14][14]; //棋盘数组BOOL ptable[14][14][480]; //人的所有可能的赢法数组BOOL ctable[14][14][480]; //计算机所有可能的赢法数组int ccgrade[14][14] ={0}; //计算机的权值数组int ppgrade[14][14] ={0}; //人的权值数组int cgrade,pgrade;int win[2][480]; // win[0][480]表示人在480中赢法的值,当他的一个值是5时表示他已经赢了// win[1][480]表示计算机在480中赢法的值,当他的一个值是5时表示他已经赢了int pcount,ccount;BOOL player,computer,start = true ,over , pwin, cwin, tie; //这里都时一些标记其中tie表示是否平局的标记int i,j,k,m,n,count;int mat,nat,mde,nde;char str[14];5 程序运行效果图初始界面失败界面胜利界面[参考文献][1]李继芳,王仁芳,柴本成,邹云兰,计算机图形学,清华大学出版社[2] 关于网络五子棋的需求分析/link?url=HrlLPxfvG8eSPt7Qa8kkTzGUkLUIi5RcOltOBe68Or5whrJ-lY 7mh48giibhD9_ZtwZTwk3COUxphU1FIY7ktys5_hpdBbvv3j86pfp-QJq[3] 关于五子棋的代码实现与应用/blog/959352[4] 简单版五子棋小游戏的核心算法/chenyujing1234/article/details/7472878。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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,画线功能,而且画的线要具备反走样功能。

相关文档
最新文档