计算机图形学填充及裁剪算法实现

上传人:第*** 文档编号:61736114 上传时间:2018-12-11 格式:PDF 页数:33 大小:398.51KB
返回 下载 相关 举报
计算机图形学填充及裁剪算法实现_第1页
第1页 / 共33页
计算机图形学填充及裁剪算法实现_第2页
第2页 / 共33页
计算机图形学填充及裁剪算法实现_第3页
第3页 / 共33页
计算机图形学填充及裁剪算法实现_第4页
第4页 / 共33页
计算机图形学填充及裁剪算法实现_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《计算机图形学填充及裁剪算法实现》由会员分享,可在线阅读,更多相关《计算机图形学填充及裁剪算法实现(33页珍藏版)》请在金锄头文库上搜索。

1、计算机图形学计算机图形学 课程实课程实 验验 报报 告告 实验题目实验题目 填充与裁剪算法的实现 班班级级 姓姓名名 学学号号 指导教师指导教师 日日期期 信息与计算科学专业基础课 Computer Graphics ReportOfcourse experiment -图形学课程实验报告- 1 - 实验说明 试验目的试验目的: 掌握图形填充与裁剪算法的基本思想,并能上机编程实现相应的算法。 。 试验地点试验地点: 教九楼 401数学系机房 实验要求实验要求( (DirectionDirection) ): :1.每个学生单独完成;2.开发语言为 TurboC 或 C+,也可使用其它 语言;3

2、.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试 验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序, 考试前统一检查和上交。 实验内容 实验题一实验题一 1.11.1 实验题目实验题目 上机编程序实现多边形区域填充算法。要求:(1)多边形要求采用顶点表示,且 顶点的个数和顶点坐标可以随机输入;(2)要求先画出多边形,画出多边形的同时要求 标明各顶点坐标;(3)水平扫描线的顺序和填充颜色可以自由选择。 1.21.2 实验目的和意义实验目的和意义 掌握多边形区域填充的概念,掌握扫描线填充法。 1.31.3 程序制作步骤程序制

3、作步骤( (包括算法的基本思想、流程图、设计步骤等) ) 一、算法过程(设计步骤) (1)根据给出的顶点坐标数据,按 y 递增顺序建立 ET 表。 (2)根据 AET 指针,使之为空。 (3)使 y=ymin(ymin 为顶点坐标中最小 y 值) 。 (4)反复做下述各步,直至 y=ymax(顶点坐标中 y 的最大值)或 ET 与 AET 为空。 将 ET 表加入到 AET 中,并保持 AET 链中的记录按 x 值递增排序。 对扫描线 yi 一次成对取出 AET 中 xi 值,并对每对 xi 之间填上所要求的颜色或 图案。 从 AET 中删除 yi=ymax 的记录。 对保留下来的 AET 中

4、的每个记录,用 xi+1/m 代替 xi,并重新按 x 递增排序。 填充与裁剪算法的实现 实验实验3 3 -图形学课程实验报告- 2 - 使 yi+1,以便进入下一个循环。 二、流程图: N Y 初始化图形模式 求原始边记录 r 输入顶点个数 n 和顶点坐标 p 开始 构造 ET 表 添加新边到 AET 表中 y #include“graphics.h“ #include #include #include #define MAXSIZE 800 using namespace std; /点的结构体 typedef struct int x; int y; Point; /原始边记录,只记录

5、起始和结束点,以 Y 递增定义 typedef struct Point start; Point end; RamEdge; /边记录类 Edge(用于 ET 表和 AET 表) class Edge public: -图形学课程实验报告- 4 - int yMAXSIZE; float xbottom; float increx; Edge(int yMAXSIZE=0,int xbottom=0,float increx=0) this-yMAXSIZE=yMAXSIZE; this-xbottom=xbottom; this-increx=increx; ; bool operator

6、 ET_Structor(RamEdge r,int n,int i)/i 为当前扫描线 int j,x1,x2,y1,y2; list e; list:iterator k; Edge tempEdge; for(j=0;jyMAXSIZE) yMAXSIZE=pi.y; list:iterator k; /构造 ET list ETMAXSIZE; for(i=0;i AET; int y; for(y=0;y:iterator it=AET.begin(); it!=AET.end(); ) if(*it).yMAXSIZE=y+ymin) it = AET.erase(it); els

7、e +it; /排序 AET.sort(); /成对取出 xi,并填充 k=AET.begin(); while(k!=AET.end() -图形学课程实验报告- 9 - x1 = (*k).xbottom; x2 = (*(+k).xbottom; k+; setcolor(color); line(x1,y+ymin,x2,y+ymin); /更新所有边 for(it=AET.begin(); it!=AET.end();+it) (*it).xbottom = (*it).xbottom+(*it).increx; /*第五部分* *测试部分 */ void main(void) Poi

8、nt p8; int n=8; /输入顶点个数和顶点坐标 coutn; coutpi.x; cinpi.y; /初始化图形模式 int gd,gm; detectgraph( initgraph( /输出端点坐标 char str15; settextstyle(0,0,2); for(i=0;itop9 ytop8 xright ytop10 表 2.1 Step3: 1.若 C1=C2=0,则表示 p1 和 p2 都位于窗口内,应全部保留; 2.若 C1C20,则表示 p1 和 p2 都位于窗口外一侧,应全部舍去; 3.若 C1 和 C2 不符合上述两种情况,不能简单地保留或舍去直线,则需

9、要计算直 线与窗口边线的交点,将直线分段后继续检查判断。这样可以逐段舍去位于窗口外的 直线,保留窗口内的直线。 进行如下循环,直到出现情况 1 或 2: (1)若 p1 在窗口外,即 C10,则往下;否则交换 p1 和 p2,C1 和 C2; (2)依次求直线与窗口的交点 p_jiao。 选择离 p1 比较近且位于窗口内的交点,若不存在这样的交点,则说明直线在 窗口外,应全部舍去。若存在这样的交点,令 p1=p_jiao。 流程图: -图形学课程实验报告- 14 - N Y N Y Y N N N N Y Y Y 开始 求p1,p2的编码C1,C2 C1=C2=0 结束 C1C20 连接 p1

10、,p2 求直线与窗口离 p1 比较近两条或一条 边的交点 交点中有编码为 0 的交点 p_jiao1 C1 = 0 输入窗口 left,top,right,bottom 边界 值和直线端点 p1,p2 的坐标 C2 =0 连接 p_jiao1, p2 连接 p_jiao2,p_jioaao1 交 换 p1 和 p2 交 换 c1 和 c2 求直线与窗口离 p2 比较近两条或一条 边的交点 交点中有编码为 0 的交点 p_jiao2 图 2.2 -图形学课程实验报告- 15 - 2.42.4 主程序主程序 /*第一部分* *头文件,点类 Point,线类 Line,窗口类 Viewport */

11、 #include #include“graphics.h“ using namespace std; /点类 class Point public: int x; int y; Point(int x,int y) this-x = x; this-y = y; ; void operator=(Point y=a.y; ; ; /线类 class Line public: Point p1; Point p2; Line(int x1,int y1,int x2,int y2):p1(x1,y1),p2(x2,y2) p1.x=x1; p1.y=y1; p2.x=x2; p2.y=y2;

12、; Line(Point void Draw() line(p1.x,p1.y,p2.x,p2.y); -图形学课程实验报告- 16 - ; ; /窗口类 class Viewport public: int left; int right; int top; int bottom; Viewport(int l,int b,int r,int t) left= l; bottom = b; right= r; top= t; ; void Draw(int color) setcolor(color); rectangle(left,top,right,bottom); ; ; /*第二部分

13、* *求编码函数 GetCode (Viewport viewport , Point p) *参数解释:viewport 为窗口,p 为所要求的点 */ int GetCode(Viewport viewport,Point p) int code; int left=viewport.left; int right=viewport.right; int top =viewport.top; int bottom=viewport.bottom; int x=p.x; int y=p.y; if(xtop)code=9; else if(yright) if(ytop)code=10; e

14、lse if(ytop)code=8; else if(yleftbottomrighttop; Viewport myView(left,bottom,right,top); /测试数据 coutn; Line *line = (Line *)malloc(sizeof(Line)*n); for(i=0;ilinei.p1.xlinei.p1.ylinei.p2.xlinei.p2.y; cout1 p_mid.y=(p1.y+p2.y)/2.0; code_mid=GetCode(viewport,p_mid); if(abs(line.p2.x-p_mid.x)1 p_mid.y=(p

15、1.y+p2.y)/2.0; code_mid=GetCode(viewport,p_mid); if(abs(line.p1.x-p_mid.x)1 p_mid.y=(p1.y+p2.y)/2.0; code_mid=GetCode(viewport,p_mid); if(abs(line.p2.x-p_mid.x)=1 if(code_mid else p2=p_mid; p2_distance=p1; (Line(p1_distance,p2_distance).Draw(); return 2; 3.53.5 运行结果图运行结果图 -图形学课程实验报告- 31 - 图 3.5.1 直线中点分割裁剪算法输入数据 图 3.5.2 直线中点分割裁剪算法直线未裁剪前 -图形学课程实验报告- 32 - 图 3.5.3 直线中点分割裁剪算法直线裁剪后 参考文献 1 王汝传,黄海平,林巧民计算机图形学教程(第二版) 北京:人民邮电出版社, 2009 2谭浩强. C 语言程序设计M. 北京:清

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号