




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
计算机图形学实验报告课程名称:计算机图形学姓 名:院:专 业:年 级:学 号:指导教师:2016/6/10实验项目列表序号实验项目名称1圆的生成2 线段的裁剪3多边形填充实验名称:中点圆的生成一实验目的和要求:1.正确描述出中点画圆算法的原理。2.掌握中点画圆算法的原理,正确的编写出算法并掌握。3.能够对代码理解并且掌握并成功的画出理想的圆。4.熟练的运用opengl 二实验内容和原理: 1)原理: 根据中点与圆的位置关系来选择上下像素点。中点在圆内则取上点,在圆外则取下点。 2)内容: 初始化 = 1.25 r , 对于任意的p,=0)putpixel(xc+x,yc+y,color);putpixel(xc-x,yc+y,color);putpixel(xc-x,yc-y,color);putpixel(xc+x,yc-y,color);if(d0)d1=2*(d+y)-1;if(d10)d2=2*(d-x)-1;if(d2=0)direction = 2;else direction=3;else direction=3;switch (direction)case 1:x+;d+=2*x+1;break;case 2:x+;y-;d+=2*(x-y+1);break;case 3:y-;d+=-2*y+1;break;int main()int i,gdriver,gmode;gdriver=DETECT;initgraph(&gdriver,&gmode,C:TurboC3bgi);Breseham_Cirrcle(180,200,100,30);getch();closegraph();return 0;五 调试过程调试过程无错误六运行结果七 总结通过本次实验我了解以及熟悉了中点划圆算法的原理,通过算法能够顺利的画出圆形。不过对于算法和程序还是不是很熟,还需要进一步的加强! 实验名称:直线段的裁剪一 实验目的和要求:1) 认识什么是边框,如何在边框中裁剪一条直线2) 了解并掌握在一个在一个边框中裁剪直线段的原理。3) 正确的裁剪出符合要求的直线段。4) 通过直线段的裁剪学会多边形的裁剪5) 掌握opengl的各种用法二实验内容和原理: 1)实验原理:采用区域编码来求直线段与窗口的交点,从而裁剪出在窗口中的那部分线段。 2)实验内容:对条直线段的两个端点p1, p2分别进行编码code1,code2 。 code1 |code2 = 0,则保留直线段,对其进行显示。 code1 &code2 0,对直线段进行放弃。上述两个条件不成立则对直线段和窗口求交点。三实验环境 硬件:PC机;软件:Windows操作系统,Visual C+ 6.0,opengl 。四算法描述及实验步骤1)算法描述:输入直线段的两端点p1(x1,y1), p2(x2,y2)以及窗口的四条边界坐标wyt,wyb,wxl,wxr;对p1,p2进行编码,p1的编码为code1,p2的编码为code2. code1 |code2 = 0,对直线段应保留,转,否则,若code1 &code2 0,对直线段可放弃,转;当上述条件均不满足时,转.确保p1在窗口外部;若p1在窗口内部,则交换p1和p2的坐标值和编码值按左右上下的顺序求出直线段和窗口边界的交点,并利用该交点的坐标值替换p1的坐标值。也即在交点S处把线段一分为二,并去掉p1S这一段。用直线扫描转换算法画出当前的直线段p1 p2。(2)源代码:#include stdio.h#include #include #include /按照上下右左的顺序对方向进行编码#define LEFT 1#define RIGHT 2#define TOP 8#define BOTTOM 4struct pointdouble x, y;/颜色设计int boundaryColor = WHITE;int backColor = BLACK;int fillColor = GREEN;int left, right, top, bottom;/打印直线void printLine(point begin, point end, int color)setcolor(color);int x1,y1,x2,y2;x1 = begin.x + 0.5;y1 = begin.y + 0.5;x2 = end.x + 0.5;y2 = end.y + 0.5;line(x1,y1,x2,y2);/初始化画板void init()int gdriver,gmode;gdriver = DETECT;gmode = 0;setbkcolor(backColor);initgraph(&gdriver, &gmode, );void inputBoundary()freopen(k:line.in,r,stdin);scanf(%d%d%d%d, &top, &bottom, &left, &right);setcolor(boundaryColor);rectangle(left, top, right, bottom);int code(point p)int c = 0;if(p.x right)c += RIGHT;if(p.y bottom)c += BOTTOM;return c;double gety(point begin, point end, int type)return begin.y + (end.y - begin.y) * (type - begin.x) / (end.x - begin.x);double getx(point begin, point end, int type)return begin.x + (end.x - begin.x) * (type - begin.y) / (end.y - begin.y);void cohen(point begin, point end)int beginCode = code(begin);int endCode = code(end);while(beginCode | endCode)if(beginCode & endCode) != 0)return;int c;if(beginCode != 0)c = beginCode;elsec = endCode;point tmp;if(c & LEFT)tmp.y = gety(begin, end, left);tmp.x = left;else if(c & RIGHT)tmp.y = gety(begin, end ,right);tmp.x = right;else if(c & TOP)tmp.x =getx(begin, end, top);tmp.y = top;else if(c & BOTTOM)tmp.x = getx(begin, end, bottom);tmp.y = bottom;if(beginCode != 0)begin = tmp;beginCode = code(begin);elseend = tmp;endCode = code(end);printLine(begin, end, fillColor);void DDD(point begin, point end)if(fabs(begin.x - end.x) 0.1)return;int beginCode = code(begin);int endCode = code(end);if(beginCode | endCode) = 0)printLine(begin, end, fillColor);return;if(beginCode & endCode)return;point mid;mid.x = (begin.x + end.x) / 2;mid.y = (begin.y + end.y) / 2;DDD(begin,mid);DDD(mid,end);void test()init();inputBoundary();point begin,end;while(scanf(%lf%lf%lf%lf,&begin.x, &begin.y, &end.x, &end.y) = 4)printf(裁剪前:n);printLine(begin, end, WHITE);getch();printf(裁剪后:n);cohen(begin, end);getch();int main()test();return 0;(3)输入文件五 调试过程调试过程无错误六运行结果剪裁前的:剪裁后的:七总结通过本次实验我学会了如何在边框中剪裁出一条直线,掌握了从边框中剪裁一条直线的原理。 实验名称:多边形的填充一 .实验要求和目的1)认识多边形扫描转换,认识并掌握逐点判断算法,扫描线算法,边界标志算法等的实现及优缺点。2)理解什么是四连通区域和八连通区域。理解并掌握一种多边形填充的原来及其实现。3)深度掌握opengl。二实验内容和原理:扫描线种子填充算法:1)原理:给定种子点时,首先填充种子点所在扫描线上的位于给定区域的一个区段,然后确定与这一区域相连通的上下扫描线上位于给定区域内的区段,并保存下来,直到填充结束。三实验环境 硬件:PC机;软件:Windows操作系统、Visual C+ 6.0 ,opengl。四算法描述及实验步骤1)算法描述 将栈置空,将种子点入栈 如果栈是空的则结束,否则取栈顶元素,并且以作为当前的扫描线 填充并确定种子点所在的区段:从种子点出发,沿着当前扫描线像左右两个方向填充,直到边界,然后分别标记。确定新的种子点,在区间中检查与当前扫描线上下两条扫描线上的像素,如果存在非边界,未填充的像素,则把每一个区间的最右像素作为种子点压入栈中,返回第2步。(2)源代码:#include#include#include#includestruct pointint x,y;stack500;int top;int oldColor = BLACK;int newColor = WHITE; int boundaryColor = WHITE;struct polygonint num;point vertex10;void printLine(point a,point b,int color); void init(); polygon inputPolygon();void printPolygon(polygon p);void printLine(point a,point b,int color)setcolor(color);line(a.x,a.y,b.x,b.y);void init()int gdriver,gmode;gdriver = DETECT;gmode = 0;initgraph(&gdriver, &gmode, );void printPolygon(polygon p)int i;for(i = 1; i p.num; i+)printLine(p.vertexi,p.vertexi + 1,boundaryColor);printLine(p.vertex1,p.vertexp.num,boundaryColor);polygon inputPolygon()polygon p;int i;printf(input polygon edge numbern);scanf(%d,&p.num);printf(input all vertex one by onen);for(i = 1; i = p.num; i+)scanf(%d%d,&p.vertexi.x,&p.vertexi.y);return p;int fillLeft(point pt)pt.x;while(getpixel(pt.x,pt.y) = oldColor)putpixel(pt.x,pt.y,newColor);pt.x-;return pt.x + 1;int fillRight(point pt)pt.x+;while(getpixel(pt.x,pt.y) = oldColor)putpixel(pt.x,pt.y,newColor);pt.x+;return pt.x - 1;void findSeed(point stack,point pt,int xr)bool scanNeedFill = false;int x = pt.x;int y = pt.y;while(x = xr)while(getpixel(x,y) = oldColor)scanNeedFill = true;x+;if(scanNeedFill = true)pt.x = x - 1;pt.y = y;stack+top = pt;scanNeedFill = false;while(getpixel(x,y) != oldColor & x = xr)x+;void scanLineFill(int x, int y)int xl ,xr ,i;bool scanNeedFill;point pt,tmp;top = 0;pt.x = x;pt.y = y;/入栈stack+top = pt;while(top) /pt = stacktop-;xl = fillLeft(pt);xr = fillRight(pt);tmp.x = xl;tm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工业电气自动化控制系统的应用
- 工作坊组织与执行要点
- 工作中的人性化情绪管理与压力缓解方法探讨
- 工作效率优化与创新思维的融合
- 工作效率提升工具及技术应用
- 工作场所中的性别平等意识培养
- 工程中的动态力学校准技术
- 工作安全分析与改善策略
- 工厂安全管理与风险控制
- 工程地质学的研究进展与展望
- 公司法人个人简介怎么写
- 从“瑞幸会计造假案”谈会计诚信问题
- 食品配送业食品安全培训
- 岗位之间工作衔接配合安全与职业卫生事项课件
- 华为IPD流程管理
- 保险经纪行业保险安全培训
- 监理抽检表 - 04路基土石方工程
- 计算机网络谢希仁第七版全套课件
- 安徽省成人肾病综合征分级诊疗指南(2016年版)
- 动物生物化学第3版高职全套教学课件
- 重庆地区小(1)型水库分布区及大小
评论
0/150
提交评论