1、二维图形基本问题,二维变换(已学) 窗口与视区 二维裁剪本讲内容 坐标系、窗口与视区 裁剪预备知识(求交) (矩形窗口)裁剪,坐标系,坐标系:建立了图形与数之间的对应联系 世界坐标系(world coordinate) 用户坐标系(user coordinate) 局部坐标系(local coordinate),坐标系,屏幕坐标系(screen coordinate) 设备坐标系(device coordinate),什么是窗口、视区?,窗口 在世界坐标系(WCS)中指定的矩形区域 用来指定要显示的图形 视区 在设备坐标系(屏幕或绘图纸)上指定的矩形区域 用来指定窗口内的图形在屏幕上显示的大小
2、及位置 窗口到视区的变换,世界坐标系(WCS) 用户坐标系(UCS),用户坐标系到观察坐标系的转换,用户Y用户X,观察坐标,用户坐标,用户坐标到观察坐标系的变换矩阵: 将观察坐标原点平移;旋转观察坐标与用户坐标重叠,(X0, Y0),窗口到视区(viewport)的转换,(WXR,WYT),(VXR,VYT),(VXL,VYB),(WXL,WYB),(Xw,Yw),(Xv,Yv),窗口区定义为(WXL,WXR,WYB,WYT), 视区定义为( VXL,VXR,VYB,VYT ) 根据相似性原理,得出计算公式:,随堂练习,设窗口区为window(0.0,1.0,0.0,1.0),视图区为view
3、port(100,400,100,400),有用户坐标点Xw,Yw为(0.5,0.3),求其对应的屏幕坐标Xv,Yv。 已知直线的两个端点坐标,以及一个矩形窗口,试编写程序计算该直线与矩形窗口的交点坐标。,二维图形的显示流程图,2.5 图 形 求 交,在计算机图形学中常常会遇到求交计算。求交运算是比较复 杂的,为了减少计算量,在进行真正的求交计算之前,往往先用 凸包等辅助结构进行粗略地比较,排除那些显然不相交的情形。求交问题可以分为两类:求交点求交线,2.5 图 形 求 交,2.5.1 求交点算法,求交点可以分两种情况,即求线与线的交点以及求线与面的交点。 直线段与直线段的交点 假设两条直线的
4、端点分别为P1、P2和Q1、Q2,则直线可以用向量形式表示为 P(t) = A + Bt, 0t1 Q(s) = C + Ds, 0s1 其中,A=P1,B=P2P1,C=Q1,D=Q2Q1。构造方程A + Bt = C + Ds (2.9)对三维空间中的直线段来说,上述方程组实际上是一个二元一次方程组, 由3个方程式组成。可以从其中两个解出s、t,再用第三个验证解的有效性。 当所得的解(ti, si)是有效解时,可用两个方程之一计算交点坐标,例如 P(ti)=A+Bti。,2.5 图 形 求 交,2.5.1 求交点算法(续),根据向量的基本性质,可直接计算s与t。对方程(2.9)两边构造点积
5、得(CD) (A+Bt) = (CD) (C+Ds)由于CD同时垂直于C和D,等式右边为0。故有类似地有,2.5 图 形 求 交,2.5.1 求交点算法(续), 直线段与二次曲线的交点考虑平面上一条直线与同平面的一条二次曲线的交点。 假设曲线方程为 f(x, y) = 0 直线段方程为 (x, y) = (x1+tdx, y1+tdy) 则在交点处有f(x1+tdx, y1+tdy) = 0 当曲线为二次曲线时,上述方程可写为at2+bt+c = 0 用二次方程求根公式即可解出t值。 圆锥曲线与圆锥曲线的交点在进行一对圆锥曲线的求交时,把其中一条圆锥曲线用代数法或几何法 表示为隐函数形式,另一
6、条表示为参数形式(如二次NURBS曲线)。将参数 形式代入隐函数形式可得到关于参数的四次方程,,2.5 图 形 求 交,2.5.1 求交点算法(续),下面讨论线与面的交点的求法。 直线段与平面的交点,图2.15 线段与平面求交,如图2.15所示。把平面上的点表示为 P(u, w)=A+uB+wC,直线段上的点表 示为Q(t)=D+tE,二者的交点记为R。 假设线段不平行于平面,则它们交于R=P(u, w)=Q(t), 即 A+uB+wC = D+tE,2.5 图 形 求 交,2.5.1 求交点算法(续),等式两边点乘(BC),得(BC) (A+uB+wC) = (BC) (D+tE) 由于BC
7、既垂直于B,又垂直于C,故有(BC) A = (BC) (D+tE)可解出类似求得如果是直线与平面区域求交点,则要进一步判断交点是否在平面的 有效区域中,其算法可参见2.5.3节。,2.5 图 形 求 交,2.5.1 求交点算法(续), 圆锥曲线与平面的交点圆锥曲线与平面求交点时,可以把圆锥曲线表示为参数形式,并 把圆锥曲线的参数形式代入平面方程,即可得到参数的二次方程, 从而进行求解。 圆锥曲线与二次曲面的交点圆锥曲线与二次曲面求交点时,可把圆锥曲线的参数形式代入二 次曲面的隐式方程,得到参数的四次方程,用四次方程求根公式求解。,2.5 图 形 求 交,2.5.2 求交线算法, 平面与平面的
8、交线先考虑最简单的情形。两个平面区域分别由P(u, w),Q(s, t), u,w,s,t0, 1定义。如果它们不共面而且不分离,则必交 于一直线段。这条直线必落在P(u, w)Q(s, t)=0所定义的无限 直线上。这是个含有4个未知数,3个方程式的方程组,只要分别与8条边 界线方程:u=0,u=1,w=0,w=1,s=0,s=1,t=0,t=1联立, 即可求出线段的两个端点的参数。,2.5 图 形 求 交,2.5.2 求交线算法 (续), 平面与二次曲面的交线代数法: 把二次曲面表示为代数形式Ax2+By2+Cz2+2Dxy+2Eyz+2Fxz+2Gx+2Hy+2Iz+J = 0通过平移与
9、旋转坐标变换把平面变为xOy平面,对二次曲面进 行同样的坐标变换。由于在新坐标系下平面的方程为z=0,所以新坐 标系下二次曲面方程中,把含z项都去掉即为平面与二次曲面的交线 方程。对该交线方程进行一次逆坐标变换即可获得在原坐标系下的交 线方程。几何法:几何法存储曲线的类型(椭圆、抛物线或双曲线),以及定 义参数(中心点、对称轴、半径等)的数值信息,使用局部坐标系到 用户坐标系的变换,把局部坐标系下的定义参数变换到用户坐标系 直接使用。当平面与二次曲面的交线需要精确表示时,往往采用几何法求交。,2.5 图 形 求 交,2.5.2 求交线算法 (续),下面以平面球求交为例,说明几何法求交算法。 平
10、面用一个记录p表示,p的两个子域p.b、p.w分别代表平面上一点、 平面法向量。球面用记录s表示,它的两个子域s.c、s.r分别代表 球面中心和半径。则可写出平面与球面相交的算法如下:plane_sphere_intersect(p, s) plane p; sphere s; d=球面中心到平面的有向距离; if(abs(d)=s.r) 2个面相交于一(切)点s.cd*p.w; else if(abs(d)s.r) 两个面无交;,2.5 图 形 求 交,2.5.2 求交线算法 (续),else 所求交线是圆。其圆心、半径、圆所在平面法向量为 c=s.cd*p.w; r=sqrt(s.r2d2
11、); w=p.w; ,2.5 图 形 求 交,2.5.2 求交线算法(续), 平面与参数曲面的交线求平面与参数曲面的交线,最简单的方法是把表示参数曲面的 变量(x(s, t), y(s, t), z(s, t)代入平面方程ax+by+cz+d=0 得到用参数曲面的参数s、t表示的交线方程ax(s, t)+by(s, t)+cz(s, t)+d=0另一种方法是,用平移和旋转对平面进行坐标变换,使平面成为 新坐标系下的xOy平面。再将相同的变换应用于参数曲面方程,得到 参数曲面在新坐标系下的方程(x*, y*, z*)=(x*(s, t), y*(s, t), z*(s, t) 由此得交线在新坐标
12、系下的方程为z*(s, t)=0。,第四讲 二维裁剪,裁剪(clipping),是裁去窗口之外物体或物体部分的一种操作。 求交(交点,交线) 点的裁剪 直线段裁剪 直接求交算法; Cohen-Sutherland(编码裁剪)算法; 中点分割算法 Liang(梁友栋)-Barsky 算法 多边形裁剪 Sutlerland-Hodgman算法 Weiler-Athenton算法 字符裁剪,点的裁剪,任意点P(x,y)在矩形窗口内的条件:wxl=x=wxr & wyb=y=wyt,wxl,wxr,wyb,wyt,直线段裁剪,二维线段裁剪方法 (规则的二维)矩形裁剪窗口 :线段相对于该窗口的情况:线段
13、全部位于窗口的内部(A) 线段全部位于窗口外部(B、C) 线段的中间部分在窗口内,而二端点在窗口外部(D) 线段的一端在窗口内,而另一端在窗口外(E),x=xL,x=xR,y=yB,y=yT,A,B,C,D,E,线段裁剪算法(一) 直接求交算法,(也称Ivan Sutherland算法)核心思想:分区编码和线段分割。分区编码方法:图形区域划分成九个部分。 四位编码 表示端点所处的位置:(-) 上下右左 第一位为“1”时,表示点在y=yT的上方; 第二位为“1”时,表示点在y=yB的下方; 第三位为“1”时,表示点在x=xR的右方; 第四位为“1”时,表示点在x=xL的左方。,线段裁剪算法(二)
14、 Sutherland-Cohen算法(编码裁剪法),1 1 1 1,1111,请分别给下列直线段编码。端点编码:定义为它所在区域的编码。 结论:当线段的两个端点的编码的逻辑“与”非零时 ,线段为显然不可见的。也可以进行“按位与”运算,可知这两个端点是否同在视区的上、下、左、右; 如code1=0101,code2=0110,则code1&code2=0100,表示在窗口下方。 问题;显然可见的编码如何判断?,x=xL,x=xR,y=yB,y=yT,A,B,C,D,E,算法步骤:1确定线段二端点P1和P2的代码值C1和C2(经p1(x1,y1),p2(x2,y2)和xR、xL、yT、yB的一系
15、列的判断比较,分别给代码中的各位赋值)。2对线段的端点进行检测:a)若线段全部在窗口内(c1= 0 且c2 = 0)画线;b)若线段全部在窗口外(c1 and c2 0)画背景线, (将消去该线段),退出;c)否则(c10 or c20 且 c1 and c2 = 0)对线段进行分割,关键是求与窗口四边的交点( 利用直线的两点式方程 ).用背景色画交点与裁剪窗口外的线段,然后重新编码,并继续判断;d)直到该线段的两端点均在裁剪窗口内。,例图:,P1,P2,C1=0001,C2=0000,P1,P2,C1=0100,C2=0100,P1,P2,C1=0101,C2=1010,P1,P2,A,B,
16、C,D,C1=0000,C2=0000,Cohen-SutherLand算法(编码算法),求交测试顺序固定(左上右下) 最坏情形,线段求交四次。,Cohen-SutherLand算法(编码算法),对于那些非完全可见、又非显然不可见的线段,需要 求交(如,线段AD),求交前先测试与窗口哪条边所在 直线有交?(按序判断端点编码中各位的值ClCtCrCb),1)特点:用编码方法可快速判断线段-完全可见和显然不可见。2)特别适用二种场合:大窗口场合;窗口特别小的场合(如, 光标拾取图形时, 光标看作小的裁剪窗口。),中点分割法,算法的思路:采用与前相似的线段端点编码和相应的检查方法,先判定完全可见线段
17、和显然不可见线段。否则,将线段分割成相等的两段,然后对每一小段重复上述的检查,直至找到每段与窗口边界的交点或分割小段的长度充分小,可以视为一点时为止。实际上,这相当于采用对分查找法求交,分割次数最多不超过线段端点的表示精度。,中点分割法,与Cohen-SutherLand算法相似,只不过在第三种情况下是将线段分为均匀两段,分别测试,直至每条线段完全在视区内或视区外。方法:从线段的两个端点分别出发找出与其距离最近的可见边界点。计算最远可见点的算法如下: 1)若在视区内,则即为离最远的可见点,停止;否则继续; 2)若为完全不可见,停止,否则继续; 3)取的中点,若在视区内,则对来寻找的最远可见点,
18、即用代替,转2),否则代替,执行2);,中点分割法,想法:从P0点出发找出距P0最近的可见点,从P1点出发找出距P1最近的可见点。 取中点Pm=(P1+P2)/2。(算法见框图),图例:,P0,P1,Pm1,Pm2,作为当前离p0最远的可见点,算法中的关键点:,求离p0最远的可见点。,新求得的端点必需重新编码(可采用子程序)。,线段的可见否均由端点的编码状态确定(可采用子程序)。,特点:只有加与除2的运算,易于用硬件实现,同时可采用并行算法。,3. Liang(梁友栋)-Barsky 算法 算法的基本思想:从A、B和 P1三点中找出最靠近 P2 的点( P1),从C、D和 P2三点中找 出最靠
19、近 P1的点(C ),则 P1C 就是 P1P2 线段上的可见部分。将被裁剪的线段 P1P2 表示成参数方程形式:xx1xt 其中 xx2x1yy1yt yy2y1,x,y,xL,xR,yB,yT,P1,P2,A,B,C,D,( 0 t 1 ),另外,把窗口的四条边分成二类:始边和终边。 当x0 (或y0)时称 xxL (或yyB)为始边,xxR (或yyT)为终边。 当x0 (或y0)时称 xxL (或yyB)为终边,xxR (或yyT)为始边。 求出P1P2和二条始边的交点的参数t1和t1 令 t1max (t1,t1,0) 则 t1 即为A、B、P1三点中最靠近P2的点的参数。 求出P1
20、P2和二条终边的交点的参数t2和t2 令 t2min (t2,t2,1) 则 t2 即为C、D、P2三点中最靠近P1的点的参数。 当 t2t1时,方程(1)中参数tt1,t2的线段就是P1P2的可见部分。 当 t1t2时,整个线段为不可见。,5.2 多边形裁剪,错觉:直线段裁剪的组合? 关键:要保持窗口内多边形的边界部分,而且要将窗框的有关部分按一定次序插入多边形的保留边界之间,从而使剪裁后的多边形的边仍然保持封闭状态。 新的问题:1)边界不再封闭,需要用窗口边界的恰当部分来封闭它,如何确定其边界?,思路:将多边形的各边先相对于窗口的某一条边界进行裁剪,然后将裁 剪结果再与另一条边界进行裁剪,
21、如此重复多次,便可得到最终结果。 实现方法: 设置二个表输入顶点表(向量)用于存放被裁剪多边形的顶点p1-pm。输出顶点表(线性链表)用于存放裁剪过程中及结果的顶点 q1-qn。 输入顶点表中各顶点要求按一定顺序排列,一般可采用顺时针或逆 时针方向。 相对于裁剪窗口的各条边界,按顶点表中的顺序,逐边进行裁剪。,多边形裁剪:Sutherland-Hodgman算法,多边形的剪裁 (续),具体操作:Pi 若位于边界线的可见一侧,则 Pi 送输出顶点表Pi 若位于边界线的不可见一侧,则将其舍弃。除第一个顶点外,还要检查每一个 Pi 和前一顶点 Pi-1是否位于窗口边界的同一侧,若不在同一侧,则需计算
22、出交点送输出顶点表。最后一个顶点 Pn则还要与 P1 一起进行同样的检查。,p1,p2,p3,p4,p5,q1,q2,q3,q4,2.6 图 形 裁 剪,2.6.2 多边形的剪裁 (续),q5,q6,q7,q8,q1,q2,p3,q7,q8,q5,q6,q4,q3,裁剪前: 裁剪后: 输入顶点表:p1p2p3p4p5 输入顶点表: 不变 输出顶点表: 空 输出顶点表: q1q2p3q7q8q5q6q4q3,算法中相对于各窗口边界的裁剪过程相同,且每次都是相对于前一次的结果进行处理。可采用递归算法,可不保留中间多边形的顶点,而节省数据的存储量,但递归会影响速度。,Sutherland-Hodgm
23、an算法,多边形裁剪,2)一个凹多边形可能被裁剪成几个小的多边形,如何 确定这些小多边形的边界?,2Weiler-Atherton(W-A)算法(双边裁剪法)可以用一个有内孔的凹多边形去裁剪另一个也有内孔的凹多边形。被裁剪的多边形主多边形裁剪区域裁剪多边形 思路:主多边形和裁剪多边形均用它们的顶点表来定义。各多边形的外部边界取顺时针方向,而其内部边界或孔取逆时针方向。主多边形和裁剪多边形的边界若相交,交点必定成对地出现,其中一个交点为主多边形边进入裁剪多边形内部时的交点(称进点),另一个交点则为离开时的交点(称出点)。这两类交点分别用进点表和出点表来存放。,c1,c2,c3,c4,s1,s2,
24、s3,s4,s5,s6,s7,I1,I2,I3,I4,I5,I6,I7,I8,裁剪多边形,主多边形,主多边形 裁剪多边形顶点表 顶点表s1 c1I1 I8I2 I1s2 c2I3 I2s3 I3I4 c3s4 I4I5 I5I6 c4s5 I6I7 I7s6 c1I8s7s1,起点,算法:分别建立主多边形和裁剪多边形的顶点表求出主多边形与裁剪多边形的交点(进点和出点)并分别建立进点表和出点表将交点加入各顶点表中if 进点表为空 then finish 1 取一进点作为始点 2 跟踪主多边形顶点表,直至发现下一交点,复制这一段主多边形顶点到内表中根据交点处指针,转到裁剪多边形顶点表中的相应位置跟
25、踪裁剪多边形顶点表,直至发现下一交点,复制这一段裁剪多边形顶点到内表中if 该交点不是起始点 then 2if 进点表中还有未遍历到的交点 then 1 3 finish,主多边形和裁剪多边形把二维平面分成两部分。 内裁剪:AB 外裁剪:A-B,Weiler-Athenton算法,Weiler-Athenton算法,如果主多边形与裁剪多边形有交点,则交点成对出现,它们被分为如下两类: 进点:主多边形边界由此进入裁剪多边形内 如,I1,I3, I5, I7, I9, I11 出点:主多边形边界由 此离开裁剪多边形区域.如, I0,I2, I4, I6, I8, I10,Weiler-Athent
26、on算法,交点的奇异情况处理 1、与裁剪多边形边重合的主多边形的边不参与求交点; 2、对于顶点落在裁剪多边形的边上的主多边的边,如果落在该裁剪边的内侧,将该顶点算作交点;而如果这条边落在该裁剪边的外侧,将该顶点不看作交点,字符裁剪方法 1. 字符的表示方法点阵字符每个字符用一个位图(掩膜) 来表示,其大小由位图的尺寸来确定,如 7 9,9 16,16 24 等。,1 1 1 1 0 0 0,0 1 0 0 1 0 0,0 1 0 0 1 0 0,0 1 1 1 0 0 0,0 1 0 0 0 0 0,0 1 0 0 0 0 0,0 1 0 0 0 0 0,1 1 1 0 0 0 0,0 0 0
27、 0 0 0 0,P在字库的表示,P的显示结果,矢量字符 选一个正方形网格,作为字符的局部坐标空间,网格的大小可选16 16,32 32,64 64等。每个字符由构成它的笔画组成,每个笔画又由其两端确定。每个端点保存它的坐标值及连线标志。,x,y,o,p1,p2,p3,p4,p5,p6,63,63,字符的编码,x1 y1 0,x2 y2 1,x3 y3 0,x4 y4 1,x5 y5 0,x6 y6 1, 1,0表示不连线,1表示连线,字符结束标志,特点:除用直线段表示笔画外,还可采用二次三次曲线段。对矢量字符的变换是对其端点进行图形的几何变换。,字符的裁剪简单裁剪方法:用点阵字符的掩膜或矢量字符的网格大小作为字符的包 围框,若该包围框在窗口内,则显示字符;否则,不予显示。精确裁剪方法:对于点阵字符,判断组成其笔画的每个像素点是否位于 窗口内。对于矢量字符,对组成其笔画的每条线段进行裁剪。,2.6 图 形 裁 剪,2.6.3 字符串的剪裁,字符串剪裁3种可选择的方法。1.串精度裁剪, 字符精度裁剪, 字符的精密剪裁,