计算机图形学实验指导书--实验2使用线段剪裁

合集下载

图形学实验报告直线段的裁剪算法

图形学实验报告直线段的裁剪算法

实验报告Experimentation Report of Taiyuan teachers College系部计算机系年级三年级课程图形学姓名同组者日期项目直线段的裁剪算法一、实验目的:1.熟悉图形裁剪的基本知识2.掌握Cohen-Sutherland 直线裁剪算法二、实验内容:在矩形窗口的裁剪算法中,考虑到构成图形的基本元素就是线段,曲线可看成是有很多小线段逼近而成的,因此,讨论线段的裁剪算法更为实用,即Cohen-Sutherland裁剪算法。

Cohen-Sutherland裁剪算法具体思路如下。

任意平面线段和矩形窗口的位置关系只会有如下3种:(1)完全落在窗口内。

(2)完全落在窗口外。

(3)部分落在窗口内,部分落在窗口外。

要想判断线段和窗口的位置关系,只要找到线段的两端点相对于矩形窗口的位置即可,线段的两端点相对于矩形窗口的位置可能会有如下几种情况:(1)线段的两个端点均在窗口内,这时线段全部落在窗口内,完全可见,应予以保留。

(2)线段的两个端点均在窗口边界线外同侧,这时线段全部落在窗口外,完全不可见,应予以舍弃。

(3)线段的一个端点在窗口内,另一个端点在窗口外,这时线段部分可见,应求出线段与窗口边界线的交点,从而得到线段在窗口内的可见部分。

(4)线段的两个端点均不在窗口内,但不处于窗口边界线外同侧,这时有可能线段是部分可见的,也可能是完全不可见的。

Cohen-Sutherland裁剪算法就是按照上述思路来对线段进行裁剪的,只是在线段的两端点相对于矩形窗口的位置上,巧妙地运用了编码的思想。

首先,延长窗口的四条边界线,将平面划分成9个区域,然后,用四位二进制数C3C2C1C0对这9个区域进行编码,编码规则如下:第0位C0:当线段的端点在窗口的左边界之左时,该位编码为1,否则,该位编码为0。

第1位C1:当线段的端点在窗口的右边界之右时,该位编码为1,否则,该位编码为0。

第2位C2:当线段的端点在窗口的下边界之下时,该位编码为1,否则,该位编码为0。

计算机图形学-图形变换与裁剪-二维线段裁剪

计算机图形学-图形变换与裁剪-二维线段裁剪
裁剪边内侧的原顶点; 多边形的边与裁剪边的交点。
❖ 顺序连接。 几点说明: 裁剪算法采用流水线方式,适合硬件实现。 可推广到任意凸多边形裁剪窗口
32
Sutherland-Hodgman算法-4/4
存在的问题
❖ 逐边裁剪要求裁剪窗口为凸多边形,那么凹多边形窗口怎么办?
❖ 逐边裁剪法对凹多边形裁剪时,裁剪后分裂为几个多边形, 这几个多边形沿边框产生多余的线段?
裁剪算法的线段可见性测试方法,直至找到每段线段与窗口边界线的 交点或分割子段的长度充分小可视为一点为止
❖ 取中点Pm=(P1+P2)/2。
P2
P2
P1
从P1点出发找距P1最近的可见点
Pm
P1
用P1Pm代替P1P2
P2 Pm
P1
用PmP2代替P1P2
18
1.直线段裁剪(13/18) 中点分割法
❖ 优点:
裁剪结果区域的边界由两部分构成:
1. SP的部分边界
2. CP的部分边界
且在交点处,边界发生交替
即由SP边界转至CP边界
或由CP边界转至SP边界
36
Weiler-Atherton算法-4/7
如果SP与CP有交点,则交点成对出现,
它们被分为如下两类:
❖进点:SP边界由此进入CP
如,I1,I3, I5, I7, I9, I11
当前裁剪边
当前裁剪边
当前裁剪边
当前裁剪边
可见一侧 Pi+1
可见一侧
可见一侧
可见一侧
Pi
Pi+1
Pi I
Pi
Pi+1
Pi+1
Pi
I
窗口
(a) 输出Pi+1

计算机图形学裁剪技术

计算机图形学裁剪技术


求交测试顺序固定(左右下上) 最坏情形,线段求交四次。
裁剪
直线段裁剪
Cohen-Sutherland算法 中点分割算法 参数化裁剪算法 Liang-Barskey算法
多边形裁剪
Sutlerland_Hodgman算法
Weiler-Athenton算法
字符裁剪
裁剪

裁剪:确定图形中哪些部分落在显示区之内, 哪些落在显示区之外 , 以便只显示落在显示区 内的那部分图形。这个选择过程称为裁剪。在 进行裁剪时,画面中对应于屏幕显示的那部分 区域称为窗口。
Cohen-Sutherland算法

将区域码的各位从右到左编号,则坐标区 域与各位的关系为:
任何位赋值为1,代表端点落在相应的位置上,否则该 位为0。若端点在剪取矩形内,区域码为0000。如果端 点落在矩形的左下角,则区域码为0101。
直线段裁剪

裁剪线段与窗口的关系:(1)线段完全可见;(2) 显然不可见;(3)其它 提高裁剪效率: 快速判断情形(1)(2), 对于情形(3),设法减 少求交次数和每次求 交时所需的计算量。
常用的线段裁剪方法三种:

Cohen-Sutherland算法 中点分割算法 参数化裁剪算法
Cohen-Sutherland裁剪

基本思想:
对于每条线段P1P2分为三种情况处理: (1)若P1P2完全在窗口内,则显示该线段P1P2。 (2)若P1P2明显在窗口外,则丢弃该线段。
(3)若线段不满足(1)或(2)的条件,则在交点处把线段
分为两段。其中一段完全在窗口外,可弃之。然后对另一段 重复上述处理。

如何实现上述的处理呢?
实现方法:采用下面的编码方法

《计算机图形学》实验指导书

《计算机图形学》实验指导书

计算机图形学实验指导书袁科计算机技术实验中心目录实验一实现DDA、中点画线算法和Bresenham画线算法 (24)实验二实现Bezier曲线 (25)实验三实现B样条曲线 (26)实验四实现多边形填充的边界标志算法 (27)实验五实现裁剪多边形的Cohen-Sutherland算法 (28)实验六二维图形的基本几何变换 (30)实验七画图软件的编制 (31)实验一实现DDA、中点画线算法和Bresenham画线算法【实验目的】1、掌握直线的多种生成算法;2、掌握二维图形显示原理。

【实验环境】VC++6.0/ BC【实验性质及学时】验证性实验,2学时,必做实验【实验内容】利用任意的一个实验环境,编制源程序,分别实现直线的三种生成算法,即数字微分法(DDA)、中点画线法以及Bresenham画线算法。

【实验原理】1、数字微分法(Digital Differential Analyzer,DDA)算法思想:基于直线的微分方程来生成直线。

ε=1/max(|△x|,|△y|)max(|△x|,|△y|)=|△x|,即|k|≤1 的情况:max(|△x|,|△y|)=|△y|,此时|k|≥1:2、中点画线法算法思想:每次在最大位移方向上走一步,另一方向是否走步取决于误差项的判断。

3、Bresenham画线算法算法思想:其基本思想同中点算法一样,即每次在最大位移方向上走一步,而另一个方向是否走步取决于误差项的判断。

【实验要求】1.上交源程序;2.上交实验报告,实验报告内容如下:(1) 实验名称(2) 实验目的(3) 算法实现的设计方法及程序流程图(4) 程序结果分析【分析与思考】(1) 上述所阐述的三个算法,其基本算法只能适用于直线的斜率(|K|<=1) 的情形,如何将上述算法进行推广,使其能够处理任意斜率的直线?(2) 计算机显示屏幕的坐标圆心在哪里,与我们平时的习惯有什么差异,如何协调二者?实验二 实现Bezier 曲线【实验目的】1、掌握Bezier 曲线的定义;2、能编程实现N 次Bezier 曲线的绘制与显示。

计算机图形学裁剪技术

计算机图形学裁剪技术

1、将直线的两端点P1、P2编码得:C1、C2; 2、判别 根据C1和C2的具体值,可以有三种情况: (1)C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内 ,应予保留。 (2)C1&C2≠0,即C1和C2至少有某一位同时为1,表明两端点必定 处于某一边界的同一外侧,因而整个线段全在窗外,应予舍弃。 (3)不属于上面两种情况,均需要求交点。 3、求交点 (1)令窗外端点为P1,如果窗外点不是P1,则P1和P2交换端点; (2)保留窗内端点P2到暂存器里; (3)对P1编码为C1; (4)用中点公式求出中点 ,并编码得C; (5)按照中点算法的求交规则: 若P1和P同侧,移动P1点;if((C1&C)!=0) P1=P; 否则,移动P2点。 else P2=P; (6)流程转(3),直到P1和P2相差一个给定误差时:令交点为P2 ,取出暂存器的端点赋给P1,然后转向流程1。

当Q为空集时,线段AB不可能在窗口中有可见线段。 当Q不为空集时,Q可看成是一个一维窗口
直线段裁剪
Liang-Barsky裁剪算法

ymax
P4
P3
B
U
S
P1
A T
ymin
P2
存在可见线段的充要条件
AB RS TU 不为空集
L x R min
xmax
AS是一维窗口TS中的可见部分
直线段裁剪
Liang-Barsky裁剪算法

AB有可见部分的充分必要条件也可表示为
max[ xmin , min( x A , x B ), min( xT , xU )] min[ xmax , max( x A , x B ), max( xT , xU )]

计算机图形学裁剪

计算机图形学裁剪

《计算机图形学》实验报告学院:理学院专业:信息与计算科学班级:structRectangle{floatxmin,xmax,ymin,ymax;};Rectanglerect;intx0,y0,x1,y1;intCompCode(intx,inty,Rectanglerect){intcode=0x00;if(y<rect.ymin)code=code|4;if(y>rect.ymax)code=code|8;if(x>rect.xmax)code=code|2;if(x<rect.xmin)code=code|1;returncode;}intcohensutherlandlineclip(Rectanglerect,int&x0,int&y0,int&x1,int&y1){ intaccept,done;floatx,y;accept=0;done=0;intcode0,code1,codeout;code0=CompCode(x0,y0,rect);code1=CompCode(x1,y1,rect);do{if(!(code0|code1)){accept=1;done=1;}elseif(code0&code1)done=1;else{if(code0!=0)codeout=code0;elsecodeout=code1;if(codeout&LEFT_EDGE){y=y0+(y1-y0)*(rect.xmin-x0)/(x1-x0);x=(float)rect.xmin;}elseif(codeout&RIGHT_EDGE){y=y0+(y1-y0)*(rect.xmax)/(x1-x0);x=(float)rect.xmax;}elseif(codeout&BOTTOM_EDGE){x=x0+(x1-x0)*(rect.ymin-y0)/(y1-yO);y=(float)rect.ymin;}elseif(codeout&TOP_EDGE){x=x0+(x1-x0)*(rect.ymax-y0)/(y1-y0);y=(float)rect.ymax;if(codeout==code0){x0=x;y0=y;code0=CompCode(x0,y0,rect);}else{x1=x;y1=y;code1=CompCode(x1,y1,rect);}}while(!done);if(accept)LineGL(x0,y0,x1,y1);returnaccept;}voidmyDisplay(){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);glRectf(rect.xmin,rect.ymin,rect.xmax,rect.ymax);LineGL(x0,y0,x1,y1);glFlush();voidInit(){glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_FLAT);rect.xmin=100;rect.xmax=300;rect.ymin=100;rect.ymax=300;x0=450,y0=0,x1=0,y1=450;printf("Presskey'c'toClip!\nPresskey'r'toRrstore!\n");}voidReshape(intw,inth){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadldentityO;gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);}voidkeyboard(unsignedcharkey,intx,inty){switch(key){case'c':cohensutherlandlineclip(rect,x0,y0,x1,y1);glutPostRedisplay();break;case'r':Init();glutPostRedisplay();break;case'x':exit(0);break;default:break;}}voidmain(intargc,char**argv){glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGBIGLUT_SINGLE);glutInitWindowPosition(100,100);glutInitWindowSize(640,480);glutCreateWindow("helloworld");Init();glutDisplayFunc(myDisplay);glutReshapeFunc(Reshape);glutMainLoop();}Mhellovorld实验结。

计算机图形学基础实验指导书

计算机图形学基础实验指导书目录实验一直线的生成 ............................................................... -..2.-实验二圆弧及椭圆弧的生成........................................................ -..3 -实验三多边形的区域填充 ......................................................... - (4)-实验四二维几何变换 ............................................................. -..5.-实验五裁剪算法 ................................................................. -..6.-实验六三维图形变换 ............................................................. -..7.-实验七BEZIER 曲线生成......................................................... -..8.-实验八交互式绘图技术实现........................................................ -..10-实验一直线的生成一、实验目的掌握几种直线生成算法的比较,特别是Bresenham 直线生成算法二、实验环境实验设备:计算机实验使用的语言: C 或Visual C++ 、OpenGL三、实验内容用不同的生成算法在屏幕上绘制出直线的图形,对不同的算法可设置不同的线形或颜色表示区别。

四、实验步骤直线Bresenham 生成算法思想如下1)画点(x i, y i), dx=x2-x i, dy=y2-y i,计算误差初值P i=2dy-dx , i=1;2)求直线下一点位置x i+i=x i+i 如果P i>0,贝U y i+i=y i+i,否则y i+i=y i;3)画点(x i+i ,y i+i );4)求下一个误差P i+i 点,如果P i>0,贝U P i+i=P i+2dy-2dx,否则P i+i=P i+2dy;i=i+i ,如果i<dx+i 则转步骤2,否则结束操作。

计算机图形学之裁剪算法


窗口特别小的场合。
2、中点裁剪法
中点分割裁剪法是将Cohen-Sutherland 算法中求线段与窗口边界的交点的过程用折 半查找(即求中点)的方法来代替。仍然采 用对线段端点进行编码的方式判断完全可见 和显然完全不可见的线段,对于与窗口有交 点的线段,该算法分别求离两个端点最近 (或最远)的可见点。这两个可见点之间的 线段即是原线段的可见部分。
计算P1P2的最近可见点Pma和 Pmb : (一)直线段P1P2的一个端点可见, P1 另一个端点不可见。 只需解算不可见端点的最近的 可见点。 1)设P1不可见,计算P1P2的中点Pm1。
P1
pm
P2
P2
判断中点Pm1如果落在(接近)窗口边上,则 确定该中点为最近可见点。裁剪结束。否则,
2)判断Pm1是否可见: 如果Pm1可见,以Pm1取代P2 ,返回到 1)计算 P1Pm1的中点Pm2,判断Pm2 如果Pm1不可见,以Pm1取代P1 ,返回到 1)计 算Pm1P2的中点Pm2,判断Pm2
关键: 根据多边形的边表,逐 次对每一段边与裁剪线 (窗口边直线)比较,判 别输入顶点的个数和坐 标,并联结成封闭多边 形。
不可见侧
2
多边形边与裁剪线相对位置的四种
情况与处理方法: (1) 位于可见一侧:输出终点作 为新多边形顶点 (2) 位于不可见一侧:不输出 (3) 由可见到不可见:输出与裁剪
P2
两种线段裁剪算法的比较
Cohen-Sutherland算法是最早的、使用最广泛的线
段裁剪算法之一。在裁剪窗口很大,大部分线段完全
可见,或裁剪窗口很小,大部分线段完全不可见的情 况下,该算法特别有效;在一般情况下,该算法有时 要做不必要的求交运算,因而效率不是太高.

计算机图形学基础实验指导书

《计算机图形学基础》实验指导书课程名称:计算机图形学基础英文名称:Computer Graphics课程性质:必修课程编号:适应专业:计算机科学与技术;软件工程学时学分:总学时48,实验学时102,总学分2编写人:王创存一、实验课程任务与要求1. 目的与任务:计算机图形学实验教学是为了将学生的计算机操作能力、分析能力、工程设计能力与应用实践结合起来,引导学生由浅入深地掌握计算机图形学理论与算法,掌握交互构图能力,具备工程应用的图形学基础。

本实验教学主要内容是要求学生用Visual Basic编程实现各种图形的绘制,强化学生的程序设计能力和程序调试能力,使学生巩固所学各种图形的生成算法的理论知识。

实践教学共包括十项内容。

2. 实验基本要求:(以软件设计为主要表现形式)上机前应准备好实验的程序设计算法描述与关键分析内容;准备好程序测试数据和设备操作步骤,上机调试、运行;完成每个实验后进行数据与程序对比分析,给出运行结果。

二、实验内容与学时安排实验一、图形输入/输出设备的操作使用及简单图形的输出(2学时)要求:(1)掌握图形设备的操作过程;测试图形设备的分辨率、性能;(2)图形软件包与外部设备的连接参数配置;(3)利用图形软件包绘制简单图形并在设备上输出;(4)设计菜单,实现人机交互方式控制图形设备进行简单操作实验二、编程环境及图形绘制基础练习(2学时)题目:绘制分形树基本要求:)数据输入项为:树干的起点坐标,树干长度,树枝倾斜角度,树枝层数,最短树枝;)结果直接输出在窗体中。

附加要求:(1)通过用户输入可改变线型(实线、虚线与点划线)。

(2)通过用户输入可改变线宽。

实验三、直线的绘制(2学时)题目:用逐点比较法或中点Bresenham法实现直线的绘制基本要求:)数据输入项为:直线的起点与终点坐标;)直线与圆输出在PictureBox控件中;)保存图形绘制结果,将该实验加入到菜单中去。

实验四、圆的绘制(2学时)题目:用逐点比较法或中点Bresenham法实现圆的绘制基本要求:)数据输入项为:圆心坐标与半径;)直线与圆输出在PictureBox控件中;)保存图形绘制结果,将该实验加入到菜单中去。

计算机图形学裁剪算法

一、实验目标1.了解Cohen-SutherLand线段裁剪算法、Liang-Barsky线段裁剪算法、SutherLand-Hodgeman多边形裁剪算法的基本思想;2.掌握Cohen-SutherLand线段裁剪算法、Liang-Barsky线段裁剪算法、SutherLand-Hodgeman多边形裁剪算法的算法实现;二、实验内容本次实验主要是实现Cohen-SutherLand线段裁剪算法、Liang-Barsky线段裁剪算法、SutherLand-Hodgeman多边形裁剪算法。

Cohen-sutherland线段裁剪算法思想:该算法也称为编码算法,首先对线段的两个端点按所在的区域进行分区编码,根据编码可以迅速地判明全部在窗口内的线段和全部在某边界外侧的线段。

只有不属于这两种情况的线段,才需要求出线段与窗口边界的交点,求出交点后,舍去窗外部分。

对剩余部分,把它作为新的线段看待,又从头开始考虑。

两遍循环之后,就能确定该线段是部分截留下来,还是全部舍弃。

Cohen-sutherland线段裁剪算法步骤:1、分区编码延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进制代码标识。

各区代码值如图中所示。

四位二进制代码的编码规则是:(1)第一位置1:区域在左边界外侧(2)第二位置1:区域在右边界外侧(3)第三位置1:区域在下边界外侧(4)第四位置1:区域在上边界外侧裁剪窗口内(包括边界上)的区域,四位二进制代码均为0。

设线段的两个端点为P1(x1,y1)和P2(x2,y2),根据上述规则,可以求出P1和P2所在区域的分区代码C1和C2。

2、判别根据C1和C2的具体值,可以有三种情况:(1)C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内,应予保留。

(2)C1&C2≠0(两端点代码按位作逻辑乘不为0),即C1和C2至少有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线段全在窗外,应予舍弃。

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

计算机图形学实验指导书--实验2使用线段剪裁实验2使用线段剪裁Cohen——sutherland算法一.实验目的及要求根据Cohen——sutherland算法,掌握直线剪裁的程序设计方法。

注意,不能使用语言库中的画圆函数。

二.理论基础将不需要裁剪的直线挑出,并删去其中在窗外的直线,然后对其余直线,逐条与窗框求交点,并将窗框外的部分删去。

采用Cohen-Sutherland 直线剪裁的算法一区域编码为基础,将窗口及周围的八个方向以4位的二进制数进行编码。

4个位分代表窗外上,下,左右的编码值。

三、算法分析1. Cohen—SutherLand直线裁剪算法裁剪的实质,就是决定图形中那些点、线段、文字、以及多边形在窗口之内。

Cohen—SutherLand直线裁剪算法的基本大意是:对于每条线段P1P2,分为三种情况处理。

1) 若P1P2完全在窗口内,则显示该线段P1P2,简称“取”之。

2) 若P1P2明显在窗口外,则丢弃该线段P1P2,简称“弃”之。

3) 若线段既不满足“取”的条件,也不满足“弃”的条件,则把线段分为两段。

其中一段完全在窗口外,可弃之。

然后对另一段重复上述处理。

为了使计算机能够快速地判断一条线段与窗口属何种关系,采用如下的编码方法。

延长窗口的边,把未经裁剪的图形区域分为9个区,每个区具有一个四位代码,即四位二进制数,从左到右各位依次表示上、下、左、右。

裁剪一条线段时,先求出端点P1P2所在的区号code1和code2。

若code1=0且code2=0,则说明P1和P2均在窗口内,那么整条线段也比在窗口内,应取之。

若code1和code2经按位与运算后的结果code1&code2不为0,则说明两个端点同在窗口的上方、下方、左方或右方。

若上述两种条件均不成立,则按第三种情况处理,求出线段与窗口某边的交点,在交点处把线段一分为二,其中必有一段完全在窗口外,可以弃之。

再对另一段重复进行上述处理。

计算线段与窗口边界(或其延长线)的交点,属于线段与直线求交问题。

在实现本算法时,不必把线段与每条窗口边界依次求交,只要按顺序检测到端点区码的某位不为0时,才把线段与对应的窗口边界进行求交。

四、提示代码#include<stdio.h>#include<graphics.h>void initgr(void) /* BGI初始化*/{int gd = DETECT, gm = 0; /* 和gd = VGA,gm = VGAHI是同样效果*/registerbgidriver(EGAVGA_driver);/* 注册BGI驱动后可以不需要.BGI文件的支持运行*/initgraph(&gd, &gm, "");}clip_a_line(x1,y1,x2,y2,xw_min,xw_max,yw_min,yw_max){int i,code1[4],code2[4],done,display;float m;int x11,x22,y11,y22,mark;done=0;display=0;while(done==0){x11=x1;x22=x2;y11=y1;y22=y2;encode(x1,y1,code1,xw_min,xw_max,yw_min,yw_max);encode(x2,y2,code2,xw_min,xw_max,yw_min,yw_max);if(accept(code1,code2)){done=1;display=1;break;}else if(reject(code1,code2)){done=1;break;}mark=swap_if_needed(code1,code2);if(mark==1){x1=x22;x2=x11;y1=y22;y2=y11;}if(x2==x1)m=-1;elsem=(float)(y2-y1)/(float)(x2-x1);if(code1[2]){x1+=(yw_min-y1)/m;y1=yw_min;}else if(code1[3]){x1-=(y1-yw_max)/m;y1=yw_max;}else if(code1[0]){y1-=(x1-xw_min)*m;x1=xw_min;}else if(code1[1]){y1+=(xw_max-x1)*m;x1=xw_max;}}if(display==1){line(x1,y1,x2,y2);printf("The result is:(x1,y1)=(%d,%d)\n",x1,y1);printf("The result is:(x2,y2)=(%d,%d)\n",x2,y2);}}int encode(int x,int y,int code[],int xw_min,int xw_max,int yw_min,int yw_max){int i;for(i=0;i<4;i++)code[i]=0;if(x<xw_min)code[0]=1;else if(x>xw_max)code[1]=1;if(y>yw_max)code[3]=1;else if(y<yw_min)code[2]=1;return(0);}int accept(int code1[],int code2[]){int i,flag;flag=1;for(i=0;i<4;i++){if((code1[i]==1) || (code2[i]==1)){flag=0;break;}}return(flag);}int reject(int code1[],int code2[]){int i,flag;flag=0;for(i=0;i<4;i++){if((code1[i]==1) && (code2[i]==1)){flag=1;break;}}return(flag);}int swap_if_needed(int code1[],int code2[]) {int i,flag1,flag2,tmp;flag1=1;for(i=0;i<4;i++)if(code1[i]==1){flag1=0;break;}flag2=1;for(i=0;i<4;i++)if(code2[i]==1){flag2=0;break;}if((flag1==0) && (flag2==0))return(0);if((flag1==1) && (flag2==0)){for(i=0;i<4;i++){tmp=code1[i];code1[i]=code2[i];code2[i]=tmp;}return(1);}return(0);}void main(){int x1,x2,y1,y2,xw_min,xw_max,yw_min,yw_max;initgr();printf("Please input the bottom boundary(xw_min,yw_min):\n"); scanf("%d,%d",&xw_min,&yw_min);printf("Please input the top boundary(xw_max,yw_max):\n");scanf("%d,%d",&xw_max,&yw_max);setcolor(GREEN);line(xw_min,yw_min,xw_max,yw_min);line(xw_min,yw_max,xw_max,yw_max);line(xw_min,yw_min,xw_min,yw_max);line(xw_max,yw_min,xw_max,yw_max);getch();printf("Please input the position of the first point(x1,y1):\n"); scanf("%d,%d",&x1,&y1);printf("Please input the position of the first point(x2,y2):\n"); scanf("%d,%d",&x2,&y2);setcolor(YELLOW);line(x1,y1,x2,y2);getch();cleardevice();setcolor(GREEN);line(xw_min,yw_min,xw_max,yw_min);line(xw_min,yw_max,xw_max,yw_max);line(xw_min,yw_min,xw_min,yw_max);line(xw_max,yw_min,xw_max,yw_max);setcolor(RED);clip_a_line(x1,y1,x2,y2,xw_min,xw_max,yw_min,yw_max); outtextxy(50,50,"Cohen-SutherLand!");getch();closegraph();}。

相关文档
最新文档