二维图形裁剪

合集下载

计算机图形学二维图形的裁剪

计算机图形学二维图形的裁剪
所示,对于其中任一边界向量,从向量起点A向终点B看过去: 如果被测试点P在该边界线右边(即内侧),AB×AP的方向与X-Y平面
垂直并指向屏幕里面,即右手坐标系中Z轴的负方向。 反过来,如果P在该边界线的左边(即外侧),这时AB×AP的方向与X-
Y平面垂直并指向屏幕外面,即右手坐标系中Z轴的正方向。 设:点P(x,y)、点A(xA,yA)、点B(xB,yB), 向量AB={(xB-xA),(yB-yA)}, 向量AP={(x-xA),(y-yA)}, 那么AB×AP的方向可由下式的符号来确定:
依次下去,相对于第三条、第四条边界线进行裁剪,最后输出的多边 形顶点序列即为所求的裁剪好了的多边形。如下图所示。
7.3.1 Sutherland-Hodgeman多边形裁剪
新的多边形顶点序列产生规则: 在用窗口一条边界及其延长线裁剪一个多边形时,该边界线把平面分
成两个部分:一部分称为边界内侧;另一部分称为边界外侧。 如下图所示,依序考虑多边形的各条边。假设当前处理的多边形的边为
V=(xB-xA)·(y-yA)-(x-xA)·(yB-yA)
(3-14)
因此,当V≤0时,P在边界线内侧; 而V>0时,P在边界线外侧。
练习
Sutherland-Hodgeman多边形裁剪中,常用向量叉积法来测试当前点P是 否在边界内侧。已知窗口边界A(30,100)、B(40,180),某点P(50, 300),请 问点P在边界内侧吗?
7.3 多边形的裁剪
多边形裁剪的常用算法 1.Sutherland-Hodgeman多边形裁剪 2.Weiler-Atherton任意多边形裁剪
7.3.1 Sutherland-Hodgeman多边形裁剪
Sutherland-Hodgman算法也叫逐边裁剪法,该算法是萨瑟兰德 (I.E.Sutherland)和霍德曼(Hodgman)在1974年提出的。这种算法采用了 分割处理、逐边裁剪的方法。 一、Sutherland-Hodgeman多边形裁剪算法思想:

二维图形的裁剪1

二维图形的裁剪1

7.2.1 Cohen-Sutherland算法
2、判别 根据C1和C2的具体值,可以有三种情况: (1)C1=C2=0,表明两端点全在窗口
内,因而整个线段也在窗内,应予保留。
(2)C1&C2≠0(两端点代码按位作逻辑 乘不为0),即C1和C2至少有某一位同时为1,
表明两端点必定处于某一边界的同一外侧,因
Cohen-Sutherland 算法 (编码算法)
算法思想:
第一步 判别线段两端点是否都落在窗口内,如果是, 则线段完全可见;否则进入第二步; 第二步 判别线段是否为显然不可见,如果是,则裁 剪结束;否则进行第三步 ; 第三步 求线段与窗口边延长线的交点,这个交点将 线段分为两段,其中一段显然不可见,丢弃。 对余下的另一段重新进行第一步,第二步判断, 直至结束
裁剪过程是递归的。
7.2.1 Cohen-Sutherland算法
二、Cohen-Sutherland算法步骤:
1、分区编码 延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进 制代码标识。各区代码值如图中所示。 四位二进制代码的编码规则是:
(1)第一位置1:区域在左边界外侧 (2)第二位置1:区域在右边界外侧 (3)第三位置1:区域在下边界外侧 (4)第四位置1:区域在上边界外侧 裁剪窗口内(包括边界上)的区域,四位二进制代码均为0。 设线段的两个端点为P1(x1,y1)和P2(x2,y2),根据上述规则, 可以求出P1和P2所在区域的分区代码C1和C2。
7.2.1 Cohen-Sutherland算法
一、Cohen-Sutherland算法思想: 该算法也称为编码算法,首先对线段的两个端点按所在的 区域进行分区编码,根据编码可以迅速地判明全部在窗口内的 线段和全部在某边界外侧的线段。只有不属于这两种情况的线 段,才需要求出线段与窗口边界的交点,求出交点后,舍去窗 外部分。 对剩余部分,把它作为新的线段看待,又从头开始考虑。 两遍循环之后,就能确定该线段是部分截留下来,还是全部舍 弃。

CG11-二维图形裁剪

CG11-二维图形裁剪

二维裁剪:线段裁剪 线段裁剪处理的基础有两个方面:
● 对象裁剪方法 ● 其它裁剪方法
– 尤其是对不能确定的线段,要计算 它与裁剪边界的交点,再通过对线 段的端点进行“内 - 外检测”来处 理线段。
裁剪
裁剪后
线段裁剪举例
☆二维裁剪定义 线段P1P2 ☆点的裁剪 由下端点 P1 开始,依次按左、右、 P2 ☆线段裁剪 上、下边界对 P1 检查,发现端点位 ● 线段裁剪举例 P2’ ◘ 算法举例 于裁剪窗口下。
裁剪窗口
二维裁剪时机选择
☆二维裁剪定义
◘ 二维裁剪时机
裁剪算法可用于世界坐标系中, 世界坐标系下的裁剪只有窗口内的部分映射到设备 空间中,而将落在窗口外的图形部分删除。
☆点的裁剪 ☆线段裁剪 ● 线段裁剪举例 ● 线段编码裁剪 ● 梁 -Barsky 裁 剪 ● NLN直线裁剪 ● 非矩形窗口裁
基本认识:裁剪窗口是二维对象;线段是一维对 象,两个对象维数不同不便比较。 解决思路:将待裁剪线段及裁剪矩形窗口均看作 点集,那么,裁剪结果即为两点集的交集。
解决办法:
设:P1P2所在直线为L; 记:该直线(或其延长线)与裁剪窗口的两交点 为Q1Q2,称为Q1Q2诱导窗口,它是一维的。 P1P2 关于矩形窗口的裁剪结果与 P1P2 关于诱 导窗口的裁剪结果是一致的
◘ 区域码生成 ◘ 内外点判断 ◘ 算法举例 ◘ 算法举例(续)
– 根据线段端点的区域码,可快速判断线段是否完全在裁 剪窗口内或外:
完全在窗口边界内的线段两个端点的区域码均为0000;
两个端点区域码同样位置都为 1的线段完全在裁剪矩形外。
– 测试线段更好的方法是对两个端点的区域码进行逻辑与 操作:

图形学二维裁剪实验报告

图形学二维裁剪实验报告

专业班级:学号:姓名:一、试验名称:二维裁剪二、试验目的:在二维观察中,需要在观察坐标系下对窗口进行裁剪,即只保留窗口内的那部分图形,去掉窗口外的图形。

二维裁剪是用计算机生成图形最基本的技能,通过本实验使学生掌握如何用计算机进行二维裁剪并熟悉开发环境。

三、实验原理:算法源代码:void CMyView::OnDraw(CDC* pDC){CMyDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data herePoint FrameLT,FrameRB;Point P[5];FrameLT.x=150;FrameLT.y=150;FrameRB.x=320;FrameRB.y=320;pDC->Rectangle((int)FrameLT.x,(int)FrameLT.y,(int)FrameRB.x,(int)FrameRB. y);for(int i = 0; i < 5; i++){P[i].x = (float)(260 + 150*cos(72*i*PI/180) +0.5);P[i].y = (float)(260 + 150*sin(72*i*PI/180) +0.5);}专业班级:学号:姓名:pDC->MoveTo((int)P[0].x,(int)P[0].y);pDC->LineTo((int)P[2].x,(int)P[2].y);pDC->LineTo((int)P[4].x,(int)P[4].y);pDC->LineTo((int)P[1].x,(int)P[1].y);pDC->LineTo((int)P[3].x,(int)P[3].y);pDC->LineTo((int)P[0].x,(int)P[0].y);}void CMyView::Code(Point FrameLT,Point FrameRB,Point P,unsigned char *Flag){unsigned char flag=0;if(P.x<FrameLT.x) flag+=1;if(P.x>FrameRB.x) flag+=2;if(P.y>FrameRB.y) flag+=4;if(P.y<FrameLT.y) flag+=8;(*Flag)=flag;}void CMyView::Clipping(Point FrameLT,Point FrameRB,Point LineSP,Point LineEP){CClientDC dc(this);unsigned char flagSP,flagEP,flagAND,flagOR;double k=(LineEP.y-LineSP.y)/(LineEP.x-LineSP.x);Code(FrameLT,FrameRB,LineSP,&flagSP);Code(FrameLT,FrameRB,LineEP,&flagEP);专业班级:学号:姓名:flagAND=flagSP & flagEP;if(flagAND!=0)return;while(flagSP!=0||flagEP!=0){flagOR=flagSP|flagEP;if((flagOR&0x01)==1){if((flagSP&0x01)==1){LineSP.y=(float)(LineSP.y+k*(FrameLT.x-LineSP.x)); LineSP.x=FrameLT.x;Code(FrameLT,FrameRB,LineSP,&flagSP);}else{LineEP.y=(float)(LineEP.y+k*(FrameLT.x-LineEP.x)); LineEP.x=FrameLT.x;Code(FrameLT,FrameRB,LineEP,&flagEP);}}if((flagOR&0x02)==2){if((flagSP&0x02)==2){LineSP.y=(float)(LineSP.y+k*(FrameRB.x-LineSP.x)); LineSP.x=FrameRB.x;专业班级:学号:姓名:Code(FrameLT,FrameRB,LineSP,&flagSP);}else{LineEP.y=(float)(LineEP.y+k*(FrameRB.x-LineEP.x)); LineEP.x=FrameRB.x;Code(FrameLT,FrameRB,LineEP,&flagEP);}}if((flagOR&0x04)==4){if((flagSP&0x04)==4){LineSP.x=(float)(LineSP.x+(FrameRB.y-LineSP.y)/k); LineSP.y=FrameRB.y;Code(FrameLT,FrameRB,LineSP,&flagSP);}else{LineEP.x=(float)(LineEP.x+(FrameRB.y-LineEP.y)/k); LineEP.y=FrameRB.y;Code(FrameLT,FrameRB,LineEP,&flagEP);}}if((flagOR&0x08)==8){专业班级:学号:姓名:if((flagSP&0x08)==8){LineSP.x=(float)(LineSP.x+(FrameLT.y-LineSP.y)/k); LineSP.y=FrameLT.y;Code(FrameLT,FrameRB,LineSP,&flagSP);}else{LineEP.x=(float)(LineEP.x+(FrameLT.y-LineEP.y)/k); LineEP.y=FrameLT.y;Code(FrameLT,FrameRB,LineEP,&flagEP);}flagAND=flagSP&flagEP;if(flagAND!=0)return;}dc.MoveTo((int)LineSP.x,(int)LineSP.y);dc.LineTo((int)LineEP.x,(int)LineEP.y);}}void CMyView::OnCut() //裁剪{// TODO: Add your command handler code hereCClientDC dc(this);CPen pen(PS_SOLID,1,RGB(255,255,255));CPen *pOldpen = dc.SelectObject(&pen);专业班级:学号:姓名:CBrush*pBrush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));dc.SelectObject(pBrush);Point FrameLT,FrameRB;Point P[5];FrameLT.x=150;FrameLT.y=150;FrameRB.x=320;FrameRB.y=320;dc.Rectangle((int)FrameLT.x,(int)FrameLT.y,(int)FrameRB.x,(int)FrameR B.y);for(int i = 0; i < 5; i++){P[i].x = (float)(260 + 150*cos(72*i*PI/180) +0.5);P[i].y = (float)(260 + 150*sin(72*i*PI/180) +0.5);}dc.MoveTo((int)P[0].x,(int)P[0].y);dc.LineTo((int)P[2].x,(int)P[2].y);dc.LineTo((int)P[4].x,(int)P[4].y);dc.LineTo((int)P[1].x,(int)P[1].y);dc.LineTo((int)P[3].x,(int)P[3].y);dc.LineTo((int)P[0].x,(int)P[0].y);dc.SelectObject(pOldpen);专业班级:学号:姓名:dc.Rectangle((int)FrameLT.x,(int)FrameLT.y,(int)FrameRB.x,(int)FrameR B.y);Clipping(FrameLT,FrameRB,P[0],P[2]);Clipping(FrameLT,FrameRB,P[2],P[4]);Clipping(FrameLT,FrameRB,P[4],P[1]);Clipping(FrameLT,FrameRB,P[1],P[3]);Clipping(FrameLT,FrameRB,P[3],P[0]);}四、实验总结:裁剪处理的主要步骤是:①图元关于窗口内外关系的判别;②图元与窗口的求交。

中间区段法裁剪

中间区段法裁剪

中间区段法裁剪
中间区段法裁剪(Middle Segment Clipping)是计算机图形学
中一种常用的二维裁剪算法,主要用于裁剪直线和多边形等图形。

中间区段法裁剪的基本思想是:首先确定裁剪窗口的边界,并将其等分为上、下、左、右四个方向的区段。

接着,根据裁剪窗口与图形在平面上的相对位置关系,决定各个区段是否需要进行裁剪。

最终,根据裁剪结果进行图形的显示或丢弃。

具体裁剪过程如下:
1. 确定裁剪窗口的边界:左边界(Xmin)、右边界(Xmax)、上边界(Ymin)和下边界(Ymax)。

2. 以直线为例,对于每一条线段,根据起点(P1)和终点
(P2)的位置关系,判断其是否需要进行裁剪。

3. 首先根据P1和P2的水平位置关系判断是否在裁剪窗口的
左右区段内。

若在同一区段内,则根据垂直位置关系进一步判断是否在裁剪窗口的上下区段内。

若在裁剪窗口内,则直接保留该线段。

若跨越区段边界,则根据裁剪窗口与线段的交点计算新的起点和终点,并进行裁剪。

4. 根据裁剪结果进行线段的显示或丢弃。

中间区段法裁剪的优点是相对简单、高效,适用于直线和多边形等较简单的图形。

缺点是无法处理曲线和复杂图形的裁剪。

在实际应用中,可以与其他裁剪算法结合使用,以实现更复杂的图形裁剪效果。

计算机图形学第6章二维图形的裁剪

计算机图形学第6章二维图形的裁剪
第七章 二维图形的裁剪
• 重点:掌握二维图形点、线段、多边形和字符的裁剪算法 。
• 难点:理解二维图形的裁剪算法思想并且用C语言进行算法 的实现。
一、裁剪的意义 为了描述图形对象,我们必须存储它的全部信息,但有时为了达到分 区描述或重点描述某一部分的目的,往往将要描述的部分置于一个窗口内, 而将窗口外的部分“剪掉”,这个处理过程叫做裁剪,裁剪在计算机图形 处理中具有十分重要的意义。 裁剪实质上是从数据集合中抽取信息的过程,这个过程是通过一定的 计算方法来实现。
7.2.2 中点分割算法
二、中点分割算法实现: 1、将直线的两端点P1、P2编码得:C1、C2; 2、判别 根据C1和C2的具体值,可以有三种情况: (1)C1=C2=0,表明两端点全在窗口内,因而整个线段也在窗内, 应予保留。 (2)C1&C2≠0(两端点代码按位作逻辑乘不为0),即C1和C2至少 有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线 段全在窗外,应予舍弃。 (3)不属于上面两种情况,均需要求交点。
如果上面四个不等式中任何一个不满足,则点(x,y)位于窗口之 外。 对于任意多边形窗口,需要根据多边形内点的判别准则进行判断。
7.2 线段的裁剪
直线段的裁剪比点复杂,其裁剪方法又是多边形裁剪和三维图形裁剪的 基础。 一、直线裁剪的基本思想 判断直线与窗口的位置关系: 1.确定直线是完全可见; 2.部分可见; 3.还是完全不可见。 对部分可见线段,求出它与窗口边界的交点,并将窗口内的线段输出。
一、中点分割算法思想: 1、中点公式
7.2.2 中点分割算法
2、中点分割法求交点的规则 如图中所示,当线段P1P2求出中点P后,舍弃线段的哪部分,由下面 两条规则决定:
中点分割法求交点规则

计算机图形学第7章二维图形的裁剪(2_3)

计算机图形学第7章二维图形的裁剪(2_3)

7.3.1 Sutherland-Hodgeman多边形裁剪 3、对多边形的n条边进行处理,对当前点号的考虑为:0~n-1。
for(i=0;i<n;i++) { if(当前第i个顶点是在边界内侧) /*对左边界:p[i][0]>=xmin */ { if(flag!=0) /*前一个点在外侧吗?*/ { flag=0;/*从外到内的情况,将标志置0,作为下一次循环的前一点标志*/ j++; q[j][0]=求出交点的x方向分量; /*将交点q放入新多边形*/ q[j][1]=求出交点的y方向分量; } j++; q[j][0]= p[i][0]; /*将当前点p放入新多边形*/ q[j][1]= p[i][1]; } else { if(flag==0) /*前一个点在内侧吗?*/ { flag=1;/*从内到外的情况,将标志置1,作为下一次循环的前一点标志*/ j++; q[j][0]=求出交点的x方向分量; /*将交点q放入新多边形*/ q[j][1]=求出交点的y方向分量; } } s[0]=p[i][0]; /*将当前点作为下次循环的前一点*/ s[1]=p[i][1]; }
7.2.3 梁友栋-Barsky裁剪算法
XWmin X 1 Xu ' XWmax X 1 Xu ' YWmin Y1 Yu ' YWmax Y1 Yu '
XWmin X 1 Xu '
这四个不等式可以表示为:
XWmax X 1 Xu ' YWmin Y1 Yu ' YWmax Y1 Yu '
7.2.3 梁友栋-Barsky裁剪算法

[计算机软件及应用]二维图形裁剪

[计算机软件及应用]二维图形裁剪

①若P1P2完全在窗口内,则显示该线段P1P2,简称“取”之;
②若P1P2完全在窗口外,则丢弃该线段,简称“舍”之;
③若线段既不满足“取”的条件,也不满足“舍”的条件,则 求线段与窗口边界的交点,在交点处把线段分为两段,其 中一段完全在窗口外,可舍弃之,然后对另一段重复上述 处理。
核心思想:分区编码和线段分割。
当Qi =0时 若Di <0 时,线段不可见
(如图中AB,有QR=0,DR<0)
若Di >0 时, 分析另一D, (如图中的EF就是这种情况,它使QL=0, DL>0和QR=0,DR>0。这时由于EF和x=xL 及x=xR平行,故不必去求出EF和x=xL及 x=xR的交点,而让EF和y=yT及y=yB的交点 决定直线段上的可见部分。)
#define LEFT 1 #define RIGHT 2 #define BOTTOM 4 分区编码方法:图形区域划分成九个区域。 #define TOP 8
编码原则
四位编码 1111 表示端点所处的位置:
1 1 1 1
(--->) 上 下 右 左
第一位为“1”时,表示点在y=yT的上方; 第二位为“1”时,表示点在y=yB的下方;
例:分别给下列直线段编码,并判断是否需要剪裁。
P2
C2=1010
C
C1=0001
P2
C2=0000
D A P1 P2
C1=0000
P2
C2=0000
P1 B P1
C1=0100 C2=0101
P1
C1=0101
例:Cohen-SutherLand算法过程:
过程: 1)输入线段AB的两端点坐标A(x0,y0)、B(x1,y1),以及裁剪窗口的四 条边界:yt,yb,xl,xr。 2)对AB编码,A的编码codeA=0001,B的编码为codeB=0110。 3)线段AB裁剪的基本过程(按左右下上的顺序): ①由于codeA | codeB≠0,对AB不能全部保留;又因为codeA & codeB=0,对 AB不能全部舍弃,因此要对AB进行求交处理。 ②由codeA=0001知A在窗口左边外侧,按左右下上的顺序求AB与窗口左边 交点为P1,AP1必在窗口外,故裁剪掉,并用A替换P1。如图(b)所示。 (交点替换是为了方便编程循环)。 ③对P1B重复上述处理。A(原P1)编码为0000,B编码为0110;由于A(原 P1)已在窗口内,交换A和B的坐标值与编码,则B编码为0000,A编码变为 0110,按左右下上顺序求得右交点为P3;A(原B)P3必在窗口外,故裁剪掉, 并用A替换P3。如图(c)所示。 ④A的编码还没有达到0000,再求得下边交点为P2,AP2必定在窗口外,故 裁剪掉,并用A替换P2。如图(d)所示。 ⑤对剩下的直线段AB再进行判断,现在A编码为0000,B编码为0000,由于 codeA | codeB=0,全在窗口中,故全部保留。 最后得到裁剪后的线段为AB,算法结束。

计算机图形学-二维图形变换与裁剪ppt课件

计算机图形学-二维图形变换与裁剪ppt课件
计算机图形学二维图形变换与 裁剪
图形变换
2
观察与思考
零件三视图
3
观察与思考
三视图投影示意图
4
图形变换
从不同角度观察物体,会看到不同的形状 形状的变化可以通过图形变换来实现 图形变换是计算机图形学的基础内容之一 通过图形变换 可由简单图形生成复杂图形 可用二维图形表示三维形体 可对静态图形经过快速变换而获得图形的动 态显示效果
13
数学基础(4)
矩阵的乘法
a b 11 a 12 a 13 11 b 12 b 13 A B a a a b b b 21 22 23 21 22 23 a b 31 a 32 a 33 31 b 32 b 33
矩阵的数乘
a ka 11 a 12 a 13 11 ka 12 ka 13 k a a a ka ka ka 21 22 23 21 22 23 a ka 31 a 32 a 33 31 ka 32 ka 33
y1 y2 yn
z1 z2 zn
10
数学基础 1
设有两个矢量
u x U u y u z
vx V v y vz
矢量和
u x vx U V u v y y u z vz
a b a b a b a b a b a b a b a b a b 11 11 12 21 13 31 11 12 12 22 13 32 11 13 12 23 13 33 a b a b a b a b a b a b a b a b a b 21 1122 2123 3121 1222 2223 3221 1322 2323 33 a b a b a b a b a b a b a b a b a b 31 11 32 21 33 31 31 12 32 22 33 32 31 13 32 23 33 33

二维图形的裁剪算法研究与改进的开题报告

二维图形的裁剪算法研究与改进的开题报告

二维图形的裁剪算法研究与改进的开题报告一、选题背景及研究意义随着计算机图形学的发展,二维图形裁剪算法成为计算机图形学的基础和重要研究领域之一。

二维图形裁剪算法是指对给定的二维图形进行剪裁操作,把不在特定区域范围内的线段或多边形等图形部分删除,从而获得新的图形。

二维图形裁剪广泛应用于计算机游戏、数据可视化、图像处理、计算机辅助设计等领域,在各领域拥有极其广泛的应用前景。

近年来,针对二维图形裁剪算法的研究与改进持续不断,但仍存在一些问题需要进一步探讨。

例如,传统算法中存在的剪裁效率低下、不足以应对复杂图形等问题。

因此,本课题旨在研究二维图形裁剪算法的基本理论,探讨和改进已有算法,提高二维图形裁剪的效率和准确性,推动计算机图形学的发展。

二、研究目标1. 系统研究和总结二维图形裁剪算法的基本理论,形成对于算法的基本认知。

2. 研究和分析传统算法的不足之处,提出改进方案。

3. 实现改进后的算法,并进行性能测试和比较,验证算法优越性。

4. 应用改进后的算法解决具体问题,如游戏场景剪裁等。

三、主要内容和研究方法1. 二维图形裁剪算法的基本理论研究。

主要包括 Cohen-Sutherland 算法,Liang-Barsky 算法等传统算法,以及后续研究的扫描线算法、Sutherland-Hodgman 算法、中点画线法等算法的原理和思路。

2. 传统算法的问题分析与改进。

对传统算法中存在的问题如剪裁效率低下、不足以应对复杂图形等进行分析,提出相应的改进方案。

3. 算法实现及性能测试。

采用计算机语言实现改进后的算法,并进行性能测试和比较。

4. 应用改进后的算法解决具体问题。

开发二维游戏场景剪裁应用,使用改进后的算法进行剪裁,比较效果和性能。

本研究的研究方法主要包括文献调研和算法实现与测试。

四、预期成果和进度安排1. 文献综述报告。

完成对二维图形裁剪算法的基本理论的文献调研,形成文献综述报告。

时间安排:2 周。

2. 算法设计及改进。

计算机图形学中二维裁剪算法的研究

计算机图形学中二维裁剪算法的研究

计算机图形学中二维裁剪算法的研究随着计算机技术的发展,计算机图形学也日益成熟。

在我们的日常生活中,也成了随处可见的必需部分。

在医学、娱乐、图形艺术、商业、教育培训、科学工程等众多领域,计算机图形学的应用非常普遍。

计算机图形学主要研究的是在计算机中构造图形,将用数学模型描述的图形数据采用合适的算法转换为屏幕上图形的显示。

计算机图形学学科研究的对象为二维图形学和三维图形学及其显示和变化情况。

点、线、面为二维图形学范畴,几何体和场等数学构造方法则为三维图形学范畴。

现在,计算机图形学的一些基本算法已经形成了固化在硬件中的规范软件包,这个学科也日趋成熟和完善。

但是依然有很多算法还需要不断的改进才能应用到实际中,而裁剪算法就是其中之一。

本文主要对二维图形裁剪中的椭圆形窗口裁剪算法进行了研究,使其具有较高的效率和稳定性。

标签:计算机图形学裁剪算法椭圆形窗口线裁剪算法1 裁剪概述裁剪算法,简称裁剪,是计算机图形学中很多重要问题的基础,它就是从数据集合中识别指定区域内或指定区域外图形部分的过程。

裁剪用途很广泛,最典型的就是确定场景中位于指定区域内的景物部分。

其中,指定区域成为裁剪窗口,一般为矩形,由四条边组成,上、下、左、右,即:(Xl,Yb),(Xr,Yt)。

实质上来说,裁剪就是确定哪些多边形等几何体位于裁剪窗口内。

对于点(X,Y),只要判断两对不等式:Xl≤X≤Xr,Yb≤Y≤Yt即可。

如果四个点坐标的不等式都不成立,则这个点在矩形窗口外,否则,在窗口内。

有一种最简单的裁剪方法,就是将所有图形扫描转换成点,然后在进行判断。

但是这种方法时间消耗太大,非常不可取。

倘若将全部在窗口外的图形完全排除而不进行扫描转换,则时间上面可以高效很多,故一般采用先裁剪再扫描的方法。

按裁减对象来分,裁剪算法大概分为如下几种:点裁剪、直线段裁剪、区域多边形裁剪、曲线裁剪和文字裁剪。

裁剪有多方面应用,主要包括:使用实体造型创建对象、在三维视图中标示出可见面、对图形的一部分进行删除、复制或移动操作、防止图形边界混淆、从特定场景中抽取指定部分等。

第5章 观察变换和裁剪

第5章 观察变换和裁剪
设矩形窗口左下角点坐标为(xL,yB),右上角 点坐标为(xR ,yT ),图形中的任意一点(x,y)若满足 条件: xL≤x≤xR
yB≤y≤yT (4-18) 则,该点在窗内应为可见被显示;否则不可见被裁剪 掉。
23
5.2.2 直线段裁剪
1. 直线段与窗口的相对位置
与凸多边形窗口相交的任何直线段最多只有一 段处于其边界内。 线段与窗口的三种相对位置 关系:完全不可见、完全可见和部分可见。
5
3. 观察坐标系(Viewing Coordinate System) VC是与物理设备无关的,用于设置观察窗口观察 和描述用户感兴趣的区域内部分对象,其取值范围 由用户确定。 观察坐标系采用左手直角坐标系, 可以在用户坐标 系中的任何位置、任何方向定义。其中有一坐标轴 与 观察方向重合同向并与观察平面垂直。
27
四位代码CTCBCRCL 含义如下:
CL=1(端点在XL左); =0(端点在XL右) CR=1(端点在XR右); =0(端点在XR左) CB=1(端点在YB下); =0(端点在YB上) CT=1(端点在YT上); =0(端点在YT下)
28
YT
1001
1000
1010
0001
0000
0100
0010 0110
图形变换到设备坐标系中,并在指定视区内显示的过 程。
在2维空间中的观察变换又称为窗口视区变换。
10
2D观察控制流程:
WC: 定义 2D 对象
WC 到 VC 变换
VC: 窗口 裁剪
VC NDC 窗口 视区 变换
NDC 到 DC 变换
DC: 2D 图形 显示
11
5.1.3
WC到VC的变换
是指将对象描述从世界坐标系变换到观察坐 标系的过程。

计算机图形学基础教程(Visual C++版)第05章 二维图形变换与裁剪(清华大学出版社 孔令德)

计算机图形学基础教程(Visual C++版)第05章 二维图形变换与裁剪(清华大学出版社 孔令德)
x O
y
5-19 设备坐标系
图形学中常用的坐标系
规格化设备坐标系(Normalized Device Coordinate,NDC) 将设备坐标系规格化到(0.0,0.0)到(1.0,1.0)的 范围内而定义的坐标系。 规格化设备坐标系独立于具体输出设备。 一旦图形变换到规格化设备坐标系中,只要作一个简 单的乘法运算即可映射到具体的设备坐标系中。
wyt (xw,yw) 0000 wyb
vyt (xv,yv) 0000 vyb
wxl
wxr
vxl
已知窗口内的一点P的坐标(xw,yw),求视区中 对应点P’的坐标(xv,yv) 这属于相对于任一参考点的二维几何变换
vxr
变换步骤为:
1.将窗口左下角点(wxl,wyb)平移到观察坐标系 原点
写成方程为:
xv S x xw vxl wxl S x yv S y yw vyb wyb S y
则窗视变换的展开式为:

xv a x w b yv c y w d
裁剪
图形变换到观察坐标系下,需要按照窗口进行 裁剪,即只保留窗口内的那部分图形,去掉窗 口外的图形 假设窗口是标准矩形,即边与坐标轴平行的矩 形,由 上(y=wyt)、 下(y=wyb)、 左(x=wxl)、 右(x=wxr) 四条边描述
30
裁剪——点的裁剪
点是构成图形的基本元素 点的裁剪:
wxl x wxr, 且wyb y wyt
把图形全部打散成点进行裁剪?
31
二维直线段的裁剪
直线的裁剪是二维图形裁剪的基础 裁剪的实质是判断直线是否与窗口相交,如相 交则进一步确定位于窗口内的部分

二维图形裁剪课程设计

二维图形裁剪课程设计

二维图形裁剪课程设计一、课程目标知识目标:1. 学生能够理解并掌握二维图形裁剪的基本概念,包括图形的边界、裁剪线以及裁剪后的新图形特征。

2. 学生能够运用几何知识,分析并描述裁剪前后图形的面积、周长等属性的变化。

3. 学生能够掌握至少两种不同的图形裁剪方法,并能够解释其几何原理。

技能目标:1. 学生能够使用尺规作图工具进行二维图形的准确裁剪。

2. 学生通过实践操作,培养空间想象能力和逻辑思维能力,提高解决几何问题的能力。

3. 学生能够小组合作,进行图形裁剪的讨论与展示,有效沟通自己的思考过程。

情感态度价值观目标:1. 学生培养对几何图形美的感知,激发对数学学科的兴趣和好奇心。

2. 学生在小组活动中学会合作与分享,培养团队精神和尊重他人意见的态度。

3. 学生通过图形裁剪活动,体验数学在生活中的应用,增强学以致用的意识。

二、教学内容本课程以《数学》课本中关于平面几何的内容为基础,结合以下教学大纲开展:1. 图形裁剪概念引入:- 图形的边界与内部- 裁剪线的定义及其作用- 裁剪后图形的特征分析2. 图形裁剪的基本方法:- 尺规作图基础- 裁剪方法一:直接连接法- 裁剪方法二:辅助线法3. 图形属性的变换:- 面积的计算与变化- 周长的计算与变化- 对称性与美观性分析4. 实践操作与案例分析:- 简单图形裁剪练习- 复杂图形裁剪案例解析- 小组合作探究活动5. 图形裁剪的应用:- 裁剪在日常生活与艺术中的应用- 裁剪在工程设计中的实际案例- 创新设计:学生自主设计裁剪图案教学内容按以下进度安排:第一课时:图形裁剪概念引入第二课时:图形裁剪的基本方法第三课时:图形属性的变换第四课时:实践操作与案例分析第五课时:图形裁剪的应用与展示三、教学方法本课程采用多元化的教学方法,旨在激发学生的学习兴趣,提高参与度和主动性。

1. 讲授法:- 对于图形裁剪的基本概念、裁剪方法及几何原理等理论知识,采用讲授法进行教学,确保学生能够系统掌握。

C语言图形编程(五、二维图形变换-02)

C语言图形编程(五、二维图形变换-02)
留中间数据,其实不然,它可以采用递归方式调用同一算法,整个裁剪过程由四级同样的算法组成。每一级相对于窗口的四条边界线之一来剪裁,第一级输出的顶点传送给第二级(即把多边形每个顶点相对于第一条边界线裁剪,所形成
为了方便下次访问,建议你把网址加入以下收藏夹:
当线的一端点位于某一区域时,便将该区域的代码赋予端点。然后根据线从而段两端点代码就能很方便地判断出线段相对于窗口的位置关系,并决定对该线段如何进行裁剪。四位代码中每位(位的顺序由右向左排序)代码的意义如下:
第一位,点在窗口左边界线之左为1,否则为0;
第二位,点在窗口右边界线之右为1,否则为0;
下面介绍线段裁剪算法(编码裁剪法)。
由上面线段相对于窗口的位置的几种情况讨论可以得知,有些线段被窗口边界切割后会产生一条以上的窗口外的线段,而窗口内的线段却只有一条。这一点很重要,它意味着要确定窗口内的线段,只要计算出它位于窗口内的两个端点。丹科恩和伊凡.瑟萨兰德就根据这一思路设计出了线段裁剪的算法。这种算法分为两步:第一步先确定该线段是否整个位于窗口内或全部位于窗口外,若属于这两种情况,则全部保留或全部舍弃;第二步对不属于第一步那两种情况的线段,则被窗口某一边界线分成两部分,再对每一部分进行第一步。具本这两步留舍测试如下进行:延长窗口各边界,将窗口及其周围共划分为九个区域,中央就是所要裁剪的区域。每个区域各用一个四位二进制数组成的代码(即代码中每一位分别为0或1)来表示,如图2-7所示。
第三节 二维裁剪
一、线段裁剪
二、多边形裁剪
第三节 二维裁剪
在二维图形的绘制或显示处理中,有时需要给出或显示某一部分原始图形。这可在适当位置按一定边界范围定义一个矩形区域(即窗口),使窗口内图形为所需部分,将其保留下来作为绘制或显示之用,而窗口边界以外的图形则予以舍弃。这种对二维原始图形的处理称为二维裁剪。

计算机图形学 实验四 二维图形的裁剪

计算机图形学 实验四 二维图形的裁剪

西北农林科技大学实习报告学院名称:理学院专业班级:姓名:学号:课程:计算机图形学实验报告日期:第十五周实验四二维图形的裁剪一、实验目的1)加深直线段的剪裁算法的理解。

2)熟练掌握一种裁剪算法的编程方法。

二、实验步骤1)分析直线段和矩形窗口的位置关系,选定比较合理算法流程。

2)画出程序流程图。

3)编写程序的源程序。

4)编辑源程序并进行调试。

5)进行特殊模式的运行测试,并结合情况进行调整。

三、实验内容1)在编码算法、中点分割算法、Liang-Barsky算法三种中任选一种作为编程模型。

2)编写直线段裁剪的源程序。

3)建议有能力的学生编写多边形裁剪程序。

4)在计算机上编辑编译运行,实现直线段的裁剪。

原理1.直线和窗口的关系:直线和窗口的关系可以分为如下3类:(1)整条直线在窗口内。

此时,不需剪裁,显示整条直线。

(2)整条直线在窗口外,此时,不需剪裁,不显示整条直线。

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

此时,需要求出直线与窗框的交点,并将窗口外的直线部分剪裁掉,显示窗口内的直线部分。

直线剪裁算法有两个主要步骤。

首先将不需剪裁的直线挑出,即删去在窗外的直线。

然后,对其余直线,逐条与窗框求交点,并将窗口外的部分删去。

2.Cohen-Sutherland直线剪裁算法:(1)输入直线段的两端点坐标p1(x1,y1),p2(x2,y2),以及窗口的4条边界坐标,y wt ,y wb,y wl,y wr.(2)对p1,p2进行编码,点p1的编码为code1,点p2的编码为code2.(3)若code1| code2=0,对直线p1p2“简取”之,转(6);否则,若code1& code2≠0,对直线段“简弃”之,转(7);当上述两条均不满足时,进行步骤(4)。

(4)确保p1在窗口外部。

若p1在窗口内,则交换p1和p2的坐标值和编码。

(5)根据p1编码从低位开始寻找值为1的地方,从而确定p1在窗口外的哪一侧,然后求出直线段与相应窗口边界的交点S,并用交点S的坐标值替换p1的坐标值,即在交点S处把线段一分为二,因此可以去掉p1S。

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

“取景器”=窗 口
视区1 视区2 (viewport)
裁剪的目的
判断图形元素是否落在裁剪窗口之内并找出其位
于内部的部分
裁剪处理的基础
图元关于窗口内外关系的判别 图元与窗口的求交 假定条件 矩形裁剪窗口:[xmin,xmax]×[ymin,ymax]
待裁剪点或线段:
• 点裁剪
– 点(x, y)在窗口内的充分必要条件是:
Sutherland-Hodgman算法


思路:将多边形边界作为一个整体,分而治之。将多 边形的各边先相对于窗口的某一条边界进行裁剪,然 后将裁剪结果再与另一条边界进行裁剪,如此重复多 次,便可得到最终结果。 流水线过程(左上右下):左边的结果是上边的开始。 亦称逐边裁 剪算法
– 内侧空间与外侧空间 – 多边形的边与半空间的关系
E
A
A
B B F
三、多边形裁剪
• 错觉:直线段裁剪的组合? 关键:要保持窗口内多边形的边界部分,而且要将窗
框的有关部分按一定次序插入多边形的保留边界之间, 从而使剪裁后的多边形的边仍然保持封闭状态。
• 新的问题:
1)边界不再封闭,需要用窗口边界的恰当部分来封闭 它,如何确定其边界?
2)一个凹多边形可能被裁剪成几个小的多边形,如何 确定这些小多边形的边界?
对余下的另一段重新进行第一步,第二步判断,
直至结束
编码判断
当线段的两个端点的编码的逻辑“与”非零时 ,线段
为显然不可见的。也可以进行“按位与”运算,可知
这两个端点是否同在视区的上、下、左、右; 如code1=0101,code2=0110,则code1&code2=0100,表示 在窗口下方。 问题:显然可见的编码如何判断??
t0
P0 P1 1
t2 t1
t3
3.始边和终边的确定及交点计算:
令 QL= △x QR= △x QB= △y QT= △y DL= x0-xL DR= xR-x0 DB= y0-yB DT= yT-y0
参数交点为: ti= Di / Qi i=L,R,B,T
Qi <0 ti为与始边交点参数
Qi >0
线段的参数表示
x=x0+t△x
y=y0+t△y △x=x1-x0
0<=t<=1 △y=y1-y0
窗口边界的四条边分为两类:始边和终边。
若x 0 x xL为始边,x xR为终边。 若x 0 x xL为终边,x xR为始边。 若y 0 y y B为始边,y yT 为终边。 若y 0 y y B为终边,y yT 为始边。
y
其中k为斜率。上述直线方程与窗口各边界的交点为:
x2 x1
( x x1 ) y1 k ( x x1 ) y1
左:
右: 下: 上:
x xL k y k ( x L x1 ) y1
x xR k y k ( x R x1 ) y1
x min x x max
y min y y max
问题:对于任何多边形窗口,如何判别?
P1 Wyt P3 P2
Wyb
Wxl Wxr
二、线段裁剪
C A
y=yT E y=yB
B
D
线段相对于该窗口的情况有:
x=xL
x=xR
①线段全部位于窗口的内部(A); ②线段全部位于窗口外部(B、C); ③线段的中间部分在窗口内,而二端点在窗口外部 (D); ④线段的一端在窗口内,而另一端在窗口外(E)。
光标看作小的裁剪窗口。)
梁友栋-Barsky算法
设要裁剪的线段是P0P1。 P0P1和窗口边界交于 A,B,C,D四点,见图。 算法的基本思想是从A,B 和P0三点中找出最靠近的 P1点,图中要找的点是P0。 从C,D和P1中找出最靠近 P0的点。图中要找的点是 C点。那么P0C就是P0P1线 段上的可见部分。
例:分别给下列直线段编码,并判断是否需要剪裁。
P2
C2=1010
C
C1=0001
P2
C2=0000
D A P1 P2
C2=0000
P1 B P1
C1=0100 C2=0101
P2
C1=0000
P1
C1=0101
例:Cohen-SutherLand算法过程:
过程: 1)输入线段AB的两端点坐标A(x0,y0)、B(x1,y1),以及裁剪窗口的四 条边界:yt,yb,xl,xr。 2)对AB编码,A的编码codeA=0001,B的编码为codeB=0110。 3)线段AB裁剪的基本过程(按左右下上的顺序): ①由于codeA | codeB≠0,对AB不能全部保留;又因为codeA & codeB=0,对 AB不能全部舍弃,因此要对AB进行求交处理。 ②由codeA=0001知A在窗口左边外侧,按左右下上的顺序求AB与窗口左边 交点为P1,AP1必在窗口外,故裁剪掉,并用A替换P1。如图(b)所示。 (交点替换是为了方便编程循环)。 ③对P1B重复上述处理。A(原P1)编码为0000,B编码为0110;由于A(原 P1)已在窗口内,交换A和B的坐标值与编码,则B编码为0000,A编码变为 0110,按左右下上顺序求得右交点为P3;A(原B)P3必在窗口外,故裁剪掉, 并用A替换P3。如图(c)所示。 ④A的编码还没有达到0000,再求得下边交点为P2,AP2必定在窗口外,故 裁剪掉,并用A替换P2。如图(d)所示。 ⑤对剩下的直线段AB再进行判断,现在A编码为0000,B编码为0000,由于 codeA | codeB=0,全在窗口中,故全部保留。 最后得到裁剪后的线段为AB,算法结束。
1)求出直线P0P1与窗口的交点I,如图(a)所示。
2)取P0 I线段显示,擦除I P1线段,并将P1替换I,即 得P0P1线段,裁剪结束。如图(b)所示。
P0 I
P0 P1
P1
(a) (b)
求线段与窗口交点
P1 设线段两端点坐标为:( x1,y1 ) 和 P2 ( x2,y2 ) 则过这两点 y2 y1 的直线方程为:
二维图形裁剪
裁剪概述
直接求交算法; Cohen-Sutherland算法;(重点,算法实现) 梁友栋-Barsky算法
线段裁剪
多边形裁剪
Sutlerland_Hodgman算法(难点,算法实现)
Weiler-Athenton算法
字符裁剪
一、裁剪概述
裁剪:是裁去窗口之外物体或物体部分的一种操作。
ti为与终边交点参数
当Qi =0时 若Di <0 时,线段不可见
(如图中AB,有QR=0,DR<0)
若Di >0 时, 分析另一D, (如图中的EF就是这种情况,它使QL=0, DL>0和QR=0,DR>0。这时由于EF和x=xL 及x=xR平行,故不必去求出EF和x=xL及 x=xR的交点,而让EF和y=yT及y=yB的交点 决定直线段上的可见部分。)
待裁剪线段和窗口的关系 线段完全可见 显然不可见 线段至少有一端点在窗口之外,但非显然不可见
裁剪
保留
丢弃 为提高效率,算法设计时应考虑: (一)快速判断线段完全在窗口内或外的情形; (二) 设法减少裁剪情形中求交次数和每次求交时所需的计算量。
直接求交算法
基本思想是:判断直线与窗口的位置关系,确定该直 线是完全可见、部分可见或完全不可见,然后输出处 于窗口内线段的端点,并显示此线段。
#define LEFT 1 #define RIGHT 2 #define BOTTOM 4 分区编码方法:图形区域划分成九个区域。 #define TOP 8
编码原则
四位编码 1111 表示端点所处的位置:
1 1 1 1
(--->) 上 下 右 左
第一位为“1”时,表示点在y=yT的上方; 第二位为“1”时,表示点在y=yB的下方;
编码判断
当线段的两个端点的编码的逻辑“与”非零时 ,线段
为显然不可见的。也可以进行“按位于”运算,可知
这两个端点是否同在视区的上、下、左、右; 如code1=0101,code2=0110,则code1&code2=0100,表示 在窗口下方。 问题:显然可见的编码如何判断??
对一条线段的可见性测试方法: (1)若线段两个端点的四位二进制编码全为0000,即两端 点编码逻辑或运算为0,那么该线段完全位于窗口内,可直 接保留; (2)对两端点的四位二进制编码进行逻辑与运算,若结果 不为零,那么整条线段必位于窗口外,可直接舍弃; (3)否则,这条线段既不能直接保留,也不能直接舍弃, 它可能与窗口相交。 此时,需要对线段进行再分割,即找到与窗口边线的一个交 点,根据交点位置,赋予四位二进制编码,并对分割后的线 段按照一定的顺序(如左右下上)进行检查,决定保留、舍 弃或再次进行分割。重复这一过程,直到全部线段均被舍弃 或保留为止。
①若P1P2完全在窗口内,则显示该线段P1P2,简称“取”之;
②若P1P2完全在窗口外,则丢弃该线段,简称“舍”之;
③若线段既不满足“取”的条件,也不满足“舍”的条件,则 求线段与窗口边界的交点,在交点处把线段分为两段,其 中一段完全在窗口外,可舍弃之,然后对另一段重复上述 处理。
核心思想:分区编码和线段分割。
C
y=yT A E y=yB
练习:请给出右图的线 段端点编码(端点编码:
定义为它所在区域的编码)
B
D
x=xL
x=xR
Cohen-Sutherland 算法步骤
第一步 判别线段两端点是否都落在窗口内,如果是,
则线段完全可见;否则进入第二步;
第二步 判别线段是否为显然不可见,如果是,则裁 剪结束;否则进行第三步 ; 第三步 求线段与窗口边延长线的交点,这个交点将 线段分为两段,其中一段显然不可见,丢弃。
相关文档
最新文档