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

合集下载

计算机图形学课程设计

计算机图形学课程设计

计算机图形学课程设计一、课程目标知识目标:1. 让学生掌握计算机图形学的基本概念、基本原理和基本算法,如二维图形的表示、变换、裁剪和三维图形的建模、光照模型等。

2. 使学生了解计算机图形学在实际应用中的发展现状和前景,如虚拟现实、计算机辅助设计等。

3. 帮助学生建立计算机图形学与相关学科(如数学、物理、艺术等)的联系,提高跨学科素养。

技能目标:1. 培养学生运用计算机图形学知识解决实际问题的能力,如使用相关软件进行二维绘图、三维建模等。

2. 提高学生的编程能力,使其能够使用至少一种计算机图形学编程库(如OpenGL、DirectX等)实现基本图形绘制和动画效果。

3. 培养学生的团队协作能力和沟通表达能力,通过小组项目实践,共同完成具有一定难度的计算机图形学任务。

情感态度价值观目标:1. 激发学生对计算机图形学的兴趣,培养其主动探究、创新实践的精神。

2. 培养学生具有良好的审美观,能够从美学的角度评价和优化计算机生成的图形。

3. 强化学生的版权意识,尊重他人知识产权,遵循学术道德,树立正确的价值观。

本课程针对高中年级学生,结合学科特点和教学要求,将目标分解为具体的学习成果,以便于后续的教学设计和评估。

通过本课程的学习,期望学生能够掌握计算机图形学的基础知识,提高实际操作技能,培养良好的情感态度价值观。

二、教学内容1. 计算机图形学基本概念与历史:介绍计算机图形学的定义、发展历程、应用领域及发展趋势。

- 教材章节:第一章 计算机图形学概述- 内容安排:1课时2. 二维图形的表示与处理:讲解二维图形的数学表示、几何变换、裁剪算法等。

- 教材章节:第二章 二维图形处理- 内容安排:4课时3. 三维图形的建模与渲染:介绍三维图形的建模方法、光照模型、纹理映射等。

- 教材章节:第三章 三维图形处理- 内容安排:5课时4. 计算机动画与视觉效果:探讨计算机动画原理、关键帧动画、粒子系统等视觉效果技术。

- 教材章节:第四章 计算机动画与视觉效果- 内容安排:4课时5. 计算机图形学编程实践:学习计算机图形学编程库(如OpenGL、DirectX 等)的基本使用,完成二维和三维图形绘制实例。

计算机图形学(C语言)教案

计算机图形学(C语言)教案

计算机图形学(C语言)教案第一章:计算机图形学概述1.1 课程介绍介绍计算机图形学的定义、发展和应用领域。

解释图形和图像的区别。

1.2 图形学基本概念什么是点、线、面和体。

坐标系统和变换。

图形表示方法和存储结构。

1.3 图形处理流程图形输入、输出和显示。

图形裁剪和映射。

图形渲染和着色。

1.4 常见图形算法直线、圆和椭圆的算法。

填充算法和图像处理算法。

第二章:C语言基础2.1 C语言简介介绍C语言的历史和特点。

解释C语言在计算机图形学中的应用。

2.2 基本数据类型和语法整型、浮点型、字符型数据。

变量、常量和运算符。

2.3 控制语句条件语句和循环语句。

分支语句和循环控制语句。

2.4 函数和数组函数的定义和调用。

一维、二维数组和字符串。

第三章:图形库和API3.1 图形库简介什么是图形库和API。

常见的图形库和API介绍。

3.2 图形库的使用方法图形库的安装和配置。

图形库的基本函数和功能。

3.3 图形API的调用过程初始化图形环境。

创建图形对象和操作图形对象。

处理图形事件和关闭图形环境。

3.4 示例:绘制简单的图形使用图形库绘制点、线、圆等基本图形。

调整图形属性和颜色。

第四章:图形绘制和变换4.1 图形绘制基础绘制基本图形和文本。

使用图形属性调整图形外观。

4.2 图形变换坐标变换和几何变换。

矩阵和变换矩阵的运算。

4.3 图形裁剪和映射裁剪原理和算法。

映射原理和算法。

4.4 示例:绘制复杂的图形使用图形变换绘制复杂的图形。

应用图形裁剪和映射技术。

第五章:图形渲染和着色5.1 图形渲染基础什么是图形渲染和着色。

光和材质的模型。

5.2 颜色模型和转换RGB颜色模型和HSV颜色模型。

颜色转换和混合。

5.3 图形着色和光照基本着色算法和纹理映射。

点光源、聚光灯和环境光。

5.4 示例:实现简单的光照效果使用图形着色和光照技术绘制三维图形。

调整光照参数和观察光照效果。

第六章:图形界面设计6.1 图形界面设计基础界面设计原则和概念。

计算机图形学(简单多边形裁剪算法)

计算机图形学(简单多边形裁剪算法)

简单多边形裁剪算法摘要:多边形裁剪算法与线性裁剪算法具有更广泛的实用意义,因此它是目前裁剪研究的主要课题。

本文主要介绍了一种基于多边形顶点遍历的简单多边形裁剪算法,它有效降低了任意多边形裁剪复杂度。

通过记录交点及其前驱、后继信息,生成结果多边形,该算法简化了交点的数据结构,节省了存储空间,降低了算法的时间复杂度,具有简单、易于编程实现、运行效率高的特点。

关键词:多边形裁剪;交点;前驱;后继;矢量数组一、技术主题的基本原理简单多边形裁剪算法综合考虑现有多边形裁剪算法的优缺点,它是一种基于多边形顶点遍历来实现简单多边形裁剪工作的。

其主要的原理是遍历多边形并把多边形分解为边界的线段逐段进行裁剪,输出结果多边形。

二、发展研究现状近年来,随着遥感绘图、CAD辅助设计、图象识别处理技术的发展,图形裁剪算法从最初在二维平面上线和图形的裁剪扩展到三维空间里体和场的裁剪,国内外相继提出不少行之有效的算法,但越来越复杂的图形和计算也对算法的速度和适用性提出了越来越高的要求。

因此,不断简化算法的实现过程,完善细节处理,满足大量任意多边形的裁剪也就成了当今算法研究的焦点之一。

以往多边形裁剪算法不是要求剪裁多边形是矩形,就是必须判断多边形顶点的顺时针和逆时针性,即存在不实用或者是增加了多边形裁剪算法的难度。

为了解决现在的问题,我们研究现在的新多边形算法,其中,裁剪多边形和被裁剪多边形都可以是一般多边形,且不需要规定多边形输入方向。

它采用矢量数组结构,只需遍历剪裁多边形和被裁剪多边形顶点即完成多边形的裁剪,具有算法简单、运行效率高的特点。

三、新算法设计1、算法的思想本算法是为了尽量降低任意多边形裁剪算法复杂度而提出的,其主要思想是采用矢量数组结构来遍历裁剪多边形和被裁多边形顶点,记录裁剪多边形和被裁减多边形交点及其前驱、后继信息,并通过记录相邻交点的线段,然后通过射线法选择满足条件的线段,之后进行线段连接,输出对应的裁剪结果。

图形学课程设计要求 《计算机图形学》

图形学课程设计要求 《计算机图形学》

《计算机图形学》课程设计一、 设计要求1. 根据设计任务,编制程序,在机器上调试运行,并通过上机考核。

2. 按照下面的“三、课程设计报告格式”的要求,写出课程设计报告。

3. 课程设计报告在第19周之前交来。

二、 设计任务1.1)给定直线的起点坐标为P0(x0,y0)、终点坐标为P1(x1,y1),容易计算出直线斜率k 。

假设0≤k ≤1,则x 方向为主位移方向,绘制直线的递推公式为:,这称为数值微分法(Digital Differential Analyzer ,DDA ),请编程实现之。

提示:DDA 算法实质上是对直线斜率进行了四舍五入计算。

2)椭圆的扫描转换。

2.用鼠标在屏幕上绘制任意顶点数的封闭多边形并填充,填充效果如下图所示。

编程要求:⑴多边形的顶点数不受限制;⑵按下鼠标左键,拖动鼠标绘制多边形,同时按下Shift 键可以绘制水平边或垂直边; ⑶单击鼠标右键闭合多边形; ⑷使用边缘填充算法填充多边形。

⎩⎨⎧+=+=++k y y x x i i i i 1113请按照图所示,使用对话框输入直线的起点和终点坐标。

在窗口左侧区域绘制输入直线和“窗口”,在窗口右边右侧区域绘制“视区”并输出裁剪结果。

这里需要用到窗视变换的公式。

请分别用Cohen-Sutherland算法、中点分割裁剪算法和梁友栋-Barsky算法实现。

4在屏幕上使用鼠标绘制控制多边形,根据控制多边形的阶次绘制Bezier曲线和B样条曲线。

5.1)使用VC编程实现,以直角三角形为基础绘制下图所示Sierpinski三角形。

2)以屏幕范围为基础绘制下图所示Sierpinski地毯。

6.1)给定直线的起点颜色(如红色)和终点颜色(如黑色)不同,请使用中点Bresenham算法绘制任意斜率的颜色渐变直线,效果如图所示。

2)用梁友栋-Barsky算法裁剪线段P1(3,3),P2(-2,-1),裁剪窗口为wxl=0,wxr=2,wyb=0,wyt=2。

计算机图形学课程设计 多边形的裁剪算法

计算机图形学课程设计 多边形的裁剪算法

河南理工大学万方科技学院课程设计报告2010 — 2011学年第二学期课程名称计算机图形学设计题目多边形裁剪算法学生姓名孙晓芳学号**********专业班级计算机科学与技术10升指导教师侯守明2011 年6 月29 日目录目录目录 (I)第1章程序运行环境................................................................................... 错误!未定义书签。

1.1 程序运行环境的简单介绍................................................................. 错误!未定义书签。

1.2 程序运行环境的安装......................................................................... 错误!未定义书签。

1.3 多边形裁剪算法设计的内容........................................................................... 第2章直线裁剪和多边形裁剪的简单比较 (4)2.1 直线裁剪的介绍 (4)2.1.1 直线裁剪的基本原理………………………………………......................................2.1.2 直线裁剪算法的分类以及和窗口交点参数值的计算……………………………..2.2 多边形裁剪介绍 (9)2.2.1 多边形裁剪的基本思想……………………………………………………………..2.2.2 多边形和窗口相交的判定方法…………………………………………..第3章多边形裁剪方法的详细介绍 (12)3.1 Sutherland-Hodgman算法………………………………………………………………….3.2 多边形裁剪算法的流程图 (12)3.3多边形裁剪算法的实现 (13)第4章代码的实现 (14)第5章总结 (21)参考文献 (22)第1章程序的运行环境1.1 程序运行环境的简单介绍本次设计主要是运用了程序设计语言主要以C/C++语言为主,开发平台为Visual C++。

图形学课程设计要求 《计算机图形学》

图形学课程设计要求 《计算机图形学》

《计算机图形学》课程设计一、 设计要求1. 根据设计任务,编制程序,在机器上调试运行,并通过上机考核。

2. 按照下面的“三、课程设计报告格式”的要求,写出课程设计报告。

3. 课程设计报告在第19周之前交来。

二、 设计任务1.1)给定直线的起点坐标为P0(x0,y0)、终点坐标为P1(x1,y1),容易计算出直线斜率k 。

假设0≤k ≤1,则x 方向为主位移方向,绘制直线的递推公式为:,这称为数值微分法(Digital Differential Analyzer ,DDA ),请编程实现之。

提示:DDA 算法实质上是对直线斜率进行了四舍五入计算。

2)椭圆的扫描转换。

2.用鼠标在屏幕上绘制任意顶点数的封闭多边形并填充,填充效果如下图所示。

编程要求:⑴多边形的顶点数不受限制;⑵按下鼠标左键,拖动鼠标绘制多边形,同时按下Shift 键可以绘制水平边或垂直边; ⑶单击鼠标右键闭合多边形; ⑷使用边缘填充算法填充多边形。

⎩⎨⎧+=+=++k y y x x i i i i 1113请按照图所示,使用对话框输入直线的起点和终点坐标。

在窗口左侧区域绘制输入直线和“窗口”,在窗口右边右侧区域绘制“视区”并输出裁剪结果。

这里需要用到窗视变换的公式。

请分别用Cohen-Sutherland算法、中点分割裁剪算法和梁友栋-Barsky算法实现。

4在屏幕上使用鼠标绘制控制多边形,根据控制多边形的阶次绘制Bezier曲线和B样条曲线。

5.1)使用VC编程实现,以直角三角形为基础绘制下图所示Sierpinski三角形。

2)以屏幕范围为基础绘制下图所示Sierpinski地毯。

6.1)给定直线的起点颜色(如红色)和终点颜色(如黑色)不同,请使用中点Bresenham算法绘制任意斜率的颜色渐变直线,效果如图所示。

2)用梁友栋-Barsky算法裁剪线段P1(3,3),P2(-2,-1),裁剪窗口为wxl=0,wxr=2,wyb=0,wyt=2。

计算机图形学 多边形填充

计算机图形学  多边形填充
x|ymin ymax 1/k next
y=12
边表结点
边表
P0P1 7 1 12 12 P1P2 -1 2/5 ^ 7 9 P 0P 6 5
2.桶表与 边表示例
示例多边形
y=11 y=10 y=9 y=8 y=7 y=6 y=5 y=4 y=3 y=2 y=1 3 7 P2P3 -1/3 P4P5 8 5 -1/2
4.3.2 填充过程
假定边的顺序为E0、E1、E2、E3、E4、E5和E6。这里, 边的顺序并不影响填充结果,只是方便编写循环结构而已。 填充过程如图所示。
P1(x1,y1) E1 E0 E6
P0(x0,y0)
E2 E3 E4
E5
边缘填充算法定义示例多边形
边缘填充算法原理
void CTestView::FillPolygon(CDC *pDC) { COLORREF BClr=RGB(255,255,255);//背景色 COLORREF FClr=GetClr;//填充色 int ymin,ymax;//边的最小y值与最大y值 double x,y,k;//x,y当前点,k斜率的倒数 for(int i=0;i<7;i++)//循环多边形所有边 { int j=(i+1)%7; k=(P[i].x-P[j].x)/(P[i].y-P[j].y);//计算1/k if(P[i].y<P[j].y)//得到每条边y的最大值与最小值 { ymin=Round(P[i].y); ymax=Round(P[j].y); x=P[i].x;//得到x|ymin } else { ymin=Round(P[j].y); ymax=Round(P[i].y); x=P[j].x; }

(计算机图形学)多边形区域扫描线填充或种子填充

(计算机图形学)多边形区域扫描线填充或种子填充

实验2:多边形区域扫描线填充或种子填充实验类型:验证、设计所需时间:3学时主要实验内容及要求:实现多边形区域扫描线填充的有序边表算法,并将实现的算法应用于任意多边形的填充,要求多边形的顶点由键盘输入或鼠标拾取,填充要准确,不能多填也不能少填。

要求掌握边形区域扫描线填充的有序边表算法的基本原理和算法设计,画出算法实现的程序流程图,使用C或者VC++实现算法,并演示。

参考试验步骤:1)分析多边形区域扫描线填充算法的原理,确定算法流程①初始化:构造边表,AET表置空②将第一个不空的ET表中的边插入AET表③由AET表取出交点进行配对(奇偶)获得填充区间,依次对这些填充区间着色④y=y i+1时,根据x=x i+1/k修改AET表所有结点中交点的x坐标。

同时如果相应的ET表不空,则将其中的结点插入AET表,形成新的AET表⑤AET表不空,则转(3),否则结束。

2)编程实现①首先确定多边形顶点和ET/AET表中结点的结构②编写链表相关操作(如链表结点插入、删除和排序等)③根据1)中的算法结合上述已有的链表操作函数实现多边形区域扫描线填充的主体功能④编写主函数,测试该算法源代码:#include<gl/glut.h>#include<iostream>using namespace std;typedef struct dePt{int x;int y;}dePt;void fill(GLint x1,GLint y1,GLint z1){glBegin(GL_POINTS);glVertex3f(x1,y1,0.0f);glEnd();}typedef struct Edge{int yUpper;float xIntersect, dxPerScan;struct Edge *next;}Edge;void insertEdge(Edge *list, Edge *edge){Edge *p,*q=list;p=q->next;while(p!=NULL){if(edge->xIntersect<p->xIntersect)p=NULL;else{q=p;p=p->next;}}edge->next=q->next;q->next=edge;}int yNext(int k, int cnt, dePt*pts){int j;if((k+1)>(cnt-1))j=0;elsej=k+1;while(pts[k].y==pts[j].y)if((j+1)>(cnt-1))j=0;else j++;return (pts[j].y);}void makeEdgeRec(dePt lower, dePt upper,int yComp,Edge *edge,Edge *edges[]) {edge->dxPerScan=(float)(upper.x-lower.x)/(upper.y-lower.y);edge->xIntersect=lower.x;if(upper.y<yComp)edge->yUpper=upper.y-1;elseedge->yUpper=upper.y;insertEdge(edges[lower.y],edge);}void buildEdgeList(int cnt,dePt *pts,Edge *edges[]){Edge *edge;dePt v1,v2;int i,yPrev=pts[cnt-2].y;v1.x=pts[cnt-1].x;v1.y=pts[cnt-1].y;for(i=0;i<cnt;i++){v2=pts[i];if(v1.y!=v2.y){edge=(Edge *)malloc(sizeof(Edge));if(v1.y<v2.y)makeEdgeRec(v1,v2,yNext(i,cnt,pts),edge,edges);elsemakeEdgeRec(v2,v1,yPrev,edge,edges);}yPrev=v1.y;v1=v2;}}void buildActiveList(int scan,Edge *active,Edge *edges[]) {Edge *p,*q;p=edges[scan]->next;while(p){q=p->next;insertEdge(active,p);p=q;}}void fillScan(int scan,Edge *active){Edge *p1,*p2;int i;p1=active->next;while(p1){p2=p1->next;for(i=p1->xIntersect;i<p2->xIntersect;i++)fill((int)i,scan,3);p1=p2->next;}}void deleteAfter(Edge *q){Edge *p=q->next;q->next=p->next;free(p);}void updateActiveList(int scan,Edge *active) {Edge *q=active, *p=active->next;while(p)if(scan>=p->yUpper){p=p->next;deleteAfter(q);}else{p->xIntersect=p->xIntersect+p->dxPerScan; q=p;p=p->next;}}void resortActiveList(Edge *active){Edge *q,*p=active->next;active->next=NULL;while(p){q=p->next;insertEdge(active,p);p=q;}}void scanFill(int cnt,dePt *pts){Edge *edges[1024],*active;int i,scan;for(i=0;i<1024;i++){edges[i]=(Edge *)malloc(sizeof(Edge)); edges[i]->next=NULL;}buildEdgeList(cnt,pts,edges);active=(Edge *)malloc(sizeof(Edge)); active->next=NULL;for(scan=0;scan<1024;scan++)buildActiveList(scan,active,edges);if(active->next){fillScan(scan,active);updateActiveList(scan,active);resortActiveList(active);}}}void ChangeSize(GLsizei w,GLsizei h){GLfloat nRange=400.0f;if(h==0) h=1;glViewport(0,0,w,h);glMatrixMode(GL_PROJECTION);glLoadIdentity();if(w<=h)glOrtho(-nRange,nRange,-nRange*h/w,nRange*h/w,-nRange,nRange);elseglOrtho(-nRange*h/w,nRange*h/w,-nRange,nRange,-nRange,nRange); glMatrixMode(GL_MODELVIEW);glLoadIdentity();}void Display(void){glClear(GL_COLOR_BUFFER_BIT);glLineWidth(5.0);int n,x,y,i;cout<<"请输入多边形顶点数:"<<endl;cin>>n;dePt *t=new dePt[n];for(i=0;i<n;i++){cout<<"请输入第"<<i+1<<"个顶点坐标"<<endl;cin>>x>>y;t[i].x=x;t[i].y=y;glVertex2i(t[i].x,t[i].y);} glEnd();glFlush();scanFill(n,t);glFlush();}void SetupRC()glClearColor(1.0f,1.0f,1.0f,1.0f); glColor3f(1.0f,0.0f,0.0f);}实验结果:。

计算机图形学课程设计-Weiler-Atherton多边形裁剪

计算机图形学课程设计-Weiler-Atherton多边形裁剪
{ V[numVertex].x = inX;
V[numVertex].y = inY;
idNo = numVertex;
numVertex++;
}
else
idNo = -1;
return idNo;
}
void readPolygon (GenPolygon p)
{ cin >> p.exterior.nVertex;
SEARCH (SubjectPolygon,nextInter,ptr1);
AddToOutputList (ptr1->. . .)
StartPoint = ptr1->. . .
ptr1 = prt1->next;
while (ptr1->. . . != StartPoint)
{ AddToOutputList (ptr1->. . .);
Weiler-Atherton算法适合与任意多边形。裁剪窗口和被裁剪多边形处于完全对等的地位,这里我们称:
1、被裁剪多边形为主多边形,记为A;
2、裁剪窗口为裁剪多边形,记为B。
主多边形A和裁剪多边形B的边界将整个二维平面分成了四个区域:
1、A∩B(交:属于A且属于B);
2、A-B(差:属于A不属于B);
3、B-A(差:属于B不属于A);
4、A∪B(并:属于A或属于B,取反;即:不属于A且不属于B)。
内裁剪即通常意义上的裁剪,取图元位于窗口之内的部分,结果为A∩B。
外裁剪取图元位于窗口之外的部分,结果为A-B。
观察右图不难发现裁剪结果区域的边界由被裁剪多边形的部分边界和裁剪窗口的部分边界两部分构成,并且在交点处边界发生交替,即由被裁剪多边形的边界转至裁剪窗口的边界,或者反之。由于多边形构成一个封闭的区域,所以,如果被裁剪多边形和裁剪窗口有交点,则交点成对出现。这些交点分成两类:
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告课程名称计算机图形学课题名称多边形裁剪与填充专业计算机科学与技术班级计算机0902学号姓名指导教师刘长松曹燚2012年10 月9 日湖南工程学院课程设计任务书课程名称计算机图形学课题多边形裁剪与填充专业班级计算机0902学生姓名学号指导老师刘长松曹燚审批任务书下达日期2012年9月15 日任务完成日期2012 年10月9 日一、设计内容与设计要求1.设计内容:交互式地实现多边形的裁剪和填充。

2.设计要求:1)窗口功能设计。

2)实现鼠标画多边形与数据存储功能。

3)实现鼠标剪裁窗口选择功能。

4)实现多边形裁剪和填充功能。

3.算法提示:多边形裁剪算法分析:基本思想是一次用窗口的一条边裁剪多边形,窗口的一条边以及延长线构成裁剪线,该线把平面分成两个部分:可见一侧,不可见一侧。

用一条裁剪边对多边形进行裁剪,得到一个顶点序列,作为下一条裁剪边处理过程的输入点。

对于每一条裁剪边,只是判断点在窗口的哪一测以及求线段与裁剪边的交点算法应随之改变。

多边形填充算法分析:确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y值(ymin 和ymax),从y=ymin 到 y=ymax, 每次用一条扫描进行填充。

对一条扫描线填充的过程可分为四个步骤: a.求交b.排序c.交点配对d.区间填色。

二、进度安排第 3 周星期一8:00——12:00星期二8:00——12:00星期三8:00——12:00星期四8:00——12:00星期五8:00——12:00第 4 周星期一8:00——12:00附:课程设计报告装订顺序:封面、任务书、目录、正文、附件(A4大小的图纸及程序清单)、评分。

正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。

正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。

正文总字数要求在5000字以上(不含程序原代码)。

一、题目内容说明:1、交互式地实现多边形的裁剪和填充。

2、功能要求:1)窗口功能设计。

2)实现鼠标画多边形与数据存储功能。

4)实现鼠标剪裁窗口选择功能。

5)实现多边形裁剪和填充功能。

二、总体设计:本程序使用MFC实现多边形的裁剪和填充绘图程序。

多边形裁剪算法分析:基本思想是一次用窗口的一条边裁剪多边形,窗口的一条边以及延长线构成裁剪线,改线把平面分成两个部分:可见一侧,不可见一侧。

用一条裁剪边多多边形进行裁剪,得到一个顶点序列,作为吓一条裁剪边处理过程的输入点。

对于每一条裁剪边,只是判断点在窗口的哪一测以及求线段与裁剪边的交点算法应随之改变。

仅用一条裁剪边时,逐次多边形裁剪框图:在CGraphics类的CutRectangular(CRect)函数中实现对多边形的裁剪多边形填充算法分析:确定多边形所占有的最大扫描线数,得到多边形顶点的最小和最大y值(ymin和ymax),从y=ymin 到 y=ymax, 每次用一条扫描进行填充。

对一条扫描线填充的过程可分为四个步骤: a.求交b.排序c.交点配对d.区间填色。

在CGraphics类中的FillPlogon函数中实现多边形的填充算法。

三、模块设计:各个程序函数的功能,参数,变量的说明:MFC应用程序框架中类的详细解析:1.MainFrm:创建窗口及窗口里的菜单、工具栏、状态栏等实现交互的按钮。

1)函数int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){}创建菜单、工具栏、状栏。

2)BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)设置窗口的大小和初始位置。

2.图像裁剪View:视图,负责内存数据与用户的交互,包括数据的显示、菜单的选取,鼠标的响应。

1.void CMyView::OnLButtonDown(UINT nFlags, CPoint point){}对鼠标按下左键的响应,如果是自定义裁剪的区域操作就捕获鼠标按下的点,画裁剪区域,如果是自定义点坐标的操作就捕获鼠标的点画多边形。

2.void CMyView::OnMouseMove(UINT nFlags, CPoint point){}对鼠标移动的响应。

用捕获的点画出相应的矩形裁剪边框。

画边框的时候,先用白色擦出原先的矩形边框,再用虚线画出新的举行边框3.void CMyView::OnRButtonUp(UINT nFlags, CPoint point){}对鼠标放开左键的相应。

如果是自定义点的坐标,就获取新的初始裁减矩形范围。

4.void CMyView::OnLButtonUp(UINT nFlags, CPoint point){}对鼠标放开左键的响应5.void CMyView::OnInitialUpdate(){}初始化裁剪区域和在窗口中画一个矩形和一个五角星。

6.void CMyView::OnDraw(CDC* pDC){}重画窗口,用voidCMyView::OnInitialUpdate{}来启动它,通过消息映射表处理菜单、工具条、快捷键和其他用户消息。

定义裁剪矩形区域,并赋值。

当自定义多边形坐标时,在各个点坐标处画一个小圆,以显示点的位置。

画出多边形。

3.图像裁剪DOC:文档,负责内存数据与磁盘的交互。

1、void CMyDoc::OnFillployon(){}2、void CMyDoc::OnUpdateFillployon(CCmdUI* pCmdUI){}3、void CMyDoc::OnCutRect(){}4、void CMyDoc::OnUpdateCutRect(CCmdUI* pCmdUI){}4.CGraphics:实现多边形的填充和裁剪。

1、构造函数CGraphics():PointCount(10),Point(NULL){}初始化五角星的顶点坐标。

2、析构函数~CGraphics(){}删除动态生成的Point指针。

3、bool DrawPloyon(CDC*);在指定设备中画多边形。

4、bool FillPloyon(CDC*);填充多边形。

5、bool InterCross(CPoint,CPoint,CPoint,CPoint,CPoint&);判断两条线段是否相交。

6、bool CutRect(CRect);对多边形进行裁剪。

7、bool IsInSquareRgn(CRect,CPoint,int);对多边形裁剪时,判断线段断点是否在可视一侧。

8、bool SortArray(int*,int);冒泡排序。

四、详细设计:1、创建窗口、菜单、工具栏、状栏的函数。

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){if (CFrameWnd::OnCreate(lpCreateStruct) == -1)return -1;if (!m_wndToolBar.CreateEx(this, TBSTYLE_FLAT, WS_CHILD | WS_VISIBLE | CBRS_TOP | CBRS_GRIPPER | CBRS_TOOLTIPS | CBRS_FLYBY | CBRS_SIZE_DYNAMIC) ||!m_wndToolBar.LoadToolBar(IDR_MAINFRAME)){TRACE0("Failed to create toolbar\n");return -1; // fail to create}if (!m_wndStatusBar.Create(this) ||!m_wndStatusBar.SetIndicators(indicators,sizeof(indicators)/sizeof(UINT))){TRACE0("Failed to create status bar\n");return -1; // fail to create}// TODO: Delete these three lines if you don't want the toolbar to// be dockablem_wndToolBar.EnableDocking(CBRS_ALIGN_ANY);EnableDocking(CBRS_ALIGN_ANY);DockControlBar(&m_wndToolBar);return 0;}2、鼠标按下左键的响应函数void CMyView::OnLButtonDown(UINT nFlags, CPoint point){//对鼠标按下左键的相应CScrollView::OnLButtonDown(nFlags, point);if(m_bDefineRect){//如果是自定义裁减的区域的操作SetCapture();//捕获鼠标m_bCaptured = TRUE;CDC *dc=GetDC();CRect rect(TopLeft,BottomRight);dc->SelectStockObject(WHITE_PEN);dc->Rectangle(rect);InvalidateRect(rect,false);TopLeft = point;::SetCursor(::LoadCursor(NULL, IDC_CROSS));//设置鼠标样子为十字形的}if(m_bDefinePointV){//如果是自定义点坐标的操作PointArray.Add(point);CRect ellipseRect;ellipseRect.top = point.y - 5;ellipseRect.bottom = point.y + 5;ellipseRect.left = point.x - 5;ellipseRect.right = point.x + 5;InvalidateRect(ellipseRect,true);}}3、鼠标移动时的响应函数void CMyView::OnMouseMove(UINT nFlags, CPoint point){CScrollView::OnMouseMove(nFlags, point);//对鼠标移动时的相应if (m_bCaptured){//画出相应的矩形裁减边框CDC *dc=GetDC();CRect rect(TopLeft,BottomRight);dc->SelectStockObject(WHITE_PEN);dc->Rectangle(rect);//用白色擦除原先的矩形边框InvalidateRect(rect,false);BottomRight=point;CRect newrect(TopLeft,BottomRight);CPen pen;pen.CreatePen(PS_DOT,1,RGB(0,0,0));dc->SelectObject(pen);dc->Rectangle(newrect);//用虚线画出新的矩形边框 }}void CMyView::OnLButtonUp(UINT nFlags, CPoint point) {CScrollView::OnLButtonUp(nFlags, point);//对鼠标放开左键的响应if (m_bCaptured){::ReleaseCapture();m_bCaptured = false;m_bDefineRect = false;}}void CMyView::OnViewDefineRect(){//设置是否自定义裁减区域m_bDefineRect = true;}void CMyView::OnEditDefinePoint(){//设置是否自定义点的坐标m_bDefinePointV = true;}4、放开鼠标右键的响应void CMyView::OnRButtonUp(UINT nFlags, CPoint point) {////对鼠标放开右键的相应CScrollView::OnRButtonUp(nFlags, point);if(m_bDefinePointV){CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);pDoc->m_grahics.PointCount=PointArray.GetSize();if(pDoc->m_grahics.Point)delete pDoc->m_grahics.Point;pDoc->m_grahics.Point = new CPoint[pDoc->m_grahics.PointCount];for(int i=0;i<pDoc->m_grahics.PointCount;i++)pDoc->m_grahics.Point[i]=PointArray.GetAt(i);//对Point点坐标重新赋值PointArray.RemoveAll();m_bDefinePointV=false;CRect rect;this->GetClientRect(rect);InvalidateRect(rect);//获取新的初始裁减矩形范围int minX = pDoc->m_grahics.Point[0].x , minY = pDoc->m_grahics.Point[0].y;int maxX = pDoc->m_grahics.Point[0].x , maxY = pDoc->m_grahics.Point[0].y;for(i=1;i<pDoc->m_grahics.PointCount;i++){if(minX > pDoc->m_grahics.Point[i].x)minX = pDoc->m_grahics.Point[i].x;if(minY > pDoc->m_grahics.Point[i].y)minY = pDoc->m_grahics.Point[i].y;if(maxX < pDoc->m_grahics.Point[i].x)maxX = pDoc->m_grahics.Point[i].x;if(maxY < pDoc->m_grahics.Point[i].y)maxY = pDoc->m_grahics.Point[i].y;}TopLeft = CPoint(minX,minY);BottomRight = CPoint(maxX,maxY);}}5、初始化函数void CMyView::OnInitialUpdate(){CScrollView::OnInitialUpdate();CSize sizeTotal;sizeTotal.cx = sizeTotal.cy = 100;SetScrollSizes(MM_TEXT, sizeTotal);CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);//设置初始的裁减区域int minX = pDoc->m_grahics.Point[0].x , minY = pDoc->m_grahics.Point[0].y;int maxX = pDoc->m_grahics.Point[0].x , maxY = pDoc->m_grahics.Point[0].y;for(int i=1;i<pDoc->m_grahics.PointCount;i++){if(minX > pDoc->m_grahics.Point[i].x)minX = pDoc->m_grahics.Point[i].x;if(minY > pDoc->m_grahics.Point[i].y)minY = pDoc->m_grahics.Point[i].y;if(maxX < pDoc->m_grahics.Point[i].x)maxX = pDoc->m_grahics.Point[i].x;if(maxY < pDoc->m_grahics.Point[i].y)maxY = pDoc->m_grahics.Point[i].y;}TopLeft = CPoint(minX,minY);BottomRight = CPoint(maxX,maxY);}6、重画窗口的函数,是MFC自动生成的,我们可以在里面添加自己的代码,用来实现消息映射表处理菜单、工具条、快捷键和其他用户消息。

相关文档
最新文档