计算机图形学_复习整理(2)

来源:互联网 发布:三网合一短信端口 编辑:程序博客网 时间:2024/05/21 10:49

此文章整理内容为基本图形的生成算法,包括:直线的扫面转化算法(中点画线法、Bresenham算法)、区域填充算法、裁剪算法。

直线的扫描转换算法——中点画线算法 


基本思想:假设斜率k的范围是0<k<1,当前点为P(Xp,Yp),下一个像素点为P1,或者P2,P1P2的中点为M(Xp+1,Yp+0.5)。对于直线(X0,Y0)~(X1,Y1)构造理想直线F(x)=ax+by+c=0,Q为理想直线与X=Xp+1的交点,将M点的坐标代入直线方程,构造判别式d=F(Mx,My)。若d<=0,说明M点在Q下方则P2为下一点;若d>0,说明M点在Q上方则P1为下一点。

计算:

F(x)=ax+by+c=0,其中a=Y0-Y1,b=X1-X0,c=X0Y1-X1Y0,

设确定Pi(xi,yi)位置时判别式的值为di,计算d的增量,分为两种情况当di≥0时di+1= di+a;当d<0时;di+1=di+a+b;

计算d的初始值,d1=F(X0,Y0)+a+0.5b=a+0.5b;

注意:判断时只需要判断d的正负性,为了避免浮点运算用2d进行计算。

 

直线的扫描转换算法——Bresenham算法

 

基本思想:如图所示,当前点为(Xi,Yi),下一点不是(Xi+1,Ya)就是(Xi+1,Yb)根据判断d=L1-L2的正负性,则可知下一点的取值。若d>=0,即L1>=L2说明直线上的理论点靠近点(Xi+1,Yb),点(Xi+1,Yb)为下一点;若d<0,即L1<L2说明直线上的理论点靠近点(Xi+1,Ya),点(Xi+1,Ya)为下一点。

计算d的初始值和增量:设yp= kxi+1+ b,则:

     L1 = yp – ya= kxi+1+ b – ya;

     L2 = yb – yp= ya + 1 – kxi+1– b;

     di+1 = L1 – L2= 2k(xi+1) – 2ya + 2b – 1

= 2△y/△x(xi+1) – 2yi + 2b – 1

令e’= d*△x,则初值e’1= 2△y –△x

 

增量        

e’i+1 = 2△yxi – 2△xyi +2△y + △x(2b – 1)

         e’i= 2△yxi-1 – 2△xyi-1 +2△y + △x(2b – 1)

         则△e’ = e’i+1-e’

                     = 2△y – 2△x(yi– yi-1)

区域填充算法——边标志算法

基本原理:首先用一种特殊的颜色在帧缓冲器中将多边形的边界(水平边的部分边界除外)勾画出来。然后再把位于多边形内的各个像素着上所需的颜色。

算法:

以值为boundary-color的特殊颜色勾画多边形P的边界(结合直线扫描转换算法实现),并控制每一条扫描线上着上这种特殊颜色的点的个数是偶数(参见活化边表算法中的左闭右开,下闭上开:若对边界上所有像素进行填充则会扩大填充区域);

设inside是一布尔变量,初始值为false。对每一条扫描线从左到右进行搜索,如果当前像素颜色为boundary-color ,则令inside =! inside ;如果inside为true,则对当前像素赋填充颜色,否则该像素赋背景颜色。


裁剪

为什么多边形的裁剪不能简单的用线段裁剪方式实现?

会使封闭的多边形变成不封闭的或者离散的线段。

 

编码裁剪:

基本思想:

对于每条线段P1P2分为三种情况处理分为三种情况处理:

1.        若P1P2完全在窗口内,则显示该线段;

2.        若P1P2明显在窗口外,则丢弃该线段;

3.        若线段不满足①或②的条件,则在窗口(或其延长线)与线段的交点处把线段分为两段。其中一段完全在窗口外,可弃之;然后对另一段重复上述处理。

算法:

1.        对线段的两个端点P1、P2进行按其所处的位置进行编码,分别记为code1、code2;

2.        如果code1=0且code2=0,说明线段在窗口内,全部可见;否则到③;

3.        若code1&code2≠0,则说明线段在某一窗口边的延长线的外侧,全部不可见;否则到④;

4.        在线段与窗口延长线的交点处把线段分为两段,并对两段分别编码。其中交点看作是两个点,一个在与之相交的窗口延长线外侧,一个在内侧。两段线段分别进行①~④的判断过程,则其中一段必然符合③的条件,可弃之;另一段重复①~④的处理,直到剩余部分的线段完全可见或完全不可见。

 

逐次多边形裁剪

基本思想:一次用窗口的一条边裁剪多边形。

算法的输入是以顶点序列表示的多边形,用P1,P2,P3……PN表示把P1连接到P2,P2连接到P3,……,最后把PN连接到P1所构成的多边形。算法输出也是一个定点序列,构成一个或多个多边形。

考虑以窗口的一条边及其延长线构成的裁剪线,该线把平面分成两部分,即可见区域与不可见区域。考虑多边形各边的两个端点S,P与裁剪线的关系,可以分为四种情况:同可见,同不可见,S可见P不可见,S不可见P可见。针对以上四种情况有以下输出结果:输出P,输出0个端点,输出SP与裁剪线的交点,输出裁剪线的交点和P。

仅用一条裁剪边处理多边形的裁剪后得到的顶点序列用作下一条裁剪边的输入,以相同的过程处理完所有裁剪边则得到一个裁剪后的完整多边形。

0 0
原创粉丝点击