




已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Computer Graphics Report Of course experiment 信息与计算科学专业基础课计算机图形学课程实验 报 告实验题目 设计算法绘制直线与圆 班 级 姓 名 学 号 指导教师 日 期 实验2设计算法绘制直线与圆实验说明试验目的: 掌握直线和圆的基本生成算法思想,并上机编程实现相应的算法。试验地点: 教九楼401 数学系机房实验要求(Direction): 1. 每个学生单独完成;2.开发语言为TurboC或C+,也可使用其它语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。实验内容:实验题一1.1实验题目1).用DDA法在屏幕上画一条具有三个像素宽的直线段L1。要求:(1)直线段L1的两个端点坐标和画线颜色都要求可以随机输入;(2)要求输出直线段L1上的各点坐标;(3)画出直线的同时要求标明两端点坐标。2).将课堂所讲的斜率0K1、-1K0和K-1的情况,编写一通用的中点画线算法。1.2实验目的和意义1.了解如何利用C语言和图形函数进行绘图;2. 熟悉并掌握C语言的图形模式控制函数,图形屏幕操作函数,以及基本图形函数;3. 通过对Turbo C进行图形程序设计的基本方法的学习,能绘制出简单的图形;4. 熟悉并掌握DDA法在屏幕上画一条具有三个像素宽的直线段L1以及通用的中点画线算法。通过DDA法及用的中点画线算法,了解图形系统初始化、图形系统关闭和图形模式的控制,并熟练运用图形坐标的设置,包括定点、读取光标以及图形颜色的设置。1.3程序制作步骤(包括算法思想、算法流程图等)1.自动搜索显示器类型和显示模式,初始化图形系统,通过printf、scanf语句控制线段的端点坐标和画线颜色的自由输入;2. DDAline:设直线之起点为(x1,y1),终点为(x2,y2),则斜率k为: 则有:.可通过计算由x方向的增量引起y的改变生成直线。由 (为直线上某步的初值)则.也可通过计算由y方向的增量引起x的改变生成直线。由(为直线上某步的初值)则:3.Midpointline: .假定X坐标为的各像素点中,与直线最近点已确定为 (用实心小圆表示),那么下一个与直线最近的象素点只能是正右方的或右上方两者之一。. 再以M表示P1与P2的中点,即又设Q是理想直线与垂直线的交点 。显然有: .当M在Q的下方,则P2 离直线 近,应取为下一个象素点;.当M在Q的上方,则P1离直线 近,应取为下一个象素点。.当M和Q重合,则P 1和P2离直线 一样近,两者均可取为下一个象素点1.4主程序1.4.1 DDA算法#include graphics.h#include #include #include #include DDAline(int x1, int y1, int x2, int y2, int c)float delta_x = 0;float delta_y = 0;float x = 0;float y = 0;int dx= 0;int dy = 0;int steps = 0;int k = 0;dx=x2-x1;dy=y2-y1;if (abs(dx)abs(dy) steps=3*abs(dx);else steps=3*abs (dy);delta_x=(float)dx / (float)steps;delta_y=(float)dy / (float)steps;x=float(x1);y=float(y1);for (k=1; k=steps;k+)putpixel(int(x+0.5), int(y+0.5), c);x+=delta_x;y+=delta_y;return 0;void main()char t100 = 0;int x1 = 0;int y1 = 0;int x2 = 0;int y2 = 0;int c = 0;void dda_line(int x1,int y1,int x2,int y2,int c);int graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,D:TC); /*初始化图形系统*/printf(输入两端点坐标:n);scanf(,&x1,&y1,&x2,&y2);printf(输入画线颜色:n);scanf(%d,&c);DDAline(x1,y1,x2,y2,c);sprintf(t,(%d,%d),x1,y1);outtextxy(x1,y1,t);sprintf(t,(%d,%d),x2,y2);outtextxy(x2,y2,t);getch(); /*等待按一键结束*/closegraph(); /*关闭图形系统,回到文本模式*/1.4.2 中点画线算法#include #include #include #include #include graphics.hMidpointLine(int x1,int y1,int x2,int y2,int c)int a = 0;int b = 0;int d1 = 0;int d2 = 0;int d = 0;int x = 0;int y = 0;float m = 0;if (x2=0 & m=1)d=2*a+b;d1=2*a;d2=2*(a+b);while (xx2)if (d=0)x+;y+;d+=d2;elsex+;d+=d1;putpixel(x,y,c);else if (m=-1)d=2*a-b;d1=2*a-2*b;d2=2*a;while (x0)x+;y-;d+=d1;elsex+;d+=d2;putpixel(x,y,c);else if (m1)d=a+2*b;d1=2*(a+b);d2=2*b;while (y0)x+;y+;d+=d1;elsey+;d+=d2;putpixel(x,y,c);elsed=a-2*b;d1=-2*b;d2=2*(a-b);while (yy1)if (d=0)x+;y-;d+=d2;elsey-;d+=d1;putpixel(x,y,c);return 0;void main()char t100 = 0;int x1 = 0;int y1 = 0;int x2 = 0;int y2 = 0;int c = 0;int graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode,D:TC); /*初始化图形系统*/printf(输入两端点坐标:n);scanf(,&x1,&y1,&x2,&y2);printf(输入画线颜色:n);scanf(%d,&c);MidpointLine(x1,y1,x2,y2,c);sprintf(t,(%d,%d),x1,y1);outtextxy(x1,y1,t);sprintf(t,(%d,%d),x2,y2);outtextxy(x2,y2,t);getch(); /*等待按一键结束*/closegraph(); /*关闭图形系统,回到文本模式*/1.5运行结果图1.5.1 DDA算法图1.5.1DDA算法运行结果截图图1.5.2DDA算法运行结果截图1.5.2 中点画线算法图1.5.3中点画线算法当k=1时运行结果截图图1.5.4中点画线算法当k=1时运行结果截图图1.5.5中点画线算法当0k1时运行结果截图图1.5.6中点画线算法当0k1时运行结果截图图1.5.7中点画线算法当k=-1时运行结果截图图1.5.8中点画线算法当k=-1时运行结果截图图1.5.9中点画线算法当-1k0时运行结果截图图1.5.10中点画线算法当-1k0时运行结果截图图1.5.11中点画线算法当k-1时运行结果截图:实验题二2.1实验题目1).参考课堂所讲过的斜率为01和大于1的Bresenham画线程序,将该算法程序扩展到任一八分圆坐标空间图,从而形成一般的Bresenham画线算法。并利用Bresenham画线算法画出4条不同颜色、不同斜率的直线段L1、L2、L3、L4。要求:(1)4条直线段L1、L2、L3、L4的斜率K1、K2、K3、K4满足:0K11,-1K20, K31;(2)直线段的两个端点坐标和画线颜色都要求可以随机输入。2).参考课堂所讲过的圆心在原点,半径为R的第一个4分圆的Bresenham画圆算法程序,利用对称性将该算法程序推广到任一四分圆,从而形成一般的Bresenham画圆算法。并利用该算法画出一个圆心在点(xc, yc),半径为R,圆周颜色为color的圆。要求:(1)圆心的坐标、半径和圆周颜色都要求可以随机输入;(2)要求利用文本输出函数显示出所画圆的圆心和半径;(3)利用四向简单种子填充算法填充该圆。2.2实验目的和意义1.熟悉并掌握各种斜率的Bresenham画线程序2.熟悉并掌握C语言的图形模式控制函数,图形屏幕操作函数,以及基本图形函数;3.熟悉并掌握Bresenham画圆算法画一个完整的圆并进行填充。2.3程序制作步骤(包括算法思想、算法流程图等)Bresenham画线算法思想步骤:1.画起点(x1, y1). 2.准备画下一个点,X坐标加1,判断如果达到终点,则完成。否则找下一个点,由图可知要画的点要么为当前点的右邻接点,要么是当前点的右上邻接点。 2.1.如果线段ax+by+c=0与x=x1+1的交点y坐标大于(y+*y+1)/2则选右上那个点 2.2.否则选右下那个点。 3.画点 4.跳回第2步 5.结束Bresenham画线算法流程图Bresenham画圆算法步骤:1.首先,真实的线条是连续的,但是计算机中的线条是离散的,是由很多点组成的,那么画线的重点就是如何高效地找到这些离散的点来更好地画出想要的图形2.实验要求用Bresenham算法实现画圆。那么首先先要了解Bresenham算法是一种什么算法。经过查阅,我找到Bresenham直线算法和画圆算法。直线是圆的基础。 Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线,是计算机图形学中最先发展出来的算法。 Bresenham画圆算法又称中点画圆算法,与Bresenham 直线算法一样,其基本的方法是利用判别变量来判断选择最近的像素点,判别变量的数值仅仅用一些加、减和移位运算就可以计算出来。为了简便起见,考虑一个圆 心在坐标原点的圆,而且只计算八分圆周上的点,其余圆周上的点利用对称性就可得到。Bresenham画圆算法流程图:2.4主程序2.4.1Bresenham画直线#includegraphics.h#include#includeswap(int *a,int *b)int tmp;tmp=*a;*a=*b;*b=tmp;int Bresenham_line(int x1,int y1,int x2,int y2,int color)double dx,dy,h,x,y,t;if(x1x2)swap(&x1,&x2);swap(&y1,&y2);dx=x2-x1;dy=y2-y1;x=x1;y=y1;putpixel(x,y,color);if(dx=0) while(y!=y2) putpixel(x,y,color);y+;if(dy=0)while(x!=x2)putpixel(x,y,color);x+;if(dy!=0&dx!=0)if(dy0)if(dy=dx)h=2*dy-dx;while(x!=x2)if(h0)h+=2*dy;elsey+;h+=2*(dy-dx);putpixel(x,y,color);x+;elseh=2*dx-dy;while(y!=y2)if(h0)h+=2*dx;else +x;h+=2*(dx-dy);putpixel(x,y,color);y+;elset=-dy;if(t=dx) h=2*dy+dx;while(x!=x2)if(h0)h+=2*(dy+dx);y-;elseh+=2*dy;putpixel(x,y,color);x+;elseh=-(2*dx*dy)-(dy*dy);while(y!=y2)if(h0)h+=-(2*dx*dy);elseh+=-(2*dx*dy)-(2*dy*dy);x+;putpixel(x,y,color);y-;return 0;main()int x1,y1,x2,y2;char c;int color;int gdriver=DETECT,gmode;here:/color=6;/printf(Origin is in middle!nyou can input - minusn);printf(请输入起点坐标:);scanf(%d %d,&x1,&y1);printf(请输入终点坐标:);scanf(%d %d,&x2,&y2);printf(请输入画笔颜色:);scanf(%d,&color);initgraph(&gdriver,&gmode,);Bresenham_line(0,240,640,240,255);Bresenham_line(320,0,320,480,255);Bresenham_line(x1+320,y1+240,x2+320,y2+240,color);getch();printf(ngo on?: (y/n);c=getch();if(c=y|c=Y)goto here;2.4.2Bresenham画圆/Bresenham画圆算法#include graphics.h#include #include conio.hvoid Bresenham_Circle(int r,int a,int b,int color)int x,y,delta,delta1,delta2,direction;x=0; y=r;delta=2*(1-r);while(y=0)putpixel(a+x,b+y,color);putpixel(a-x,b+y,color);putpixel(a+x,b-y,color);putpixel(a-x,b-y,color);if(delta0)delta1=2*(delta+y)-1;if(delta10)delta2=2*(delta-x)-1;if(delta21时运行结果截图图2.5.2 Bresenham画线算法当k1时运行结果截图图2.5.3 Bresenham画线算法当1k0时运行结果截图图2.5.4 Bresenham画线算法当1k0时运行结果截图图2.5.5 Bresenham画线算法当k-1时运行结果截图图2.5.6 Bresenham画线算法当k-1时运行结果截图图2.5.7 Bresenham画线算法当-1K0时运行结果截图图2.5.8 Bresenham画线算法当-1K0时运行结果截图Bresenham画圆:图2.5.9 Bresenham画圆算法运行结果截图图2.5.10 Bresenham画圆算法运行结果截图:实验题三3.1实验题目自学椭圆的Bresenham生成算法,利用对称性将该算法程序推广到任一四分圆,从而形成一般的Bresenham画椭圆算法。并上机编程画出一个圆心在点(xc, yc);沿x轴方向的长半轴长度为a, 沿y轴方向的短半轴长度为b; 圆周颜色为color的椭圆。要求:(1)椭圆心的坐标、长半轴长度为a、短半轴长度为b和圆周颜色color都要求可以随机输入;(2)要求利用文本输出函数显示出所画椭圆的圆心。3.2实验目的和意义1. 自学椭圆的Bresenham生成算法2. 利用对称性将该算法程序推广到任一四分圆,编写一般的Bresenham画椭圆算法3.熟悉并掌握椭圆弧的画法,并拓展到整个8分椭圆。3.3程序制作步骤(包括算法思想、算法流程图等)1. 输入椭圆的长半轴和短半轴。2. 计算初始值,。3. 绘制点及其在四分象限上的另外3个对称点。4. 判断的符号。若,则先将更新为,再将 更新为;否则先将更新为,再将更新为。5. 当时,重复步骤(3)和(4),否则转到步骤(6)。6. 用上半部分计算的最后点来计算下半部分中的初值: 7. 绘制点及其在四分象限上的另外3个对称点。8. 判断的符号。若,则先将更新为, 再将更新为;否则先将更新为,再将更新为。9. 当, 重复步骤(7)和(8),否则结束。3.4主程序#include graphics.h#include stdio.h#include conio.hvoid Bresenham_Ciecle(int a,int b,int p,int q,int c) putpixel(p,q,c);int x=0;int y=b;double dt=b*b+a*a*(-b+0.25);putpixel(x+p,y+q,c);while( b*b*(x+1) a*a*(y-0.5)if(dt 0 )if( db 0)db+=b*b*(2*x+2)
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《谏太宗十思疏》魏征课件
- 《谁藏起来了》课件
- 急诊进修生汇报
- 护理紧急状态下人员调配
- 公司职代会安全培训提案课件
- 《诗经·摽有梅》课件
- 公司组织安全生产培训会课件
- 护理专业求职方向
- 亮化工程安全培训课件
- 蓝色商务财务汇报
- 注浆加固技术课件
- 国家开放大学《现代汉语专题》章节自测参考答案
- 老舍《我的母亲》 中职课件
- 锅炉煮炉方案
- (中职)工业机器人应用编程(FANUC) 初级 项目六 任务三 码垛程序编制电子课件
- 分段函数-完整版获奖课件
- 电子小报社团教案
- 信访人的权利、义务和禁止行为告知书
- 2022年发展对象个人汇报材料
- 数学人教A版(2019)必修第一册1.3集合的基本运算(共17张ppt)
- 塑料电镀原理与工艺介绍(12013-03-08)
评论
0/150
提交评论