开窗口及二维裁剪

合集下载

二维图形裁剪

二维图形裁剪

te ∈[0,1]
P ( x0 , y0 ) P ( x1 , y1 ) 和矩形窗口下边的交点满足方程组 0 1 x0 + tl ( x1 - x0 ) = xmin + te ( xmax - xmin ) tl ∈[0,1] te ∈[0,1] y0 + tl ( y1 - y0 ) = ymin
P0在窗口内?

Y
P1在窗口内? N 求交点I, P0I既为 可见部分 Exit
Y

如何判断线段是 否显然不可见? 直线与窗口边如 何求交?
N P1在窗口内? Y P=P0 P0=P1 P1=P N P0P1显然不可见? Y N
P0P1完 全可见 Exit
N
P0P1与窗口有交? Y 求交点I0、I1, I0I1既为可见部分 Exit
18
2. Cohen-SutherLand算法-原理

如何判定应该与窗口的哪条边求交呢?

编码中对应位为1的边。
1000
1001
1010
0001
0000
0010
0101
0100
0110
19
2. Cohen-SutherLand算法-原理

按照左、右、下、上的顺序计算线段 P1(x1,y1)P2(x2,y2)与窗口边界的交点:
20
else if(BOTTOM&code !=0)
else if(TOP & code !=0)
2. Cohen-SutherLand算法-描述
BOOL done,draw; /*done: 完成;draw: 可见;*/ Unsigned char code1,code2; /*端点1,端点2的编码*/ While (!done) { if (判断code1,code2,若为第一种情况) { done = TRUE; draw = TRUE; } else if (为第二种情况) { done = TRUE; draw = FALSE; } else if (检查code1 ,若在窗口内) { 交换端点及端点的编码;以左,右,下,上的次序对端 点1进行判断及求交;将交点的值赋给端点1 } }/*End of while*/

图形学之二维裁剪

图形学之二维裁剪

30
主多边形和裁剪多边形把二维平面分成 两部分。 内裁剪:A∩B A 外裁剪:A-B
2010-12-31
Graphics Lab.PKU
31
进点:主多边形边界由此进入裁剪多边 形区域内:I1 I3 I5 I7 I9 I11 出点:I0 I2 I4 I6 I8 I10
2010-12-31
Graphics Lab.PKU
2010-12-31
Graphics Lab.PKU
24
2010-12-31
Graphics Lab.PKU
25
5.2.1 Sutherland-Hodgman算法 Sutherland-Hodgman算法
分割处理:将多边形关于矩形窗口的裁 剪分解为多边形关于窗口四边所在直线 的裁剪。 流水线处理:上边的结果是左边的开始。
第五讲 二维裁剪
基本目的:判断图形元素是否落在窗口 区域之内。 显示部分画面,指定图形内容,窗口系 统。地图显示。 图形编辑 图形裁剪算法,直接影响图形系统的效 率。
2010-12-31 Graphics Lab.PKU 1
二维裁剪
两个步骤:图元在窗口区域内外的判别;图形 元素与窗口的求交; 裁剪 扫描转换: 点阵图形在设备坐标系中进行,算法效率不高, 适合求交难度大的图形。 裁剪 扫描转换:
2010-12-31
Graphi P1
2010-12-31
Graphics Lab.PKU
21
k条边的多边形,可见线段参数区间的解: Ni· (p(t)-Ai)>=0, i=0,…,k, 0≤t ≤1. 即: Ni· (P1-Ai)+ Ni· (P2-P1) t>=0可得:ti=… 线段可见的交点参数: t1=max{0,max{ti: Ni· (P2-P1) >0}} t2=min{1,min{ti: Ni· (P2-P1)<0}} 若 t1<=t2, [t1,t2]是可见线段的交点参数 区间,否则,线段不可见。

二维图形的裁剪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算法思想: 该算法也称为编码算法,首先对线段的两个端点按所在的 区域进行分区编码,根据编码可以迅速地判明全部在窗口内的 线段和全部在某边界外侧的线段。只有不属于这两种情况的线 段,才需要求出线段与窗口边界的交点,求出交点后,舍去窗 外部分。 对剩余部分,把它作为新的线段看待,又从头开始考虑。 两遍循环之后,就能确定该线段是部分截留下来,还是全部舍 弃。

图形学二维裁剪实验报告

图形学二维裁剪实验报告

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

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

三、实验原理:算法源代码: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]);}四、实验总结:裁剪处理的主要步骤是:①图元关于窗口内外关系的判别;②图元与窗口的求交。

第8章开窗口及二维裁剪1

第8章开窗口及二维裁剪1

20
8.2 窗口到视区的变换
由(1),(2)得: Xv= [(xvmax –xvmin) /(xwmax –xwmin)]* (xw –xwmin) + xvmin yv= [(yvmax –yvmin) /(ywmax –ywmin)]* (yw –ywmin) + yvmin 简化: Xv= A·w +B x Yv= C·w +D y 其中:A= (xvmax –xvmin) /(xwmax –xwmin) B=xvmin –xwmin · A C= (yvmax –yvmin) /(ywmax –ywmin) D=yvmin –ywmin · C
23
8.2 窗口到视区的变换

窗口-规格化设备坐标-视区变换
考虑到不同设备有不同的分辨率,
因此,进行窗口-视区变换时应尽可 能得使图形程序设计与设备无关, 将视区设置在规格化设备坐标系中。
yWCS (0.0, 1.0) W yt Sy W yb O WCS (1.0, 1.0) O DCS (0.0, 0.0) (1.0, 0.0) 规格化设备坐标 Vxl Vxr xDC yDC Vyt Vyb (xV , yV) Vx Vy
P2(1000) p'2(1000) P3(0001) p'3(0100) P4(0100)
31
p'1(0010) P2(0010)
8.3 直线裁剪算法

Cohen-Sutherland裁剪算法

直线与窗口边界的交点 因为窗口边界均平行于坐标轴; 设:已知一条端点为(x1,y1)和(x2,y2)的直线: y-y1=m*(x-x1),这里m=(y2-y1)/(x2-x1)) 所以①与窗口边界y=ywmin的交点 x=x1+(ywmin-y1)/m y=ywmax ②与窗口边界y=ywmax的交点 x=x1+(ywmax-y1)/m ③与窗口边界x=xwmin的交点 y=ywmin y=y1+(xwmin-x1)*m ④与窗口边界x=xwmax的交点 y=y1+(xwmax-x1)/m

第六章 二维裁剪

第六章 二维裁剪

(
)
,只有当
是有效交点,即真正落在PoP1和窗口边上而不是它们的延长 线上。
6.1.3 Cohen—Sutherland算法 . . 算法
Cohen—Sutherland裁剪算法有时也称为编码算法 编码算法。该算 编码算法 法分为三个步骤: 第一步判别线段两端是否都落在窗口内,如果是,则线 第一步 段完全可见;否则进入第二步 否则进入第二步,判别线段是否为显然不可见 显然不可见, 否则进入第二步 显然不可见 即线段的两端点均落在窗口某边所在直线的外侧,如果是, 则裁剪结束;否则进行第三步 否则进行第三步,求线段与窗口边延长线的交 否则进行第三步 点,这个交点将线段分为两段,其中一段显然不可见,丢弃。 对余下的另一段重新进行第一步、第二步判断,直至结束。 整个裁剪的过程可以看作一个递归的过程。 为了实现这个算法 实现这个算法,首先用窗口四条边所在的直线(见图 实现这个算法 6.3)将整个二维平面分成 个区域 二维平面分成9个区域 二维平面分成 个区域,每个区域赋予一个四位的 编码 C C C C ,其中各位编码的含义如下:
四 边 被 求 出 的 交 点 顺 序 为 F , I , H , G 。 从 而 在 Cohen— Sutherland裁剪算法中,最坏的情况下, 一条线段在裁剪时需 最坏的情况下, 最坏的情况下 要求交4次 要求交 次 。
程序6.1给出了Cohen—Sutherland裁剪算法 裁剪算法,其中设计 裁剪算法 了一个数据结构 数据结构:Outcode用来记录端点的编码。Outeode中的 数据结构 all元素用来判断是否该端点的编码中4位全是0。算法的运行 过程是这样的:先用函数CompOutcode计算线段两端点的编码, 然后按如上方法判断线段是否为完全可见或显然不可见,如 果不是,则确定位于窗口之外的端点,并根据该端点的编码 值确定它位于窗口哪条边的外侧,求出线段和该边的交点。 以交点为分界,将位于该边外侧的部分线段丢弃,以交点为 新的端点,计算其编码重复上述过程。 例如,图6.4中的线段AD,A点的编码为0000,D点的编 码为1001,AD既非完全可见亦非显然不可见。于是程序中确 定出D点为落于窗口之外的点,它的‘编码值表明它在窗口左 边和上边的外侧。但根据我们假定的测试顺序,AD先与左边 求交,交点为:C,CD段为显然不可见部分,丢弃。以C点为 新的端点,计算其编码为1000。以AC代替AD重复上面过程, 求出AC与上边的交点B,AB即为题中,面对一张大的画面,或者是由于 实际需要,或者是显示屏幕有限,常要求开一个矩形区域 指定要显示的部分画面,这种用来指定图形显示内容的矩 形区域称为裁剪窗口 裁剪窗口。 裁剪窗口 窗口内的图形被显示出来了,而窗口之外的图形则被 裁剪掉。从图形的显示过程知道,任何图形在显示之前都 要经过裁剪工作。因此图形的裁剪和图形的变换一样,直 接影响图形系统的效率。裁剪的方法很多,效率的高低常 与计算机图形硬件水平及图形复杂程度有关,要根据实际 情况来选择合适的裁剪算法。 基本目的是判断这个图形元素是否落在窗口区 裁剪的基本目的 基本目的 域之内,如落在区域之内则进一步求出位于区域内的部分。 因此裁剪处理的基础有两个方面:一是图元在窗口区域内 外的判别,二是图形元素与窗口的求交。

第五章 二维图形的裁剪

第五章 二维图形的裁剪
2010-7-21 计算机图形学 8
5.2.3 Cohen-Sutherland线段裁剪 线段裁剪
它的大概步骤如下所述. 它的大概步骤如下所述. 步骤1 判断线段的两个端点是否都在窗口内,如果是, 步骤 判断线段的两个端点是否都在窗口内,如果是, 则线段完全可见,显示该线段,裁剪结束; 则线段完全可见,显示该线段,裁剪结束;否则进入步 骤2 . 步骤2 判断线段是否为显然不可见,即线段的两个端 判断线段是否为显然不可见, 步骤 点均落在窗口某边所在直线的外侧,如果是, 点均落在窗口某边所在直线的外侧,如果是,删除该线 裁剪结束;否则进入步骤3. 段,裁剪结束;否则进入步骤 . 步骤3 求线段与窗口边所在直线的交点, 步骤 求线段与窗口边所在直线的交点,这个交点将待 裁剪的线段分成两部分,其中一部分显然不可见, 裁剪的线段分成两部分,其中一部分显然不可见,删除 对余下的另一部分线段重复步骤1, ,直至结束. 之;对余下的另一部分线段重复步骤 ,2,直至结束.
(d) 关于窗口右边裁剪
2010-7-21
(e) 关于窗口下边裁剪
16
计算机图形学
5.3.2 Weiler-Atherton算法 算法
在实际应用中,不仅待裁剪多边形是任意的,而且 在实际应用中,不仅待裁剪多边形是任意的, 要求裁剪窗口也需要是任意的,如图5.13所示. 所示. 要求裁剪窗口也需要是任意的,如图 所示
P5 P4 P3
P 1
P2
(a) 待裁剪多边形
(b) 关于窗口左边裁剪
(c) 关于窗口上边裁剪
2010-7-21
计算机图形学
15
5.3.1 Sutherland-Hodgman算法 算法
经窗口的右边裁剪后, 经窗口的右边裁剪后,得到多边形 PPPPPPPP P ,如图 0 1 2 3 4 5 6 7 0 5.12(d)所示;经窗口的下边裁剪后,得到最终的结果多边形 所示; 所示 经窗口的下边裁剪后, P PP P P P P P P ,如图 如图5.12(e)所示. 所示. (e)所示 0 1 2 3 4 5 6 8 0

二维裁剪

二维裁剪
ymax
ymin
(2)判别线段是否为显然不可 xmin xmax 见,如果是,则裁剪结束;否 则进行(3) (3求线段与窗口边(或其延长线)的交点,这个交点将线段 分为两段,其中一段显然不可见,丢弃。 对余下的另一段 重新进行(1),(2)的判断, 直至结束 怎么实现? 特点:对显然不可见线段的快速判别.
多边形裁剪
•对于一个多边形,可以把它分解为边界的线段逐段进行裁剪:
待裁剪的多边形 裁剪结果
但这样做会带来新的问题!
(1)边界不再封闭:
裁剪窗口
(2)一个凹多边形可能被裁剪成几个小的多边形:
如果被裁剪多边形为划线图形,影响还不是很大,但当多边 形作为实区域考虑时,封闭的多边形裁剪后仍应当是封闭的 多边形,以便进行填充。 所以需要考虑如何确定裁剪后所的到的再显示区域内的(一个 或多个)多边形的边界。 可见把多边形的裁剪仅看成是直线段裁剪的组合是错误的。
多边形裁剪算法思想(Sutherland-Hodgman):
参数化算法(Cyrus-Beck)
• 考虑凸多边形区域R和直线段P1P2参数方程 P(t)=P1 +(P2-P1)×t • 设A是区域R的边界上 R 一点,N是区域边界在 A点的内法线向量
N A P(t)
P2
P1
参数化算法(Cyrus-Beck)
则对于线段P1P2上任一点P(t) • N· (P(t)-A)<0
中点分割裁剪算法
• Cohen-Sutherland算法中需要计算线段与窗口边的交点。 • 中点分割:把直接求交用二分查找取代。 • 基本思想 与Cohen-Sutherland算法一样首先对线段端点进行编码,并 把线段与窗口的关系分为三种情况, 1.完全可见线段 2.显然不可见线段 3.其他情况:分割成相等的两段,对每一段重复上述检查直到 找到每段与窗口边的交点或分割子段长度充分小可以视为一 点为止。

计算机图形学 第6章 开窗口及二维裁剪

计算机图形学 第6章 开窗口及二维裁剪
第6章 开窗口及二维裁剪 章
应用程序中所定义的画面均以世界坐标系表示, 应用程序中所定义的画面均以世界坐标系表示,这些画面要映射到 设备坐标系才可以显示出来。 设备坐标系才可以显示出来。在显示器上可以只选择一个显示区域观察 一幅画面,也可以同时选择若干显示区域观察若干幅画面。 一幅画面,也可以同时选择若干显示区域观察若干幅画面。把用一观察 窗口有选择地显示物体地某一部分称为开窗口技术, 窗口有选择地显示物体地某一部分称为开窗口技术,如果要求删除显示 区域之外的画面部分则称为裁剪。 区域之外的画面部分则称为裁剪。
二、区域码裁剪算法 端点间关系 线段与窗口关系
明显在窗口外, 若code1 & code2≠0,P1P2明显在窗口外,则“弃” ,
1001
1000
1010
code1: 0101
&
0001
ቤተ መጻሕፍቲ ባይዱ
0000
0010
code2: 0100
0101
P2
0100
0110
0100
P1
6.2.2 Cohen-Sutherland直线裁剪算法
6.1.3 窗口在图形显示中的应用
1.利用开窗口技术,可灵活地在屏幕上显示一景物的不同部分、改变窗 利用开窗口技术,可灵活地在屏幕上显示一景物的不同部分、 利用开窗口技术 口及视区的大小和位置,可使显示的图形发生变化。 口及视区的大小和位置,可使显示的图形发生变化。 2.对于一个显示物体可定义多个窗口及多个视区,这样可多方位、多侧 对于一个显示物体可定义多个窗口及多个视区,这样可多方位、 对于一个显示物体可定义多个窗口及多个视区 面观察一个物体。 面观察一个物体。
6.2.3 中点分割算法
基本思想: 点出发找出离P 最近的可见点,和从P 基本思想:从P0点出发找出离P0最近的可见点,和从P1点出发找 出离P 最近的可见点。 出离P1最近的可见点。这两个可见点的连线就是原线段的可见部 分。 Cohen-Sutherland算法一样首先对线段端点进行编码 算法一样首先对线段端点进行编码, 与Cohen-Sutherland算法一样首先对线段端点进行编码,并把线 段与窗口的关系分为三种情况,对前两种情况,进行一样的处理; 段与窗口的关系分为三种情况,对前两种情况,进行一样的处理; 对于第三种情况,用中点分割的方法求出线段与窗口的交点。 对于第三种情况,用中点分割的方法求出线段与窗口的交点。A、 分别为距P 最近的可见点,Pm为 中点。 B分别为距P0 、 P1最近的可见点,Pm为P0P1中点。

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

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

①若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,算法结束。

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

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

左: xy x kL (xLx1)y1 k
右: xy x kR (xRx1)y1 k
下: x y xy1B(1/k)(yBy1) k 0
上: x y xy1T(1/k)(yTy1) k 0
h
11
Cohen-Sutherland 算法 (编码算法)
基本思想:对于每条待裁剪的线段P1P2分三种情况处理: ①若P1P2完全在窗口内,则显示该线段P1P2,简称“取”之; ②若P1P2完全在窗口外,则丢弃该线段,简称“舍”之; ③若线段既不满足“取”的条件,也不满足“舍”的条件,则
h
3
“取景器”=窗 口
视区1 视区2 (viewport)
h
4
裁剪的目的 判断图形元素是否落在裁剪窗口之内并找出其位 于内部的部分
裁剪处理的基础 图元关于窗口内外关系的判别 图元与窗口的求交
假定条件 矩形裁剪窗口:[xmin,xmax]×[ymin,ymax] 待裁剪点或线段:
h
5
• 点裁剪
– 点(x, y)在窗口内的充分必要条件是:
y=yB
0101 0100 0110
x=xL x=xR
h
13
编码方法
每个区域赋予一个四位编码,CtCbCrCl,上下右左;
1 当yymax Ct 0 else
1 当xxmax Cr 0 else
1 当yymin Cb 0 else
1 当xxmin Cl 0 else
C
y=yT
练习:请给出右图的线 段端点编码(端点编码:
h
9
例1 设有直线段P0P1,有一个矩形裁剪窗口,写出 对该线段裁剪的算法。
1)求出直线P0P1与窗口的交点I,如图(a)所示。 2)取P0 I线段显示,擦除I P1线段,并将P1替换I,即

计算机图形学基础教程(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
二维直线段的裁剪
直线的裁剪是二维图形裁剪的基础 裁剪的实质是判断直线是否与窗口相交,如相 交则进一步确定位于窗口内的部分

第6章2二维观察及裁剪

第6章2二维观察及裁剪

求交:假定直线的端点坐标为(x1,y1)和(x2,y2) 左、右边界交点的计算:
上、下边界交点的计算:
A
实交点 H
I 虚交点
实交点
G
F 窗口 虚交点 JD
实交点
E
B
虚交点
C
算法的步骤:
(1)边输界入坐直标线:段w的y两t、端w点yb坐、标wx:l和pw1(xx1r,。y1)、p2(x2,y2),以及窗口的四条
A
1
G
B
H
D
C2 E
输入:ABCDEFGH 输出:12DEFGHA
(a)用左边界裁剪
A

1
G
F
H
D
F
3
4
5
6
2
E
输入: 12DEFGHA
输出:34D56FGHA1
(b)用下边界裁剪
A 1
H
3
4
G
1
K
8
D 7
56
F 3
A
G
J I9 8
H
D
7
4
56
输入: 34D56FGHA1 输出:4D5678GHA13
DC
备坐标系
的变换
在图形 设备上 输出
图6-19 两维观察流程
• 变焦距效果
3 21 (a) 原图及变化的窗口
1
(b)与窗口对应 的视区1
2
(c)与窗口对应 的视区2
3
(d)与窗口对应 的视区3
图6-20 变焦距效果(窗口变、视区不变)
• 整体放缩效果
(d)视区3
(b) 视区1
(c) 视区2
(a) 原图及窗口

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。

计算机图形学第八章开窗口及二维裁剪

计算机图形学第八章开窗口及二维裁剪

8.1.2 窗口与视区
考察一个图形时,采用两种模型:
•物理模型,它是用户在世界坐标系中描述物体的图形; •逻辑模型,也就是在显示器上呈现的物体的图形.它是
在设备坐标系中描述的。
世界坐标系中描述物体的图形可能相当复杂:
•只能在显示器上显示局部的内容,以使用户能清晰地观
察其细节部分
•用户可能只对图形的某一区域感兴趣,因此也只需要显
从窗口到视区的变换中包括比例及平移两种变换。
窗口到视区的变换
窗口—视区变换也可以通过组合变换实现: ①在世界坐标系Owxwyw中,平移使(xwmin,ywmin)至坐标 原点,变换为T(-xwmin,-ywmin)。 ②缩放使窗口的大小和视区相等,变换为: ③在设备坐标系Ovxvxv中,平移使窗口与视区重合,变换 为T(xvmin, yvmin)。
xvmax -xvmin yvmax - yvmin S( , ) xwmax -xwmin ywmax -么,窗口—视区变换可表示为:
NWCDC T(xvmin , yvmin ) S( xvmax - xvmin yvmax - yvmin , ) T(xwmin , ywmin ) xwmax - xwmin ywmax - ywmin
•显示器屏幕的直角坐标系,原点在左上角,x轴向右为 正,y轴向下为正,长度以光栅单位(两个像素之距)为单
位。
•绘图仪、数字化仪这类设备的坐标系,原点在设备台面 的左下角,x轴向右为正,y轴向上为正,长度单位是设
备的步距。
规格化设备坐标系
第四种坐标系称为规格化设备坐标系(NDC: Normalized Device Coordinates)。NDC是一种虚拟的坐 标系,它与具体设备无关,其坐标值在0~1之间。NDC将 WC与DC联系起来,使两种坐标系间建立一一对应的关 系,用户在用WC描述物体图形时,能在具体的图形设备 上正确输出。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

6.1.1 坐标系
在最后变换为特定设备坐标之前,图形系统需要将世界坐标位置变 换为规范化设备坐标位置。这样可使系统独立于可能使用的特定工 作站的各种设备。
图中,初始建模坐标位置(xmc,ymc)变换为设备坐标位置(xdc, ydc),其系列为
6.1.2 窗口与视区
窗口:用户在世界坐标系中指定的局部区域,通常是矩形区域。 开窗口:指定或选取一个区域。 视区:在屏幕上指定一个较小的矩形区域,用于显示窗口内的图形, 这个在屏幕上的矩形区域称为视区,它是用规格化设备坐标系进行 描述的。
6.3.1 Sutherland-Hodgman算法
• 算法实现

窗口的一条边以及延长线构成的裁剪线把平面分成两个部分 多边形的各条边的两端点S、P与裁剪线的位置关系有四种
(1)输出顶点P (2)无输出
(3) 输出交点I
(4) 输出I和P
6.3.1 Sutherland-Hodgman算法
(1)
6.2.2 Cohen-Sutherland直线裁剪算法
一、区域码建立
1 Ct 0 1 Cb 0 1 Cr 0 1 Cl 0
当y y max else 当y y min else 当x x max else 当x x min else
• code1=0001,P1在窗口左边,计算线
P4
0101 0100 0110
段与窗口左边界的交点P3; • code2=0100,P2在窗口下方,用窗口 下边界与线段求交点P4;
P2
6.2.2 Cohen-Sutherland直线裁剪算法
二、区域码裁剪算法 如何判定应该与窗口的哪条边求交呢? 编码中对应位为1的边。 •计算线段P1(x1,y1)P2(x2,y2)与窗口边界的交点 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);} }
6.2.2 Cohen-Sutherland直线裁剪算法
一、区域码建立 区域码:表示直线端点相对位置的4位二进制代码。 区域码按照端点与窗口边界的相对编码,即区域码的4位 分别代表端点位于窗口的上、下、左、右。 区域,码从右到左的各位所代表的坐标区如下:
6.2.2 Cohen-Sutherland直线裁剪算法
6.2.1直线裁剪的基本原理
裁剪的目的 判断图形元素是否落在裁剪窗口之内并找出其位于内部的部分 裁剪的处理的基础 图元关于窗口内外关系的判别 图元与窗口的求交 假定条件 矩形裁剪窗口:[xmin,xmax]X[ymin,ymax] 待裁剪线段:

P0 ( x0 , y0 ) P ( x1 , y1 ) 1
一、区域码建立
-编码方法:
由窗口四条边所在直线把二维平面分成9个区域,每个区域赋予一 个四位编码——CtCbCrCl(上下右左);代码每位用0或1来表示,并 且规定:
在窗口上边线之上,第4位为1,否则第4位为0; 在窗口下边线之下,第3位为1,否则第3位为0; 在窗口右边线之右,第2位为1,否则第2位为0; 在窗口左边线之左,第1位为1,否则第1位为0;

P0
A Pm B P1
6.2.3 中点分割算法
• 从P0出发找距离P0最近可见点采用中点分割方法 – 先求出P0P1的中点Pm, – 若P0Pm不是显然不可见的,并且P0P1在窗口中有可见部分,则 距P0最近的可见点一定落在P0Pm上,所以用P0Pm代替P0P1; – 否则取PmP1代替P0P1。 – 再对新的P0P1求中点Pm。重复上述过程,直到PmP1长度小于给 定的控制常数为止,此时Pm收敛于交点。 • 从P1出发找距离P1最近可见点采用上面类似方法。
6.2 直线裁剪算法
裁剪的含义 为了能看到计算机内部存储数据量比较大的图形的各个局部细节。 在放大显示一幅图形的一部分区域时,必须确定图形中哪些部分落在 显示区之内,哪些落在显示区之外,以便显示落在显示区内的那部分 图形。这个选择过程称为裁剪。 裁剪的实质 决定图形中哪些点、线段、文字、以及多边形在窗口 之内。
6.3.2 Weiler-Atherton算法
6.4 文本裁剪
图形包中的文本生成方法不同,可能有多种不同的裁剪方法。 (1)对于标准字符,一般把字符作为一个整体裁剪 (2)用线段组成的字符,可用直线裁剪方法裁剪。 文本的裁剪可分为:
以串为单位的裁剪
以字符为单位的裁剪 矢量裁剪
6.4.1 以串为单位的裁剪
6.2.2 Cohen-Sutherland直线裁剪算法
Cohen-Sutherland算法思想:对于每条线段P1P2,分为3种情况 处理: (1)若P1P2完全在窗口内,则显示该线段P1P2,简称取之 (2)若P1P2明显在窗口外,则丢弃该线段P1P2,简称弃之 (3)若线段既不满足“取”的条件,也满足“弃”的条件, 则把线段分成两段。其中一段完全在窗口外,可弃之。然 后对另一段重复上述处理。
第6章 开窗口及二维裁剪
6ቤተ መጻሕፍቲ ባይዱ1 开窗口及裁剪的基本概念 6.2 直线裁剪算法
6.3 多边形裁剪
6.4 文本裁剪
6.1 开窗口及裁剪的基本概念
6.1.1 坐标系
组成图形的最基本元素是点,而点的位置通常是在一个坐标系 中定义的。图形系统中所使用的坐标系是人们广为熟悉的直角 坐标系,也称笛卡儿坐标系。 1.建模坐标系(MC) 依物体而建,物体在其中的表示相对简单,易于描述。是直角 右手坐标系,长度单位由用户自定,取值范围是整个实数域。 2.世界坐标系(WC) 单个物体的形状一旦被指定以后,需要将其放入到场景的适当 位置,场景是采用世界坐标系描述的。是直角右手坐标系,长 度单位由用户自定,取值范围是整个实数域。

字符串裁剪: 把整个字符串作为整体来处理:或者全部显示,或者全部不显 示。测试时可以选用整个字符界框。
6.4.2 以字符为单位的裁剪

字符裁剪: 每个字符被一个称为字符框的矩形所包围,然后以这个框和窗 口进行比较,如果这个框在窗口内,则显示此字符。

6.3.2 Weiler-Atherton算法
6.3.2 Weiler-Atherton算法
6.3.2 Weiler-Atherton算法
1、建立主多边形和裁剪多边的顶点表. 2、求主多边形和裁剪多边形的交点,并将这些交点按顺序插入两多边形的 顶点表中。在两多边表形顶点表中的相同交点间建立双向指针 。 3、裁剪:如果存在没有被跟踪过的交点,执行以下步骤:
二、区域码裁剪算法
端点间关系

线段与窗口关系
若code1 & code2≠0,P1P2明显在窗口外,则“弃”
1001
1000
1010
code1: 0101
&
0001
0000
0010
code2: 0100
0101
P2
0100
0110
0100
P1
6.2.2 Cohen-Sutherland直线裁剪算法
(2)
(3)
(4)
输出I1和P2
输出P3
输出I2
无输出
结果:上述算法仅用一条裁剪边对多边形进行裁剪,得到一个顶点 序列,作为下一条裁剪边处理过程的输入。
6.3.1 Sutherland-Hodgman算法
算法需要附加空间以存放各保留点。为了减小存储空间,可把整个裁 剪程序划分为若干部分,每一部分对一个窗口边界进行裁剪,裁剪得 到的窗口内的点略去不再传送。只有在对所有边均作处理后才把保留 点存放起来。 在所裁剪的多边形是一个凹多边形时,最后裁剪生成的区域可能存在 两个或多个不相连接的多边形。
6.3.2 Weiler-Atherton算法
裁剪窗口为任意多边形(凸、凹、带内环)的情况:
主多边形:被裁剪多边形,记为A 裁剪多边形:裁剪窗口,记为B

6.3.2 Weiler-Atherton算法
多边形顶点的排列顺序(使多边形区域位于有向边的左侧 ) 外环:逆时针 ;内环:顺时针 主多边形和裁剪多边形把二维平面分成两部分。 内裁剪:A∩B 外裁剪:A-B
P0
A Pm B P1
6.2.3 中点分割算法
6.3 多边形裁剪
• 错觉:直线段裁剪的组合? • 新的问题:边界不再封闭,需要用窗口边界的恰当部分来封闭
它,如何确定其边界?
6.3.1 Sutherland-Hodgman算法


基本思想:每次用窗口的一条边裁剪多边形 流水线过程(左上右下):前边的结果是后边的输入
6.2.3 中点分割算法
基本思想:从P0点出发找出离P0最近的可见点,和从P1点出发找 出离P1最近的可见点。这两个可见点的连线就是原线段的可见部 分。 与Cohen-Sutherland算法一样首先对线段端点进行编码,并把线 段与窗口的关系分为三种情况,对前两种情况,进行一样的处理; 对于第三种情况,用中点分割的方法求出线段与窗口的交点。A、 B分别为距P0 、 P1最近的可见点,Pm为P0P1中点。
6.2.1直线裁剪的基本原理

点裁剪

点(x, y)在窗口内的充分必要条件是:
x min x x max
y min y y max
6.2.1直线裁剪的基本原理

待裁剪线段和窗口的关系 线段完全可见 显然不可见 线段至少有一端点在窗口之外,但非显然不可见
相关文档
最新文档