收藏 分销(赏)

二维图形的简单变换.doc

上传人:仙人****88 文档编号:11894985 上传时间:2025-08-19 格式:DOC 页数:26 大小:515.50KB 下载积分:10 金币
下载 相关 举报
二维图形的简单变换.doc_第1页
第1页 / 共26页
二维图形的简单变换.doc_第2页
第2页 / 共26页


点击查看更多>>
资源描述
学年设计报告 设计题目:  用C语言实现简单2D图形的绘制和变换 作者姓名:  王兴超 王天祥 张涛 朱龙飞 席晓东   所学专业:      网络工程专业 指导老师:   赵瑞斌 2012年9月2号 学年设计任务书 学年设计题目  用C语言实现简单2D图形的绘制和变换 组长 王兴超 学号 2011211311 班级 11网工(二)班 组别 软件第二组 专业 网络工程 组员 王兴超 、王天祥、 张涛 、朱龙飞 、席晓东 指导教师 赵瑞斌 学年设计目的 合理运用所学专业课(C语言)设计一些小程序来解决实际问题 学年设计所需环境 微机房YF3503 学年设计任务要求 利用C语言编写代码进行图形变换 学年设计工作进度计划 序号 起止日期 工 作 内 容 分工情况 1 7.1~7.15 分析题目,查找并学习几何变换的相关知识 全体成员 2 7.16~8.1 学习并熟悉graphics.h库函数绘制图形的方法与技巧 王兴超,张涛,王天祥,朱龙飞 3 8.2~8.15 实现一些简单变换的思路,实行平移变换、比例变换、旋转变换等. 席晓东查找资料,王兴超,张涛代码实现 4 8.16~8.25 总体界面与主函数的设计 朱龙飞,王天祥,席晓东 5 8.26~8.28 对代码进行整体测试修改 王兴超,张涛 6 8.29~9.2 完成设计报告 王兴超,朱龙飞,王天祥 教研室审核意见: 教研室主任签字: 年 月 日 目录 摘要 1 1 绪论 1 1.1设计背景与意义 1 1.2系统结构 1 2 问题描述 2 3 分析 2 3.1平移变换 2 3.2 比例变换 2 3.3 旋转变换 2 4 设计实现 3 4.1 加载页面 3 4.2画出三角形 3 4.3 对三角形进行平移变换 4 4.4 对三角形进行比例变换 6 4.5 对三角形进行旋转变换 7 4.6 画出所要的矩形 7 4.7 矩形进行平移变换 8 4.8 矩形进行比例变换 10 4.9 矩形进行旋转变换 11 4.10 圆对圆形进行变换选择 12 4.11 画出的圆形进行平移 13 4.12对画出的圆形进行比例变换 14 4.13主程序 14 5.运行结果 15 5.1 加载页面 15 5.2 目录界面进行选择。 16 5.3三角形变换 16 5.3.1 选择1进行平移变换 16 5.3.2 选择2进行比例变换 17 5.3.3 选择3进行旋转 17 5.4 选择3画出矩形 17 5.4.1 选择1进行平移变换 18 5.4.2 进行比例变换 18 5.4.3 进行旋转变换 18 5.5选择5画出圆 19 5.5.1 选择1进行平移变换 19 5.5.2 选择2进行比例变换 19 5.6选择7实现随机点的连线绘制 20 6 学年设计总结与体会 21 6.1总结 21 6.2 体会 21 7 致谢 22 参考文献 22 滁州学院本科学年设计 用C语言实现简单2D图形的绘制和变换 摘要: 在计算机绘图的过程中,二维图形的绘制是绘制许多图形的基础,研究计算机图形的生成必须从研究二维图形开始。计算机绘制图形时,无论图形多么复杂,都是利用一些相应图形基元经过图形变换组成的。在计算机绘图中,经常用到图形变换,图形变换是指图形信息经过几何变换后产生新的图形。本文主要介绍二维图形的一些基本变换规则及其应用。图形的变换牵扯到平移变换、比例变换、还有旋转变换。本文针对简单的二维图形进行变换,比如三角形,矩形和圆形,还有随机连线的绘制,并包括了颜色的添加,动画的设计,有这些简单的设计便组成了强大的应用效果。 1 绪论 1.1设计背景与意义 目前,很多软件对二维图形变换程序的需求逐渐增大,而且二维图形的应用也正逐渐向各个方向渗透。在这样的形式下这就要求我们计算机专业的学生们能够实现这一基本变换,以更好的应对这一方面计算机应用的发展。利用C语言实现二维图形的变换不仅可以实现日常生活中常见图片的变换,而且可以实现各种二维图形的绘制,这也就为我们的生活提供了许多的便利。 1.2系统结构 图1.2 整体流程图 2 问题描述 二维图形的几种典型变换,二维图形由点或者是直线段组成,直线段可由其端点坐标定义,二维图形的集合变换实际是对点或者是对直线段端点在变换矩阵的作用下实现的。设P=[x y]是原来的点,P’=[x’ y’]是变换后的点,则几种典型的变换如下: (a) 平移变换: (b) 比例变换: (c) 旋转变换: 3 分析 我们小组对问题进行了深刻的讨论,确定了用点对点连线的方式来确定一个简单的二维图形,如三角形和矩形。然后对已确定的点进行操作以实现各种图形变换。 3.1平移变换 若图形上一点P(x,y)沿x轴平移 l距离,沿y轴平移m距离后成为新的图形上一点P'(x',y'),则有          x' = x + l          y' = y + m    式中l,m不全为零,这称为平移变换。 3.2 比例变换 设图形上一点P(x,y),经比例变换后成为新的菜上一点P'(x',y'),即有       x'=a*x       y'=d*y 式中a,d为比例因子   将此比例变换式写成矩阵式得    这里叫做比例变换矩阵。若a=d,则x,y坐标按同一比例变换。当a=d>1时,图形 放大;当0<a=d<1时,图形缩小。若a≠d,则x,y坐标按各自不同比例变换。 3.3 旋转变换 设图形上一点P(x,y)绕原点逆时针旋转θ角后成为新的图形上一点P'(x',y'),则由解析几何方法可得          x' = xcosθ + ysinθ          y' = -xsinθ + ycosθ    用矩阵表示为 这里为绕原点逆时针变换矩阵。若顺时针旋转时,θ角为负值。 4 设计实现 4.1 加载页面 void heard() //开始界面 { int i; printf("\n\n\n\n "); printf(" 程序加载中 \n\n"); printf(" "); Sleep(1000);//延时 for(i=0;i<35;i++) { printf(">"); Sleep(60); } Sleep(1000);//延时 system("cls");//清屏 printf("\n\n\n\n "); printf("\a\a");//一声响声 printf("→【加载完成】 "); system("pause");//dos命令 system("cls");//清屏 fflush(stdin);//清除缓冲区 } 4.2画出三角形,并对三角形的三种变换进行选择 void sanjiao() //画三角形 { initgraph(500,500); line(25,50,50,50); line(50,50,50,25); line(50,25,25,50); getch(); // 按任意键继续 closegraph(); // 关闭图形界面 } void sanjiaobianhuan() { int selsect; do{ printf("\n\n"); printf(" 1.平移转换\t2.比例转换\n"); printf(" 3.旋转转换\t0.结束函数\n"); printf("\n\n"); printf(" 请输入你的选择:"); scanf("%d",&selsect); switch(selsect){ case 0:break; case 1: pingyi_tu();break; case 2: bili_tu();break; case 3: xuanzhuan_tu();break; } }while(selsect!=0); } 4.3 对三角形进行平移变换 void pingyi_tu() //三角形平移变换 { int Tx,Ty; int x1,x2,x3,y1,y2,y3; int a,b,c,d,e,f; printf("请输入平移的量为(Tx,Ty):"); scanf("%d,%d",&Tx,&Ty); //moverel(Tx,Ty); printf("即要平移的量为:(%d,%d)\n",Tx,Ty); x1=25+Tx;y1=50+Ty; x2=50+Tx;y2=25+Ty; x3=50+Tx;y3=50+Ty; initgraph(500,500);//初始化绘图环境 line(25,50,50,50); line(50,50,50,25); line(50,25,25,50); Sleep(1000); for(a=25,c=50,e=50;a<=Tx,c<=Tx,e<+Tx;a++,c++,e++) { setcolor(RGB(255,255,255)); line(a,50,c,50); line(c,50,e,25); line(e,25,a,50); Sleep(10); setcolor(RGB(0,0,0)); line(a,50,c,50); line(c,50,e,25); line(e,25,a,50); } for(b=50,d=50,f=25;b<=Ty,d<=Ty,f<=Ty;b++,d++,f++) { setcolor(RGB(255,255,255)); line(a,b,c,d); line(c,d,e,f); line(e,f,a,b); Sleep(10); setcolor(RGB(0,0,0)); line(a,b,c,d); line(c,d,e,f); line(e,f,a,b); } setcolor(RGB(255,255,255)); line(25,50,50,50); line(50,50,50,25); line(50,25,25,50); setcolor(RGB(255,0,0)); line( a,b,c,d); line( c,d,e,f); line( e,f,a,b); getch(); closegraph();//函数用于关闭图形环境。 } 4.4 对三角形进行比例变换 void bili_tu() //三角形比例变换 { int Sx,Sy; int x1,x2,x3,y1,y2,y3; printf("请输入比例的量为(Sx,Sy):"); scanf("%d,%d",&Sx,&Sy); printf("即要按比例转换的量为:(%d,%d)\n",Sx,Sy); x1=25*Sx;y1=50*Sy; x2=50*Sx;y2=50*Sy; x3=50*Sx;y3=25*Sy; initgraph(500,500);//初始化绘图环境 line(25,50,50,50); line(50,50,50,25); line(50,25,25,50); Sleep(1000); setcolor(RGB(255,0,0)); line( x1,y1,x2,y2); line( x1,y1,x3,y3); line( x2,y2,x3,y3); getch();//延时 closegraph();//函数用于关闭图形环境 } 4.5 对三角形进行旋转变换 void xuanzhuan_tu() //三角形旋转变换 { int a; int x1,x2,x3,y1,y2,y3; printf("请输入要旋转的弧度制:"); scanf("%d",&a); x1=(int)(25*cos(a)-50*sin(a)); y1=(int)(25*sin(a)+50*cos(a)); x2=(int)(50*cos(a)-50*sin(a)); y2=(int)(50*sin(a)+50*cos(a)); x3=(int)(50*cos(a)-25*sin(a)); y3=(int)(50*sin(a)+25*cos(a)); initgraph(500,500);//初始化绘图环境 line(25,50,50,50); line(50,50,50,25); line(50,25,25,50); Sleep(1000); setcolor(RGB(255,0,0)); line( x1,y1,x2,y2); line( x1,y1,x3,y3); line( x2,y2,x3,y3); getch();//延时 closegraph();//函数用于关闭图形环境 } 4.6 画出所要的矩形,并对选择需要的变换 void juxing() //画矩形 { initgraph(500,500); line(25,25,25,50); line(25,50,60,50); line(60,50,60,25); line(60,25,25,25); getch(); closegraph(); } void juxingbianhuan() //矩形变换 { int selsect; do{ printf("\n\n"); printf(" 1.平移转换\t2.比例转换\n"); printf(" 3.旋转转换\t0.结束函数\n"); printf("\n\n"); printf(" 请输入你的选择:"); scanf("%d",&selsect); switch(selsect){ case 0:break; case 1: pingyitu();break; case 2: bilitu();break; case 3: xuanzhuantu();break; } }while(selsect!=0); } 4.7 矩形进行平移变换 void pingyitu() //矩形平移变换 { int Tx,Ty; int a,b,c,d; int x1,x2,x4,x3,y1,y2,y3,y4; printf("请输入平移的量(Tx,Ty):"); scanf("%d,%d",&Tx,&Ty); x1=25+Tx;y1=25+Ty; x2=25+Tx;y2=50+Ty; x3=60+Tx;y3=50+Ty; x4=60+Tx;y4=25+Ty; initgraph(500,500);//初始化绘图环境 line(25,25,25,50); line(25,50,60,50); line(60,50,60,25); line(60,25,25,25); Sleep(1000); for(a=25,c=60;a<=x1,c<=x3;a++,c++) { setcolor(RGB(255,255,255)); line(a,25,a,50); line(a,50,c,50); line(c,50,c,25); line(c,25,a,25); Sleep(10); setcolor(RGB(0,0,0)); line(a,25,a,50); line(a,50,c,50); line(c,50,c,25); line(c,25,a,25); } for(b=25,d=50;c<=y1,d<=y3;b++,d++) { setcolor(RGB(255,255,255)); line(a,b,a,d); line(a,d,c,d); line(c,d,c,b); line(c,b,a,b); Sleep(10); setcolor(RGB(0,0,0)); line(a,b,a,d); line(a,d,c,d); line(c,d,c,b); line(c,b,a,b); } setcolor(RGB(255,255,255)); line(25,25,25,50); line(25,50,60,50); line(60,50,60,25); line(60,25,25,25); setcolor(RGB(255,0,0)); line( x1,y1,x2,y2); line( x2,y2,x3,y3); line( x3,y3,x4,y4); line( x4,y4,x1,y1); getch();//延时 closegraph();//函数用于关闭图形环境 } 4.8 矩形进行比例变换 void bilitu() //矩形比例变换 { int Sx,Sy; int x1,x2,x3,x4,y1,y2,y3,y4; x1=x2=x3=x4=y1=y2=y3=y4=0; printf("请输入比例的量为(Sx,Sy):"); scanf("%d,%d",&Sx,&Sy); printf("即要按比例转换的量为:(%d,%d)\n",Sx,Sy); x1=25*Sx;y1=25*Sy; x2=25*Sx;y2=50*Sy; x3=60*Sx;y3=50*Sy; x4=60*Sx;y4=25*Sy; initgraph(500,500);//初始化绘图环境 line(25,25,25,50); line(25,50,60,50); line(60,50,60,25); line(60,25,25,25); Sleep(1000); line( x1,y1,x2,y2); line( x1,y1,x4,y4); line( x2,y2,x3,y3); line( x3,y3,x4,y4); getch();//延时 closegraph();//函数用于关闭图形环境 } 4.9 矩形进行旋转变换 void xuanzhuantu() //矩形旋转变换 { int a; int x1,x2,x3,y1,y2,y3,x4,y4; printf("请输入要旋转的弧度制:"); scanf("%d",&a); x1=(int)(25*cos(a)-25*sin(a)); y1=(int)(25*sin(a)+25*cos(a)); x2=(int)(25*cos(a)-50*sin(a)); y2=(int)(25*sin(a)+50*cos(a)); x3=(int)(60*cos(a)-50*sin(a));y3=(int)(60*sin(a)+50*cos(a)); x4=(int)(60*cos(a)-25*sin(a));y4=(int)(60*sin(a)+25*cos(a)); initgraph(500,500);//初始化绘图环境 line(25,25,25,50); line(25,50,60,50); line(60,50,60,25); line(60,25,25,25); Sleep(1000); setcolor(RGB(255,0,0)); line( x1,y1,x2,y2); line( x1,y1,x4,y4); line( x2,y2,x3,y3); line( x3,y3,x4,y4); getch();//延时 closegraph();//函数用于关闭图形环境 } 4.10 圆对圆形进行变换选择 void yuan() //画圆 { initgraph(500,500); circle(250,250,50); getch(); closegraph(); } void yuanbianhuan() //圆变换 { int selsect; do{ printf("\n\n"); printf(" 1.平移转换\n"); printf(" 2.比例变换\n"); printf(" 0.退出\n"); printf("\n\n"); printf(" 请输入你的选择:"); scanf("%d",&selsect); switch(selsect){ case 0:break; case 1: yuanpingyi();break; case 2: yuanbili();break; } }while(selsect!=0); } 4.11 画出的圆形进行平移 void yuanpingyi() //圆平移 { int Tx,Ty; int x,y; int i,j; printf("请输入平移的量(x,y):"); scanf("%d,%d",&Tx,&Ty); x=250+Tx;y=250+Ty; initgraph(500,500); circle(250,250,50); Sleep(1000); for(i=251;i<=x;i++){ setcolor(RGB(255,255,255)); circle(i,250,50); Sleep(10); setcolor(RGB(0,0,0)); circle(i, 250, 50); } for(j=251;j<=y;j++) { setcolor(RGB(255,255,255)); circle(i, j,50); Sleep(10); setcolor(RGB(0,0,0)); circle(i, j, 50); } setcolor(RGB(255,0,0)); circle(i,j,50); getch(); closegraph(); } 4.12对画出的圆形进行比例变换 void yuanbili() //圆比例变换 { int S; int x; printf("请输入比例的量为:"); scanf("%d",&S); x=50*S; initgraph(500,500); circle(250,250,50); Sleep(1000); setcolor(RGB(255,0,0)); circle(250,250,x); getch(); closegraph(); } 4.13主程序 void main() { int selsect; heard();//程序开始界面 do{ printf("\n\n"); printf(" 1.画三角形\n"); printf(" 2.三角形变换\n"); printf(" 3.画矩形\n"); printf(" 4.矩形变换\n"); printf(" 5.画圆\n"); printf(" 6.圆的变换\n"); printf(" 0.退出系统\n"); printf("\n\n"); printf(" 请输入你的选择:"); scanf("%d",&selsect); switch(selsect){ case 0:exit(0); case 1: sanjiao();break; case 2: sanjiaobianhuan();break; case 3: juxing();break; case 4: juxingbianhuan(); case 5: yuan();break; case 6: yuanbianhuan();break; default:break; } }while(selsect!=0); } 5.运行结果 5.1 加载页面 如图5-1、5-2所示 图5-1正在加载 图5-2加载完成 5.2:目录界面进行选择。 如图5-3所示 图4-3选择界面 5.3三角形变换 选择1画出三角形再选择2进入变换界面完成图形变换(白色为原图,红色为平移后的图)。如图5-4所示 图5-4选择自己需要的选项 5.3.1 选择1进行平移变换。 如图5-5所示 图5-5三角形经过平移后 5.3.2 选择2进行比例变换 如图5-6所示 图5-6 三角形经过缩放后的图像 5.3.3 选择3进行旋转 如图5-7所示 图5-7三角形经过旋转后的图像 5.4 选择3画出矩形 再选择4进行图形变换(白色为原图,红色为平移后的图),如图5-8所示 图5-8 选择4后进入举行变换的界面 5.4.1 选择1进行平移变换 如图5-9所示 图5-9矩形经过平移后的图像 5.4.2 进行比例变换 如图5-10所示 图5-10对矩形进行缩放 5.4.3 进行旋转变换 如图5-11所示 图5-11对矩形进行旋转 5.5选择5画出圆 在选择6进行图形变换(白色为原图,红色为平移后的图),如图5-12所示 图5-12选择6进入远的选择界面 5.5.1 选择1进行平移变换 如图5-13所示 图5-13 对圆进行平移 5.5.2 选择2进行比例变换 如图5-14所示 图5-13对圆进行扩大后 5.6选择7实现随机点的连线绘制 选择1确定,之后再选择随机出现点数,我们选择随机点为30,如图5-14所示, 图5-14 先选择7之后的选择界面 5.6.1选择输入30个随机点后,敲回车键,得到如图5-15所示 图5-15随机连线后(注:图片中每条线的颜色都是随机产生的) 6 学年设计总结与体会 6.1总结 经过这么多天的不懈努力我们最终成功完成了老师教给我们的任务。首先我们以点对点的方式将需要的两点相连,完成了画出二维图形的基本操作,然后我们又通过各种C语言函数实现了图形平移、缩放、旋转等变换!最后在老师的提议下我们做起了动态图形变换,经过反复修正,我们实现了这一变换! 6.2 体会 经过二个月的奋斗,这次学年设计终于做完了。通过这次设计我们也着实又感受了一次编程的乐趣,从中也学到了不少知识。 感受最深的一点是:以前用编程,只是注重如何编写函数能够完成所需要的功能,似乎没有明确的战术,只是凭单纯的意识和简单的语句来堆砌出一段程序。现在编程感觉完全不同了。在编写一个程序之前,先对这个课程设计进行了一下分析,写出总体流程以及细节流程,以使得自己的思路更加的清晰。然后进行编程,不断的在电脑上调试程序,终于完成了此次的课程设计。 另外,我还体会到C语言课程的重要性。只有真正理解各种函数的好处,才能用好C语言这门博大的学科。 通过这次课程设计逐渐提高了自己的程序设计和调试能力,我以前对大一些的程序一直很害怕,总是看不明白究竟这程序中间的过程是怎么进行的。在这次实验中我终于克服了这一障碍,一遍遍在心中自己默默的走,终于弄明白了,真的是功夫不负有心人啊! 这次试验也让我看到了自己的不足。还有许多关于C++的一些比较具体的东西还不太懂,比方说文件。这次试验还让我们意识到只有不断的在电脑上调试程序,自己的水平才能得到提高。 我会继续我们的兴趣编写程序的,相信在越来越多的尝试之后,自己会不断进步和提高。 在此我要感谢赵瑞斌老师在数据结构及课程设计中对我们的指引和帮助。 7 致谢 感谢赵瑞斌的指导几个组员的积极配合,才有此次课程设计的成功。在这里我也感谢所有给予我们关心帮助的老师,希望以后有更多的机会来锻炼自己的综合素质,为以后的学习、生活打下良好的基础。在这次课程设计中也暴露了我们的一些缺点,基础知识不够扎实,我们会在以后的日子里加以改正,更好地配合来提高自己综合能力! 参考文献: [1] 何钦铭,颜晖. C语言程序设计[M], 北京:高等教育出版社,2012. [2] 网络资源库, 百度文库. 评语: 评阅教师签名: 年 月 日 成 绩 22
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服