上机实验3:图形填充与裁剪算法的具体实现

合集下载

实验三 图形剪裁报告

实验三 图形剪裁报告

成绩:《土地管理信息系统》实习报告专业班级:地理信息系统0801姓名:任雷鹏学号:2008002940指导教师:马锐二〇一一年十一月实验三图形剪裁图形裁剪的具体操作步骤如下。

1.装入裁剪文件在文件选单下,选择“转入点(线面)文件”转入需要裁剪的点线面文件。

2.装入裁剪框在裁剪之前,必须先定义图形裁剪的范围,即装入裁剪框,装入裁剪框实际上包括下面两步。

(1)编辑裁剪框:在装入裁剪框之前一定要编辑好裁剪框,裁剪框必须是一条封闭的线。

裁剪框的编辑是在图形子编辑系统中进行的,并保存。

(2)装入裁剪框:在图形裁剪系统中,选择编辑裁剪框选单下的“装入裁剪框”,就可以装入图形编辑中已编辑好的编辑框线文件。

若没有编辑裁剪框而想直接在图形编辑中编辑裁剪框,则可用下列两种方式定义裁框。

(1)造点编辑裁剪框;在变辑裁剪框选单下选择“造点”;鼠标变为十字光标,对照已装入的被裁剪文件移动鼠标到适当位置,按一下鼠标左键,可造一个点。

按鼠标右键可结束造点。

如果输入点位置有误,可通过“改点”“删点”功能进行修改。

注意:当裁剪点数少于3点时,删点功能被禁止。

(2)键盘输入裁剪框:键盘裁剪框有两个作用,输入裁剪框坐标和修改裁剪框坐标。

在裁剪编辑选单下,选择“键盘输入裁剪框”,会弹出如下图所示的坐标输入对话框。

向该对话框中输入X坐标值和Y坐标值后,按回车键“ENTER”。

1.当系统已存在裁剪框并处于修改状态时,则系统会用刚输入的X和Y坐标值替换当前点的坐标值。

2.系统中不存在的裁剪框并处于“添加”状态时,则系统会将刚输入的一对X和Y坐标值添加单坐标值列表的最后一行。

再添加之前,系统会检查要填的点是否与列表中的最后一个坐标点重叠,若重叠则拒绝添加。

3.新建裁剪工程装入裁剪框后,就确定了裁剪范围。

那么裁剪的结果究竟是保留裁剪框内的图形还是保留裁剪框外的图形?裁剪的结果文件名及其路径又如何设置?这些就需要在裁剪工程中确定。

在裁剪工程选单下,选择“新建”,系统会弹出如下图所示的裁剪工程编辑框。

计算机图形学 实验三 二维图形的区域填充

计算机图形学 实验三 二维图形的区域填充

西北农林科技大学实习报告学院名称:理学院专业班级:姓名:学号:课程:计算机图形学实验报告日期:第十四周实验三二维图形的区域填充一、实验目的1)加深对填充算法的理解,分析比较种子填充和边缘填充的差异。

2)掌握二维图形区域种子填充的原理和算法。

二、实验步骤1)对任意多边形的几何形状进行分析,选定比较合适的算法模型。

2)画出程序流程图;3)编写程序的源程序;4)编辑源程序并进行调试;5)进行特殊模式的运行测试,并结合情况进行调整。

三、实验内容用种子填充算法编写程序实现区域填充,并能在计算机上编译运行,正确地实现任意多边形边界的单色填充。

原理边界填充算法可以让用户首先勾画图的轮廓,选择填充颜色和填充模式,然后拾取内部点,系统就可以自动给图的内部涂上所需要的颜色和图案。

该算法的输入是种子点坐标 ( x , y )、填充色和边界颜色。

算法从( x , y )开始检测相邻位置是否是边界颜色,若不是,就用填充色着色,并检测其相邻位置。

该过程延续到已经检测完区域边界颜色范围内的所有像素为止。

使用栈结构来实现4-连通边界填充算法的算法步骤如下:(1)种子像素入栈。

(2)执行如下三步操作:1 栈顶像素出栈。

2 将出栈像素置成填充色。

3 检查出栈像素的4-邻接点,若其中某个像素不是边界色且未置成多边形色,则把该像素入栈。

(3)检查栈是否为空,若栈非空重复执行步骤(2),若栈为空则结束。

边界填充算法可以用于填充带有内孔的平面区域。

其缺点是把太多的像素压入堆栈,有些像素甚至会入栈多次,这样一方面降低了算法的效率,另一方面还要求很大的存储空间以实现栈结构。

将之改进,可构造沿扫描线填充水平像素段的4-连通边界填充算法,其算法步骤如下:(1)种子像素入栈。

(2)执行如下三步操作:1 栈顶元素出栈。

2 填充出栈元素所在扫描行的连续像素段,从出栈的像素开始沿扫描线向左和向右填充,直到遇到边界像素为止,即每出栈一个像素,就对包含该像素的整个扫描线区间进行填充,并且记录下此时扫描线区间的x坐标范围[ x1, x2 ]。

实验二:图形填充算法实验报告

实验二:图形填充算法实验报告

《计算机图形学》实验报告(实验二:图形填充算法)一、实验目的及要求用两种方法做图形的填充算法!二、理论基础1.边填充算法对于每一条扫描线和每条多边形的交点(x1,y1),将该扫描线上的交点右方的所有像素取补。

2.种子填充算法利用栈来实现种子填充算法。

种子像素入栈,当栈非空时重复执行如下步骤:将栈顶像素出栈,将出栈像素置成多边形色,按左,上,右,下顺序检查与出栈像素相邻的四个像素,若其中某个像素不再边界且未置成多边形,则把该像素入栈!三、算法设计与分析1、边填充算法void CEdge_mark_fillView::OnDraw(CDC* pDC){CEdge_mark_fillDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);int d[500][500]={0};int inside;int x,y;Bresenham(80,101,100,400,d);Bresenham(100,300,290,400,d);Bresenham(292,400,382,50,d);Bresenham(380,50,202,150,d);Bresenham(200,150,82,101,d);for(y=0;y<500;y++){inside=0;for(x=0;x<500;x++){if(d[x][y]==1)if(d[x+1][y]!=1){inside=!(inside);}if(inside!=0)pDC->SetPixel(x,y,12);}}}2、种子填充int x=299,y=51;COLORREF oldcolor;COLORREF newcolor;oldcolor=RGB(256,256,256);newcolor=RGB(123,123,123);pDC->MoveTo (40,40);pDC->LineTo (80,40);pDC->LineTo (70,80);pDC->LineTo (40,40);FloodFill(51,51,RGB(255,255,255),RGB(0,0,255));pDC->LineTo (40,40);void CMyView::FloodFill(int x,int y,COLORREF oldcolor,COLORREF newcolor) {CDC* pDC;pDC=GetDC();if(pDC->GetPixel(x,y)==oldcolor){pDC->SetPixel(x,y,newcolor);FloodFill(x,y-1,oldcolor,newcolor);FloodFill(x,y+1,oldcolor,newcolor);FloodFill(x-1,y,oldcolor,newcolor);FloodFill(x+1,y,oldcolor,newcolor);}四、程序调试及结果的分析1、2、四、实验心得及建议由于很多不会,所以这次没能按时当堂完成,下来花了不少时间才弄出来,第二种尤其比较麻烦,在同学的帮助下才做出来了。

实验三指导书

实验三指导书

实验三区域填充与直线的裁剪1.实验目的:1)实现种子填充法或扫描线算法中的一种。

2)任选一种算法实现直线的裁剪。

2.实验内容:编写区域填充和直线裁剪的源程序,并能在计算机上编译运行,画出正确的图形。

3.实验步骤:1)对区域填充的几种算法进行理解;2)编程实现绘制多边形;3)对直线裁剪的几种算法进行理解;4)编程实现直线的裁剪;5)画出程序流程图;6)编写程序的源程序;7)编辑源程序并进行调试;8)进行特殊模式的运行测试,并结合情况进行调整。

9)打印源程序或把源程序以文件的形式提交。

4.实验报告:1)按格式书写实验报告;2)提交源程序文件或打印件。

算法描述区域填充1) 多边形由一系列首尾相连的直线段构成的图形称为多边形。

如果在多边形内任意选取不相同的两点,其连线上的所有点均在该多边形内,这样的多边形称为凸多边形;否则,称为凹多边形。

2) 种子填充算法种子填充算法又称为边界填充算法。

其基本思想是:从多边形区域的一个内点开始,由内向外用给定的颜色画点直到边界为止。

如果边界是以一种颜色指定的,则种子填充算法可逐个像素地处理直到遇到边界颜色为止。

种子填充算法常用四连通域和八连通域技术进行填充操作。

从区域内任意一点出发,通过上、下、左、右四个方向到达区域内的任意像素。

用这种方法填充的区域就称为四连通域;这种填充方法称为四向连通算法。

从区域内任意一点出发,通过上、下、左、右、左上、左下、右上和右下八个方向到达区域内的任意像素。

用这种方法填充的区域就称为八连通域;这种填充方法称为八向连通算法。

一般来说,八向连通算法可以填充四向连通区域,而四向连通算法有时不能填充八向连通区域。

例如,八向连通填充算法能够正确填充如图2.4a所示的区域的内部,而四向连通填充算法只能完成如图2.4b的部分填充。

四向连通填充算法a) 连通域及其内点b) 填充四连通域四向连通填充算法:a)种子像素压入栈中;b)如果栈为空,则转e);否则转c);c)弹出一个像素,并将该像素置成填充色;并判断该像素相邻的四连通像素是否为边界色或已经置成多边形的填充色,若不是,则将该像素压入栈;d)转b);e)结束。

4上机实验报告3:图形裁剪算法的具体实现

4上机实验报告3:图形裁剪算法的具体实现

计算机图形学课程实验报告信息与计算科学(三)上机实验3:裁剪算法班级:姓名:学号:上机实验(3)的题目和要求一、实验目的掌握图形裁剪算法的基本思想,并能上机编程实现相应的算法。

二、实验要求(Direction)1.每个学生单独完成。

2.开发语言规定为C语言。

3.请在自己的实验报告上写明姓名、学号、班级。

4.每次交的实验报告内容包括:试验目的和意义、题目、程序制作步骤、主程序(包括源代码注释)。

三、实验题目实验题1:上机编一程序实现直线的中点裁剪算法。

具体要求如下说明:1 该程序能实现窗口屏幕上任意一条直线的裁剪;2 直线段要求可以随机输入;运行结果图:裁剪之前裁剪之后#define LE 2#define RI 4#define BO 6#define TO 10#define XLEFT 150#define XRIGHT 350#define YBOTTOM 150#define YTOP 300#include "math.h"#include "stdio.h"#include "graphics.h"void main(){int x1,y1,x2,y2,xx,yy,xxx,yyy;int graphdriver=DETECT,graphmode;initgraph(&graphdriver,&graphmode," ");setcolor(6);line(XLEFT,YTOP,XRIGHT,YTOP);line(XLEFT,YBOTTOM,XRIGHT,YBOTTOM);line(XLEFT,YTOP,XLEFT,YBOTTOM);line(XRIGHT,YTOP,XRIGHT,YBOTTOM);x1=50;y1=200;x2=400;y2=300;setcolor(1);line(x1,y1,x2,y2);xx=0;yy=0;xxx=0;yyy=0;draw_ett(x1,y1,x2,y2,&xx,&yy);draw_ett(x2,y2,xx,yy,&xxx,&yyy);setcolor(4);line(xx,yy,xxx,yyy);getch();closegraph();}int encode (int x, int y, int *code){ int c=0;if (x<XLEFT) c=c|LE;else if (x>XRIGHT) c=c|RI;if (y<YBOTTOM) c=c|BO;else if (y>YTOP) c=c|TO;*code=c;return code;}draw_ett(int x1, int y1, int x2, int y2, int *x, int *y) { int code1,code2,code;int xx,yy;float d,d1,d2;encode(x1,y1,&code1);encode(x2,y2,&code2);if (code2==0) { xx=x2;yy=y2; *x=xx; * y=yy;return;}if ((code1&code2)!=0) return;L1: xx=(x1+x2)/2;yy=(y1+y2)/2;encode(xx, yy, &code);d1=(yy-y1)*(yy-y1);d2=(xx-x1)*(xx-x1);d=sqrt(d1+d2);if (d<=1) { *x=xx;*y=yy; return;}if ((code&code1)!=0){ x1=xx; y1=yy; }else { x2=xx; y2=yy;}goto L1;}实验题2:实现Sutherland-Hodgeman多边形裁剪算法。

使用CAD进行图形裁剪和填充的方法

使用CAD进行图形裁剪和填充的方法

使用CAD进行图形裁剪和填充的方法CAD(计算机辅助设计)软件在工程设计和绘图中起到了至关重要的作用。

其中,图形裁剪和填充功能更是设计师经常使用的技巧之一。

本文将介绍如何在CAD软件中使用图形裁剪和填充功能。

图形裁剪是指通过选择一个或多个裁剪对象,将其他图形限制在裁剪框之内,以达到裁剪效果的过程。

图形填充则是将某个区域填充为特定颜色或图案。

以下将分别介绍这两个功能的具体操作步骤。

首先,我们来看一下图形裁剪的操作步骤。

假设我们有一个包含多个图形的绘图文件,现在需要将其中一个图形进行裁剪。

1. 打开CAD软件,并打开需要进行裁剪的绘图文件。

2. 在CAD界面的工具栏中找到“剪切”图标,点击该图标。

3. 在弹出的菜单中,选择“裁剪工具”选项。

4. 在工具栏中找到“裁剪对象”,点击并选择需要裁剪的图形。

5. 在绘图界面上,将鼠标移动至图形的一个顶点,点击并拖动至另一个顶点,形成一个裁剪框。

只有位于裁剪框内的图形会被保留下来,其他部分将被裁剪掉。

6. 松开鼠标左键,完成裁剪。

裁剪后的图形将显示在绘图界面上。

接下来,我们来介绍图形填充的操作步骤。

同样假设我们有一个图形需要进行填充。

1. 打开CAD软件,并打开需要进行填充的绘图文件。

2. 在CAD界面的工具栏中找到“填充”图标,点击该图标。

3. 在弹出的菜单中,选择“图案填充工具”选项。

4. 在工具栏中找到“填充图案”,点击并选择需要使用的填充图案。

5. 在绘图界面上,将鼠标移动至需要填充的区域,点击左键开始填充。

填充后的效果会立即显示在绘图界面上。

6. 若要更改填充图案的颜色或其他属性,可以在工具栏中找到“填充属性”选项,并进行相应的设置。

通过上述步骤,我们可以轻松地在CAD软件中进行图形裁剪和填充操作。

这些功能不仅可以提高设计师的工作效率,还能使设计图更加直观和易读。

最后需要注意的是,不同的CAD软件可能具有略微不同的操作方式和工具栏项,但基本的原理和操作步骤是相似的。

实验三 图像镶嵌与裁剪

实验三 图像镶嵌与裁剪
遥感图像的镶嵌(将两幅遥感影像无缝拼接) 遥感图像的规则裁剪(范围大致按shp文件最小 外接矩形) 两种方法遥感图像的不规则裁剪(一是将shp文 件转成aoi,利用aoi裁剪;二是利用矢栅转换制 作掩膜文件的方法裁剪)
实验参考资料:
ERDAS遥感数字图像处理实验教程
课件
实验报告编写要求
大纲
一、实验目的
二、实验材料
三、实验内容及步骤
四、实验心得
1、谈谈实现遥感图像无缝镶嵌的操作技巧 2、比较两种不规则裁剪方法
实验三:图像镶嵌与裁剪
实验目的:
掌握遥感图像的镶嵌操作
掌握遥感图像规则裁剪和不规则裁剪方法
实验材料:
2幅相邻的遥感影像(121037.img、
122037.img),1个研究区范围的shp文件(
huainan.shp)
ERDAS IMAGINE9.2遥感图像处理软件
计算机Βιβλιοθήκη 实验内容:

实验三 遥感图像裁剪、镶嵌、融合

实验三 遥感图像裁剪、镶嵌、融合

实验四遥感图像的拼接、裁剪、融合一、实习目的与要求·掌握图像拼接的原理,以及两幅图像拼接的时候需要的条件,掌握拼接技术;·学习通过ERDAS进行遥感图像规则分幅裁剪,不规则分幅裁剪的实验过程,能够对一幅大的遥感图像按照要求裁剪图像;·掌握不同分辨率图像的特性,详细理解各种融合方法的原理,以及各种融合方法的优缺点,能够根据不同的应用目的合理选择融合方法,掌握融合的操作过程;二、实验原理·图像拼接(mosaic image)是具有地理参考的若干相邻的图像合并成一幅图像或一组图像,需要拼接的图像必须含有地图投影也就是说图像必须经过几何校正处理,虽然所有的输入图像可以具有不同的投影类型,不同的象元大小,但必须有相同的波段数。

在进行图像拼接时需要确定一幅参考影像,参考图像作为图像拼接的基准,决定输出图像的地图投影和象元大小和数据类型。

·在实际工作中,经常需要根据研究区域的工作范围对图像进行分幅裁剪,erdas中可以对图像进行规则分幅裁剪(rectangle subset)和不规则分幅裁剪(pdygon subset),根据实际的应用对图像选择不同的裁剪方式。

·分辨率融合是对不同分辨率的摇杆图像进行融合处理,使处理后的图像既具有较好的空间分辨率又具有多光谱特征,从而增加图像的可解译性。

图像分辨率融合的关键是融合前两幅图像的配准以及融合方法的选择只有将不同空间分辨率的图像进行精确的配准才能达到满意的融合效果,而融合的方法的选择主要是由被融合图像的特性以及融合的目的进行选择的,同时需要对融合的原理有正确的认识。

三、实验内容和实验过程本次试验主要包括遥感图像拼接、遥感图像分幅裁剪、遥感图像分辨率融合。

下面分别介绍:1.图像拼接实验步骤:(1)启动图象拼接工具,在ERDAS图标面板工具条中,点击Dataprep/Data preparation/Mosaicc lmages—打开Mosaic Tool 视窗。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机图形学课程实验 报 告实验题目 填充与裁剪算法的实现 班 级 计算091 姓 名 王姣 学 号 3090811002 指导教师 胡钢 日 期 2012-5-3西安理工大学理学院应用数学系二零零八年春季学期信息与计算科学专业基础课Computer GraphicsReport Of course experiment实验说明试验目的: 掌握图形填充与裁剪算法的基本思想,并能上机编程实现相应的算法。

试验地点: 教九楼401 数学系机房 实验要求(Direction): 1.每个学生单独完成;2.开发语言为TurboC 或C++,也可使用其它语言;3.请在自己的实验报告上写明姓名、学号、班级;4.每次交的实验报告内容包括:题目、试验目的和意义、程序制作步骤、主程序、运行结果图以及参考文件;5. 自己保留一份可执行程序,考试前统一检查和上交。

实验内容实验题一1.1实验题目上机编程序实现多边形区域填充算法。

要求:(1)多边形要求采用顶点表示,且顶点的个数和顶点坐标可以随机输入;(2)要求先画出多边形,画出多边形的同时要求标明各顶点坐标;(3)水平扫描线的顺序和填充颜色可以自由选择。

1.2实验目的和意义1.熟悉并掌握编程实现多边形的画法2.学会画出多边形的同时要求标明各顶点坐标的算法如何在程序中实现3.了解如何对多边形进行扫描变换4.了解如何对多边形进行扫描区域填充1.3程序制作步骤(包括算法的基本思想、流程图、设计步骤等)算法思想:多边形以n, x_array, y_array 形式给出,其中x_array ,y_array 中存着多边形的n 个顶点的x, y 坐标。

扫描线填色算法的基本思想是:用水平扫描线从上到下扫描由点线段构成的多段定义的多边形。

每根扫描线与多边形各边产生一系列交点,将这些交点按照x 坐标进行排序,将排序后的交点成对取出,作为两个端点,用所需填充的色彩画水平直线。

多边形被扫描完毕,则填充结束扫描线算法的实现思想:填充与裁剪算法的实现实验3(1)根据给出的顶点坐标数据,按y递增顺序建立ET表。

(2)根据AET指针,使之为空。

(3)使yi=ymin(ymin为顶点坐标中最小y值)。

(4)反复做下述各步,直至yi=ymax(顶点坐标中y的最大值)或ET或AET为空。

1. 将ET表加入到AET中,并保持AET链中的记录按x值增大排序;2. 对扫描线yi依次成对取出AET中xi值,并在每对xi之间填上所要求的颜色或图案;3. 从AET表中删去yi+1的边记录;4. 对保留下来的AET中的每个边记录, x域中的值用xi+1/m代替xi,并重新按x递增排序;5. 使yi+1,以便进入下一轮循环。

多边形的填充过程,对于一条扫描线,多边形的填充过程可以分为四个步骤:(1)求交:计算扫描线与多边形各边的交点;(2)排序:把所有交点按x值递增顺序排序;(3)配对:第一个与第二个,第三个与第四个等等;每对交点代表扫描线与多边形的一个相交区间;(4)填色:把相交区间内的象素置成多边形颜色,把相交区间外的象素置成背景色。

1.4主程序/*坐标系:屏幕左上角为原点,向下为纵坐标正方向*//*可修改多边形边数polydeflen和多边形按顺时针的顶点定义polydef来改变多边形*/ #include"graphics.h"/*加入c图形库*/#include"stdio.h"#include"math.h"/*数学库*/#include"conio.h"/*键盘控制*/#define MP 100/*多边形边数*/#include<stdlib.h>#define false 0void edge_mark(int arr[][2],int value,int polydeflen)/*多边形直线扫描变换*/{int by,x,y,ax,ay;/*by为上点纵坐标,x、y当前点横、纵坐标,ax、ay下点横、纵坐标*/int i,j;float k;/*k为直线斜率的倒数*/by=arr[polydeflen-1][1];for (i=0;i<polydeflen;i++){if (i == polydeflen-1){ax=arr[0][0];ay=arr[0][1];}else{ax=arr[i+1][0];ay=arr[i+1][1];}x=arr[i][0];y=arr[i][1];if((y-ay)!=0)k=(ax-x)/(float)(y-ay);/*向下为纵坐标正方向,所以为y-ay*/if((y-by)*(ay-y)>=0)putpixel(x,y,value);getch();//if(getch()==17) exit();/*读入键盘按键*/if(ay<y)for(j=y-1;j>ay;j--)putpixel(x+(int)((y-j)*k),j,value);else for(j=y+1;j<ay;j++)putpixel(x-(int)((j-y)*k),j,value);by=y;}}void edge_mark_fill(int ar[][2],int value,int polydeflen)/*填充函数*/{int i,x,y,inside;/*x像素点横坐标,y像素点纵坐标,inside为判断是否在图形内标志*/int min,max;/*min、max为最小、最大顶点纵坐标*/inside=false;min=ar[0][1];max=ar[0][1];edge_mark(ar,value,polydeflen);for (i=1;i<polydeflen;i++){if (ar[i][1]>max)max=ar[i][1];if (ar[i][1]<min)min=ar[i][1];}for (y=min;y<=max;y++){for(x=0;x<=640;x++){if (getpixel(x,y) == value)inside=!(inside);if (inside!=false)putpixel(x,y,value);else putpixel(x,y,0);}//getch();if(getch()==17)exit(1);/*读入键盘按键*/}}void main(){char t[100];int i,j,polydeflen,value;int polydef[MP][2];printf("请输入边的条数:\n");scanf("%d",&polydeflen);printf("请输入填充颜色:\n");scanf("%d",&value);printf("输入坐标:\n");for (i=0;i<polydeflen;i++)for (j=0;j<2;j++)scanf("%d",&polydef[i][j]);int driver,mode;driver=DETECT;/*初始化显示模式参数*/initgraph(&driver,&mode,"D:\\TC");edge_mark_fill(polydef,value,polydeflen);for(i=0;i<polydeflen;i++){sprintf(t,"(%d,%d)",polydef[i][0],polydef[i][1]);outtextxy(polydef[i][0],polydef[i][1],t);}getch();closegraph();}1.5运行结果图实验题二2.1实验题目上机编程实现直线的编码裁剪(Cohen-Sutherland)算法。

要求:(1)该程序能实现窗口屏幕上任意一条直线的裁剪;(2)直线段要求可以随机输入;(3)程序在裁剪后不作窗口—视图变换;(4)裁剪过程为先画直线再裁剪,且运行结果列出以下3种情况:直线段与窗口有两个交点、直线段与窗口只有一个交点、直线段与窗口无交点。

2.2实验目的和意义1.了解裁剪的意义以及对人们日常生活的重大影响2.熟悉并掌握裁剪技术以及如何对线段或多边形作求交运算3.熟悉并掌握如何通过编程把窗口内每个图形元素都划分为可见部分和不可见部分从而实现裁剪4. 熟悉并掌握直线段的裁剪算法5.了解编码裁剪算法中直线段与窗口的各种关系以及相应的裁剪算法2.3程序制作步骤(包括算法的基本思想、流程图、设计步骤等)算法思想:这种算法利用编码的方法,延长窗口边线,使得它们把包含未经裁剪图形的窗口平面区域分成九个区域,如下图所示:顶边线底边线左边线右边线每个区域用一个4位编码CtCbCrCl来表示,代码中每一位分别是0或1,是按照窗口边线来确定的,下面给出具体的编码规则,其中最右边的位Cl是第一位,依次Cr第二、Cb第三、Ct第四位。

则:第一位Cl置为1—该端点位于窗口左侧;第二位Cr置为1—该端点位于窗口右侧;第三位Cb置为1—该端点位于窗口下侧;第四位Ct 置为1—该端点位于窗口上侧;否则,相应位置置为0Cohen-Sutherland 直线裁减算法的步骤如下:(1)当两端点P1(x1,y1)和P2(x2,y2)在区域0000中,即满足点的裁剪不等式:ytyb xrxl W y y W W x x W ≤≤≤≤)2,1()2,1( 则两端点代码C1=C2=0表示均在窗口内,应全部保留。

(2)当两个端点在窗口边线外的同侧位置,则他们的四位代码中,有一相同位,同时位“1”,显然两个端点代码C1和C2按位与运算 C1&C2≠0 .由此可检查判断直线在窗口外,应全部舍弃。

(3)如果直线两端点不满足上述两种情况,不能简单地全部保留或全部舍弃直线时,则需要计算出直线与窗口边线的交点,将直线分段后继续进行检查判断。

这样可以逐段地舍弃位于窗口外地线段,保留剩余在窗口内的线段。

算法流程图:2.4主程序对线段两端点编码变化得到code1和code2code1=code2=0?code=code1Y NNY 开 始初始化图形显示模式调用Cohen-Sutherland 函关闭图形显示模式退 出主程序返回主程序code1&code2≠0?首点是否可见?code=code2利用code 进行交点位置判断求得与左边交点坐标求得与右边交点坐标 求得与下边交点坐标 求得与上边交点坐标连接所得端点即为所求线段NY利用交点坐标替换考察端点#include "graphics.h"#include "conio.h"#include "math.h"#include "stdio.h"int w1=90, w2=270, w3=40, w4=160;void clipline(char *a,int &x,int &y,int x1,int y1,int x2,int y2) //求出与区域中各个方向边的交点{int xt1=0,yt1=0,xt2=0,yt2=0,xt3=0,yt3=0,xt4=0,yt4=0;if(*a=='1'){yt1=y1+(y2-y1)*(w1-x1)/(x2-x1);xt1=w1;} //求左交点if(*(a+1)=='1'){yt2=y1+(y2-y1)*(w2-x1)/(x2-x1);xt2=w2;} //求右交点if(*(a+2)=='1'){xt3=x1+(x2-x1)*(w3-y1)/(y2-y1);yt3=w3;} //求下交点if(*(a+3)=='1'){xt4=x1+(x2-x1)*(w4-y1)/(y2-y1);yt4=w4;} //求上交点//有可能会求出两个交点,例如左交点和上交点,必然有一个是超出窗口范围的//必须将其排除if(xt1<=270 && xt1>=90 && yt1<=160 && yt1>=40) { x=xt1; y=yt1;}if(xt2<=270 && xt2>=90 && yt2<=160 && yt2>=40) { x=xt2; y=yt2;}if(xt3<=270 && xt3>=90 && yt3<=160 && yt3>=40) { x=xt3; y=yt3;}if(xt4<=270 && xt4>=90 && yt4<=160 && yt4>=40) { x=xt4; y=yt4;}}void code(int xi, int yi, char *a) //四位编码的实现{if(xi<w1) *a='1'; //左if(xi>w2) *(a+1)='1'; //右if(yi<w3) *(a+2)='1'; //下if(yi>w4) *(a+3)='1'; //上return;}void clipdraw(int x1, int y1, char *a, int x2, int y2, char *b){int x11,y11,x21,y21;int s1=0,s2=0;code(x1,y1,a); //得到直线第一个端点的编码code(x2,y2,b); //得到直线第二个端点的编码if(*a=='0' && *b=='0' && *(a+1)=='0' && *(b+1)=='0' && *(a+2)=='0' &&*(b+2)=='0' && *(a+3)=='0' && *(b+3)=='0')line(x1,y1,x2,y2); //若两个端点的编码全为0,则直线完全可见elseif((a[0]-48)*(b[0]-48)+(a[1]-48)*(b[1]-48)+(a[2]-48)*(b[2]-48)+(a[3]-48)*(b[3]-48)==0) { //两端点四位编码的逻辑乘为0if(!(a[0]=='0'&&a[1]=='0'&&a[2]=='0'&&a[3]=='0')) //第一个端点不在窗口内,求与窗口交点{clipline(a,x11,y11,x1,y1,x2,y2);s1=1;}if(!(b[0]=='0'&&b[1]=='0'&&b[2]=='0'&&b[3]=='0')) //第二个端点不在窗口内,求与窗口交点{clipline(b,x21,y21,x1,y1,x2,y2);s2=1;}if(s1==1&&s2==1) line(x11,y11,x21,y21); //说明两个端点均不在窗口内,直线与窗口有两个交点if(s1==1&&s2==0) line(x11,y11,x2,y2); //说明第一个端点不在窗口内,第二个在,直线与窗口有一个交点if(s1==0&&s2==1) line(x1,y1,x21,y21); //说明第二个端点不在窗口内,第一个在,直线与窗口有一个交点}}void main(){int x1,y1,x2,y2;printf("请输入直线的两端点坐标:");scanf("%d%d%d%d",&x1,&y1,&x2,&y2);//读入直线两个端点的坐标char a[4]={'0','0','0','0'};char b[4]={'0','0','0','0'}; //分别初始化两个端点的编码数组int driver=VGA, mode=VGAHI;initgraph(&driver,&mode,"");//图形初始化setcolor(1);rectangle(w1,w3,w2,w4); //画出窗口setcolor(14);line(x1,y1,x2,y2); //画出裁剪之前的直线getch();cleardevice(); //清除屏幕getch();setcolor(5);rectangle(w1,w3,w2,w4); //再次画出窗口setcolor(12);clipdraw(x1,y1,a,x2,y2,b); //画出保留在窗口内的直线getch();closegraph(); //关闭图形系统}2.5运行结果图实验题三3.1实验题目上机编程实现直线的中点分割裁剪算法。

相关文档
最新文档