Cohen-Sutherland直线裁剪算法

合集下载

描述cohen sutherland裁剪算法

描述cohen sutherland裁剪算法

描述cohen sutherland裁剪算法
Cohen-Sutherland裁剪算法是一种用于裁剪线段的算法,由S.G.Cohen和D.P.Sutherland在1969年提出。

它的基本思想是使用一个2D窗口矩形对要裁剪的线段进行测试,根据结果将线段分成四个不同的类别(左端点的左边,右端点的右边,上端点的上边,下端点的下边),这样就可以把线段按照它们在窗口中的相对位置编码。

下面具体讲解Cohen-Sutherland裁剪算法的步骤:
1.首先,确定要裁剪的线段端点的坐标,以及窗口的左上角和右下角的坐标。

2.然后,根据左上角的坐标和右下角的坐标,利用一个4位的二进制整数对线段端点进行编码,每一位的0或1表示端点是否在窗口的4个边界外面。

3.对比端点的编码,如果两个编码都为0,表示线段完全位于窗口内,不需进行裁剪。

如果两个编码不同,则表示至少有一个端点位于窗口边界外,此时需要进行裁剪。

4.根据不同的编码情况,对线段进行裁剪:
(1)如果两个编码都不为0,则表明线段两个端点都在窗口边界外,此时线段不可见,可以将线段丢弃。

(2)如果两个编码中只有一个不为0,则表明线段上有一个端点在窗口边界外,此时只需要将外部端点移动到窗口边界上,即可得到一个可见的线段。

5.此外,还需要对线段两个端点进行重新编码,根据编码重复步
骤3和步骤4,直至线段完全位于窗口内,或者线段完全被丢弃。

至此,Cohen-Sutherland裁剪算法就完成了。

它既可以用于直线的裁剪,也可以用于曲线的裁剪。

Cohen-Sutherland直线剪裁算法

Cohen-Sutherland直线剪裁算法
(2)encode(int,int,int,int):该方法主要获得直线端点的编码
(3)onside(int[]):该方法判断直线两端点是否在区域内
(4)outside(int[]):该方法判断直线是否在同一端
(5)cutYourLine(int,int,int,int):该方法用于获取直线与区域的两个交点坐标
实验总结以及心得体会:
评定成绩:批阅老师:2017年月日
附页:
(1)paintComoponet(Graphics):void ,该方法主要用于画图,通过调用encode(int,int,int,int)方法、onside(int[])方法、outside(int[])方法和cutYourLIne(int,int,int,int)方法判断直线的类型和获取在区域内的两个直线端点坐标,画出区域内的直线
实验报告
专业:软件工程班级:学号:姓名:
课程名称:图形图像处理2017– 2017年度第2学期
课程类别:专业选修实验时间:2017年月日
实验名称:Cohen-Suths7 , Windows XP等都可,
使用Eclipse做实验。
实验目的和要求:
编写线段裁剪算法程序,验证算法的正确性
实验内容:
对于每条线段P1P2分为三种情况处理。
(1)若P1P2完全在窗口内,则显示该线段P1P2简称“取”之。
(2)若P1P2明显在窗口外,则丢弃该线段,简称“弃”之。
(3)若线段既不满足“取”的条件,也不满足“弃”的条件,则在交点处把线段分为两段。其中一段完全在窗口外,可弃之。然后对另一段重复上述处理。
实验截图如下:

cohen-sutherland裁剪算法例题

cohen-sutherland裁剪算法例题

cohen-sutherland裁剪算法例题一、算法简介Cohen-Sutherland裁剪算法是一种用于图像处理的算法,用于确定一个像素点是否被剪裁,即是否需要被剔除。

该算法基于一个简单的原理:对于一个像素点,如果它的坐标位于某个特定区域(例如矩形区域)之外,那么它就不属于原始图像的裁剪区域,可以被剔除。

二、算法步骤1.初始化:设定一个裁剪区域的起始坐标(xmin,ymin)和结束坐标(xmax,ymax)。

2.将裁剪区域的坐标转化为四舍五入的整数坐标(xm,ym,xm+1,ym+1)。

3.判断像素点(x,y)是否在裁剪区域内:a.如果(x>=xminandx<=xmaxandy>=yminandy<=ym),则像素点在裁剪区域内。

b.否则,像素点不在裁剪区域内。

4.根据像素点的位置,确定是否需要剔除该像素点:a.如果像素点在裁剪区域内,则保留该像素点。

b.如果像素点不在裁剪区域内,则剔除该像素点。

三、算法应用Cohen-Sutherland裁剪算法在图像处理中非常有用,它可以有效地剔除不需要的像素点,提高图像的质量和清晰度。

例如,在图像缩放、剪裁、滤镜处理等操作中,都需要用到Cohen-Sutherland裁剪算法。

四、例题实现以下是一个使用Python实现的Cohen-Sutherland裁剪算法的例子:```pythondefcohen_sutherland(image,xmin,ymin,xmax,ymax):#将坐标转化为四舍五入的整数坐标xm,ym=int(xmin),int(ymin)xm_next,ym_next=int(xmax),int(ymax)+1#加上1是为了避免下溢image_clipped=[list(i)foriinimage]#创建一个新的列表用于存放裁剪后的图像数据foriinrange(len(image)):forjinrange(len(image[i])):if(j>=ymori>=xmorj<ym_next-ymori<xm_next-xm):#如果像素点不在裁剪区域内image_clipped[i][j]=""#剔除该像素点,用空格代替else:#在裁剪区域内,保留该像素点image_clipped[i][j]=image[i][j]#不作任何修改returnimage_clipped```五、示例应用以下是一个使用Cohen-Sutherland裁剪算法进行图像剪裁的示例:假设有一张名为"input.jpg"的图像,要将其中的一部分剪裁掉。

[计算机图形学]复习Cohen-Sutherland直线段裁剪算法

[计算机图形学]复习Cohen-Sutherland直线段裁剪算法

[计算机图形学]复习Cohen-Sutherland直线段裁剪算法
关于Cohen-Sutherland 直线段裁剪算法思想概述
直线段裁剪是⼆维图形裁剪的基础,本质是判断直线段是否与窗⼝边界相交,如相交则进⼀步确定直线段上位于窗⼝内的部分。

算法思想:直线的端点赋予⼀组4位⼆进制码,称为RC(区域编码),裁剪窗⼝的四条边所在的直线可以把平⾯分为9个区域,对各个区域的编码也是四位,C3C2C1C0,分别代表上下右左四个窗⼝边界。

裁剪窗⼝所在的区域为0000,对于直线段上的端点进⾏编码,等于该端点所在的区域的编码。

编码后就容易判断两个端点的情况:
⽐如两个端点求与不等于0,即RC0&RC1≠0;说明该线段在裁剪窗⼝之外,应简弃;
两个端点RC编码按位或为0,即RC0|RC1=0。

说明直线段两个端点都在窗⼝内,应简取。

还有第三种情况:不满⾜前两种情况的,说明直线段与边界或其延长线有交点,要进⾏求交判断:
①此时直线段与边界相交,P0P1和两个边界相交,按左右下上的顺序计算交点,设交点为P,注意:总是要让直线段的⼀个顶点处于窗⼝之外,例如P0点。

这样P0点到交点P的直线段必然不可见,故可以将交点外的线段简弃。

②直线段与边界的延长线相交,直线段在窗⼝外,也不在窗⼝同⼀侧。

依旧按照左右下上顺序计算,将延长线与线段交点定为P,有PP0,位于窗⼝某侧,被简弃。

如果求裁剪后窗⼝内直线段的端点坐标,(那⼀般是求P1,以实际题⽬为准,看剪了哪部分),两点求直线⽅程,然后带⼊相交边界的x或y值可得。

Cohen-Sutherland裁剪算法

Cohen-Sutherland裁剪算法

Cohen-Sutherland裁剪算法#include <iostream>#include <windows.h>#include <gl/glut.h>using namespace std;#include <GL/glut.h>#include <cstdio>#define LEFT 1#define RIGHT 2#define BOTTOM 4#define TOP 8int x1=150,y1=50, x2=50, y2=250, XL=100, XR=300, YB=100, YT=200; //(x1,y1)、(x2,y2)为直线段的端点,XL为左边界,XR为右边界,YB为下边界,YT为上边界int x1_init = 150, y1_init = 50, x2_init = 50, y2_init = 250; //将直线段端点备份,以便画出裁剪前的直线段int encode(int x,int y){int c = 0;if (x < XL) c |= LEFT;if (x > XR) c |= RIGHT;if (y < YB) c |= BOTTOM;if (y > YT) c |= TOP;return c;}void CS_LineClip() //Cohen-Sutherland裁剪算法{int x, y;int code1, code2, code;code1 = encode(x1, y1);code2 = encode(x2, y2);while (code1 != 0 || code2 != 0){if (code1 & code2)return;if (code1 != 0)code = code1;elsecode = code2;if (LEFT & code){x = XL;y = y1 + (y2 - y1)*(XL - x1) / (x2 - x1);}else if (RIGHT & code){x = XR;y = y1 + (y2 - y1)*(XR - x1) / (x2 - x1);}else if (BOTTOM & code){y = YB;x = x1 + (x2 - x1)*(YB - y1) / (y2 - y1);}else if (TOP & code){y = YT;x = x1 + (x2 - x1)*(YT - y1) / (y2 - y1);}if (code == code1){x1 = x; y1 = y; code1 = encode(x1, y1);}else{x2 = x; y2 = y; code2 = encode(x2, y2);}}}void init() //初始化函数{glClearColor(1.0, 1.0, 1.0, 0.0); //设置背景颜⾊glMatrixMode(GL_PROJECTION); // 设置投影参数 gluOrtho2D(0.0, 600.0, 0.0, 400.0); // 设置场景的⼤⼩ CS_LineClip(); //执⾏⼀次裁剪算法}void mydisplay() //显⽰函数{//绘制⽅形边界glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0, 0.0, 0.0);glPointSize(2);glBegin(GL_LINE_LOOP);glVertex2i(XL, YT);glVertex2i(XL, YB);glVertex2i(XR, YB);glVertex2i(XR, YT);glEnd();glFlush();//绘制未裁剪前的线段glBegin(GL_LINES);glVertex2i(x1_init, y1_init);glVertex2i(x2_init, y2_init);glEnd();glFlush();//绘制裁剪后的线段glColor3f(0.0, 0.0, 0.0);glBegin(GL_LINES);glVertex2i(x1, y1);glVertex2i(x2, y2);glEnd();glFlush();}int main(int argc, char *argv[]){glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE); glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow("Cohen-Sutherland裁剪算法");init();glutDisplayFunc(&mydisplay);glutMainLoop();return 0;}。

计算机图形学实验Cohen-Sutherland算法

计算机图形学实验Cohen-Sutherland算法

实验5-6一、实验题目请按照图5-32所示,使用对话框输入直线段的起点和终点坐标。

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

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

请使用Cohen-Sutherland 算法编程实现。

二、实验思想Cohen-Sutherland 直线裁剪算法是最早流行的编码算法。

每条直线的端点都被赋予一组四位二进制代码,称为区域编码(Region Code ,RC),用来标识直线端点相对于窗口边界及其延长线的位置。

假设窗口是标准矩形,由上(y=w yt )、下(y=w yb )、左(x=w xl )、右(x=w xr )四条边组成,如图5-23所示。

延长窗口四条边形成9个区域,如图5-24所示。

这样根据直线的任一端点P(x,y)所处的窗口区域位置,可以赋予一组4位二进制区域码RC =C 4C 3C 2C 1。

w yb w yt wxr w xl为了保证窗口内直线端点的编码为零,编码规则定义如下:第一位:若端点位于窗口之左侧,即x<w xl,则C1=1,否则C1=0。

第二位:若端点位于窗口之右侧,即x>w xr,则C2=1,否则C2=0。

第三位:若端点位于窗口之下侧,即y<w yb,则C3=1,否则C3=0。

第四位:若端点位于窗口之上侧,即y>w yt,则C4=1,否则C4=0。

裁剪步骤如下:(1)若直线的两个端点的区域编码都为零,即RC1|RC2=0,说明直线两端点都在窗口内,应“简取”之。

(2)若直线的两个端点的区域编码都不为零,即RC1&RC2≠0,即直线位于窗外的同一侧,说明直线的两个端点都在窗口外,应“简弃”之。

(3)若直线既不满足“简取”也不满足“简弃”的条件,直线必然与窗口或窗口边界的延长线相交,需要计算直线与窗口边界的交点。

交点将直线分为两段,其中一段完全位于窗口外,可“简弃”之。

对另一段重复进行上述处理,直至该直线段完全被舍弃或找到完全位于窗口内的直线段为止。

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

计算机图形学实验指导书--实验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,则说明两个端点同在窗口的上方、下方、左方或右方。

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

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

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

裁剪算法——cohen-sutherland算法

裁剪算法——cohen-sutherland算法

裁剪算法——cohen-sutherland算法实验环境:VC6.0算法思想: 延长窗⼝的边,将⼆维平⾯分成9个区域,每个区域赋予4位编码C t C b C r C l,裁剪⼀条线段P1P2时,先求出所在的区号code1,code2。

若code1=0,且code2=0,则线段P1P2在窗⼝内,应取之。

若按位与运算code1&code2,则说明两个端点同时在窗⼝的上⽅、下⽅、左⽅或右⽅,则可判断线段完全在窗⼝外,可弃之;否则,按第三种情况处理,求出线段与窗⼝某边的交点,在交点处把线段⼀分为⼆,其中必有⼀段在窗⼝外,可弃之,再对另⼀段重复上述处理。

100110001010000100000010010********* 多边形裁剪编码程序实现:#include "stdafx.h"#include<stdio.h>#include<conio.h>#include<graphics.h>#define LEFT 1#define RIGHT 2#define BOTTOM 4#define TOP 8void midpointLine(int x0,int y0,int x1,int y1,int color)//中点画线算法{int a,b,d1,d2,d,x,y;a=y0-y1;b=x1-x0;d=2*a+b;d1=2*a;d2=2*(a+b);x=x0;y=y0;putpixel(x,y,color);while(x<x1){if(d<0){x++;y++;d+=d2;}else{x++;d+=d1;}putpixel(x,y,color);}}int encode(int x,int y,int XL,int XR,int YB,int YT)//编码{int c=0;if(x<XL) c|=LEFT;if(x>XR) c|=RIGHT;if(y<YB) c|=BOTTOM;if(y>YT) c|=TOP;return c;}void C_SLineClip(int x1,int y1,int x2,int y2,int XL,int XR,int YB,int YT){int code1,code2,code,x,y;code1=encode(x1,y1,XL,XR,YB,YT);code2=encode(x2,y2,XL,XR,YB,YT);while((code1 != 0) || (code2 != 0)){if((code1 & code2) != 0){midpointLine(x1,y1,x2,y2,RGB(0, 255, 0));//如果直线在裁剪窗⼝外就⽤绿⾊画出printf("线段在窗⼝外!");return;}if(code1 != 0) code=code1;else code=code2;if((LEFT & code) != 0){x=XL;y=y1+(y2-y1)*(XL-x1)/(x2-x1);}else if((RIGHT & code) != 0){x=XR;y=y1+(y2-y1)*(XR-x1)/(x2-x1);}else if((BOTTOM & code) != 0){y=YB;x=x1+(x2-x1)*(YB-y1)/(y2-y1);}else if((TOP & code) != 0){y=YT;x=x1+(x2-x1)*(YT-y1)/(y2-y1);}if(code == code1){x1=x; y1=y; code1=encode(x,y,XL,XR,YB,YT);}else{x2=x; y2=y; code2=encode(x,y,XL,XR,YB,YT);}}midpointLine(x1,y1,x2,y2,RGB(255,0,0));//将裁减的直线⽤红⾊标注return;}int main(int argc, char* argv[]){int gdriver=DETECT,gmode;int x1=20,y1=30,x2=250,y2=300,XL=10,XR=200,YT=400,YB=30;initgraph(&gdriver,&gmode,"c:\\tc");//setbkcolor(WHITE);cleardevice();midpointLine(x1,y1,x2,y2,RGB(0,255,0));//将被裁剪直线⽤绿⾊画出rectangle(10,400,200,30);//rectangle(int left,int top,int right,int bottom);//裁剪窗⼝ C_SLineClip(x1,y1,x2,y2,XL,XR,YB,YT);// cohen sutherland算法getch();closegraph();return0;}显⽰效果:将在窗⼝内的线段设为红⾊,窗⼝外的线段设为绿⾊。

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

实验三图形裁剪算法1.实验目的:理解区域编码(Region Code,RC)设计Cohen-Sutherland直线裁剪算法编程实现Cohen-Sutherland直线裁剪算法2.实验描述:设置裁剪窗口坐标为:wxl=250;wxr=850;wyb=250;wyt=450;裁剪前如下图所示:裁剪后结果为:3.算法设计:Cohen-Sutherland 直线裁剪算法:假设裁剪窗口是标准矩形,由上(y=wyt)、下(y=wyb)、左(x=wxl)、右(x=wxr)四条边组成,如下图所示。

延长窗口四条边形成9个区域。

根据被裁剪直线的任一端点P(x,y)所处的窗口区域位置,可以赋予一组4位二进制区域码C4C3C2C1。

为了保证窗口内直线端点的编码为零,编码规则定义如下:第一位:若端点位于窗口之左侧,即x<wxl ,则C1=1,否则C1=0。

第二位:若端点位于窗口之右侧,即x>wxr,则C2=1,否则C2=0。

第三位:若端点位于窗口之下侧,即y<wyb,则C3=1,否则C3=0。

第四位:若端点位于窗口之上侧,即y>wyt,则C4=1,否则C4=0。

裁剪步骤:1. 若直线的两个端点的区域编码都为零,即RC1|RC2=0(二者按位相或的结果为零,即RC1=0 且RC2=0),说明直线两端点都在窗口内,应“简取”之。

2. 若直线的两个端点的区域编码都不为零,即RC1&RC2≠0(二者按位相与的结果不为零,即RC1≠0且RC2≠0,即直线位于窗外的同一侧,说明直线的两个端点都在窗口外,应“简弃”之。

3. 若直线既不满足“简取”也不满足“简弃”的条件,直线必然与窗口相交,需要计算直线与窗口边界的交点。

交点将直线分为两段,其中一段完全位于窗口外,可“简弃”之。

对另一段赋予交点处的区域编码,再次测试,再次求交,直至确定完全位于窗口内的直线段为止。

4. 实现时,一般按固定顺序左(x=wxl)、右(x=wxr)、下(y=wyb)、上(y=wyt)求解窗口与直线的交点。

4.源程序:1)//TestView.hclass CTestView : public CView{…….protected:double Pointx[2],Pointy[2];//用户绘制的直线int wxl,wxr,wyb,wyt;//左上与右下CDC Picture;//内存(预存)DC,防止屏幕闪烁char m_i; //第一个点还是第二个点BOOL m_Attatch;BOOL m_Draw;unsigned int RC,RC0,RC1;……..}2) //TestView.cpp#define ROUND(a) int(a+0.5)#define LEFT 1#define RIGHT 2#define BOTTOM 4#define TOP 8CTestView::CTestView(){//窗口位置坐标wxl=250;wxr=850;wyb=250;wyt=450;m_Attatch=FALSE;m_i=0;m_Draw=FALSE;RC0=0;RC1=0;}void CTestView::OnDraw(CDC* pDC){CTestDoc* pDoc = GetDocument();ASSERT_V ALID(pDoc);// TODO: add draw code for native data hereCRect Rect;GetClientRect(&Rect);//获得客户区的大小CBitmap Bitmap,*pBitmap;Bitmap.LoadBitmap(IDB_BITMAP1);CDC MemDC;MemDC.CreateCompatibleDC(GetDC());pBitmap=MemDC.SelectObject(&Bitmap);MemDC.BitBlt(0,0,Rect.Width(),Rect.Height(),&Picture,0,0,SRCCOPY);MemDC.TextOut((wxl+wxr)/2,wyb-20,"窗口");//窗口标题//绘制窗口和直线CPen Pen3,*pOldPen3;//定义3个像素宽度的画笔Pen3.CreatePen(PS_SOLID,3,RGB(0,0,0));pOldPen3=MemDC.SelectObject(&Pen3);MemDC.MoveTo(wxl,wyt);MemDC.LineTo(wxr,wyt);MemDC.LineTo(wxr,wyb);MemDC.LineTo(wxl,wyb);MemDC.LineTo(wxl,wyt);MemDC.SelectObject(pOldPen3);Pen3.DeleteObject();CPen Pen1,*pOldPen1;//定义1个像素宽度的画笔Pen1.CreatePen(PS_SOLID,1,RGB(0,255,255));pOldPen1=MemDC.SelectObject(&Pen1);if(m_i>=1){MemDC.MoveTo(ROUND(Pointx[0]),ROUND(Pointy[0]));MemDC.LineTo(ROUND(Pointx[1]),ROUND(Pointy[1]));}MemDC.SelectObject(pOldPen1);Pen1.DeleteObject();CDC *dc=GetDC();dc->BitBlt(0,0,Rect.Width(),Rect.Height(),&MemDC,0,0,SRCCOPY);MemDC.SelectObject(pBitmap);}void CTestView::OnMENUClip()//裁剪菜单函数{Cohen();Invalidate(FALSE);}unsigned int CTestView::EnCode(double LinePx,double LinePy)//端点编码函数{//顺序左右下上RC=0;if(LinePx<wxl){RC=RC | LEFT;}if(LinePx>wxr){RC=RC | RIGHT;}if(LinePy<wyb){RC=RC | BOTTOM;}if(LinePy>wyt){RC=RC | TOP;}return RC;}void CTestView::Cohen()//Cohen-Sutherland算法{BOOL Change;double x,y;RC0=EnCode(Pointx[0],Pointy[0]);RC1=EnCode(Pointx[1],Pointy[1]);while(TRUE){Change=FALSE;if(0 == (RC0|RC1)){//简取之return;}else if(0!=(RC0 & RC1)){//简弃之return;}else{if(0==RC0)//如果P0点在窗口内,交换P0和P1,保证p0点在窗口外{//交换点的坐标值double TPointx,TPointy;TPointx=Pointx[0];TPointy=Pointy[0];Pointx[0]=Pointx[1];Pointy[0]=Pointy[1];Pointx[1]=TPointx;Pointy[1]=TPointy;//交换点的编码值unsigned int TRC;TRC=RC0;RC0=RC1;RC1=TRC;}//按左、右、下、上的顺序裁剪if(RC0 & LEFT )//P0点位于窗口的左侧{x=wxl;//求交点yy=Pointy[0]+(Pointy[1]-Pointy[0])*(x-Pointx[0])/(Pointx[1]-Pointx[0]);Pointx[0]=x;Pointy[0]=y;Change=TRUE;RC0=EnCode(Pointx[0],Pointy[0]);RC1=EnCode(Pointx[1],Pointy[1]);}if(RC0 & RIGHT )//P0点位于窗口的右侧{x=wxr;//求交点yy=Pointy[0]+(Pointy[1]-Pointy[0])*(x-Pointx[0])/(Pointx[1]-Pointx[0]);Pointx[0]=x;Pointy[0]=y;Change=TRUE;RC0=EnCode(Pointx[0],Pointy[0]);RC1=EnCode(Pointx[1],Pointy[1]);}if(RC0 & BOTTOM )//P0点位于窗口的下侧{y=wyb;//求交点xx=Pointx[0]+(Pointx[1]-Pointx[0])*(y-Pointy[0])/(Pointy[1]-Pointy[0]);Pointx[0]=x;Pointy[0]=y;Change=TRUE;RC0=EnCode(Pointx[0],Pointy[0]);RC1=EnCode(Pointx[1],Pointy[1]);}if(RC0 & TOP )//P0点位于窗口的上侧{y=wyt;//求交点xx=Pointx[0]+(Pointx[1]-Pointx[0])*(y-Pointy[0])/(Pointy[1]-Pointy[0]);Pointx[0]=x;Pointy[0]=y;Change=TRUE;RC0=EnCode(Pointx[0],Pointy[0]);RC1=EnCode(Pointx[1],Pointy[1]);}if(FALSE==Change){return;}}}}void CTestView::OnMENUDrawLine()//绘制直线菜单函数{// TODO: Add your command handler code hereif(FALSE==m_Attatch){Picture.CreateCompatibleDC(GetDC());CBitmap *Bitmap,*pBitmap;Bitmap=new CBitmap;Bitmap->LoadBitmap(IDB_BITMAP1);pBitmap=Picture.SelectObject(Bitmap);m_Attatch=TRUE;}m_Draw=TRUE;m_i=0;Invalidate(FALSE);AfxGetMainWnd()->SetWindowText("Cohen-Sutherland直线裁剪算法");//显示标题MessageBox("请使用鼠标在屏幕上绘制直线,然后点击裁剪按钮进行裁剪","提示",MB_OKCANCEL);}void CTestView::OnLButtonDown(UINT nFlags, CPoint point) //单击鼠标左键函数{// TODO: Add your message handler code here and/or call defaultif(TRUE==m_Draw){if(m_i<2){Pointx[m_i]=point.x;Pointy[m_i]=point.y;m_i++;}}CView::OnLButtonDown(nFlags, point);}void CTestView::OnMouseMove(UINT nFlags, CPoint point) //鼠标移动函数{// TODO: Add your message handler code here and/or call defaultif(TRUE==m_Draw){if(m_i<2){Pointx[m_i]=point.x;Pointy[m_i]=point.y;Invalidate(FALSE);}}CView::OnMouseMove(nFlags, point);}5.运行结果:(屏幕截图)序号检查项目分值提交时间得分1 算法设计(40%)0-402 算法的程序实现(40%)0-403 运行结果(10%)0-104 实验报告规范性 (10%) 0-10成绩。

相关文档
最新文档