?xm?(x1?x2)/2?(x1i?x2i)/2ym?(y1?y2)/2?(y1i?y2i)/2?x2i?x1?x2?x1iy2i?y1?y2?y1ivoid SymmetryBresenhamLine(int x1,int y1,int x2,int y2) { int x,y,dx,dy,p,xmin,ymin,xmax,ymax; xmin=min(x1,x2); xmax=max(x1,x2); ymin=min(y1,y2); ymax=max(y1,y2); x=xmin; y=ymin; dx=xmax-xmin; dy=ymax-ymin; if(dx>dy) { p=2*dy-dx; for(;(x+x)<=(xmin+xmax);x++) { SetPixel(x,y,RGB(0,0,0)); SetPixel((xmin+xmax)-x,(ymin+ymax)-y,RGB(0,0,0)); if(p>=0) { y++; p+=2*(dy-dx); } else { p+=2*dy; } } } else { p=2*dx-dy; for(;(y+y)<=(ymin+ymax);y++) { SetPixel(x,y,RGB(0,0,0)); SetPixel((xmin+xmax)-x,(ymin+ymax)-y,RGB(0,0,0)); if(p>=0) { x++; p+=2*(dx-dy);
} else { p+=2*dx; } } } }
当Δx和Δy有最大公因数c,而且Δx/c为偶数和Δy/c为奇数时,和当Δx是2Δy的整数倍时,对称性算法画出的线与Bresenham直线算法画出的线不一致。
例如:端点为(0,0)和(4,3)的线段(Δx/c为偶数和Δy/c为奇数) 用Bresenham直线算法画线 (0,0)(1,1)(2,2)(3,2)(4,3) 用对称性算法画线
(0,0)(4,3)(1,1)(3,2)(2,2)(2,1)
端点为(0,0)和(6,3)的线段(Δx是2Δy的整数倍) 用Bresenham直线算法画线 (0,0)(1,1)(2,1)(3,2)(4,2)(5,3)(6,3) 用对称性算法画线
(0,0)(6,3)(1,1)(5,2)(2,1)(4,2)(3,2)(3,1)
6.推广本章第二节给出的Bresenham画圆算法使能够画出一个内部填充的实心圆。 填充实心圆算法
y y=-x y=x x
void SolidBresenhamCircle(int x0,int y0,int R,COLORREF color) { int x,y,p,i; x=0; y=R; p=3-2*R; for(;x<=y;x++) { for(i=-x;i<=x;i++) { SetPixel(x0+i,y0+y,color); SetPixel(x0+i,y0-y,color); } for(i=-y;i<=y;i++) { SetPixel(x0+i,y0+x,color); SetPixel(x0+i,y0-x,color); } if(p>=0) { p+=4*(x-y)+10; y--; } else { p+=4*x+6; }
} }
7.设像本章第二节那样要画出圆心在原点,半径为R,从点(0,R)开始顺时针走向的1/8圆弧,可采用如下循环内已经没有乘法的算法:
(1)[准备] e←1-R,u←l,v←1-2R,x←0,y←R; (2)[逐点画圆] 若x≥y到(3),否则做: a)画点(x,y),x←x+1, u←u +2;
b)若e<0则v←v +2,e←e + u,否则v←v +4,e←e +v,y←y -1; c)返回步(2)开头。
(3)[结束]若x=y则画点(x,y)后结束,否则直接结束。
试以R=10为例分别运行Bresenham算法和这个算法,验证关系p=2e+1,然后解释这个算法所依据的理由。
以R=10为例分别运行Bresenham算法和这个算法,有 (1) Bresenham算法 x=0,y=10,p=-17 x=1,y=10,p=-11 x=2,y=10,p=-1 x=3,y=10,p=13 x=4,y=9,p=-5 x=5,y=9,p=17 x=6,y=8,p=11 x=7,y=7,p=13
x y p (x,y) 0 10 -17 (0,10) 1 10 -11 (1,10) 2 10 4 5 6 7
(2) 题中算法
x=0,y=10,e=-9,u=1,v=-19 x=1,y=10,e=-6,u=3,v=-17 x=2,y=10,e=-1,u=5,v=-15 x=3,y=10,e=6,u=7,v=-13 x=4,y=9,e=-3,u=9,v=-9 x=5,y=9,e=8,u=11,v=-7 x=6,y=8,e=5,u=13,v=-3 x=7,y=7,e=6,u=15,v=1
9 9 8 7 -1 5 17 11 13 (2,10) (4,9) (5,9) (6,8) (7,7) 3 10 13 (3,10)
x y e u 1 3 5 7 9 v (x,y) 0 10 -9 1 10 -6 2 10 -1 3 10 6 4 5 6 7 9 9 8 7 -3 -19 (0,10) -17 (1,10) -15 (2,10) -13 (3,10) -9 -7 -3 1 (4,9) (5,9) (6,8) (7,7) 8 11 5 13 6 15
通过例子可以看出p=2e+1
算法的依据:p的初值为奇数(p=3-2*R),而p的每次增量都为偶数, p+=4*(x-y)+10; p+=4*x+6;
所以p在整个计算过程中始终为奇数。于是当p=2e+1时,有 p≥0当且仅当e≥0;p<0当且仅当e<0(实际上p不可能为0) 所以,p与e有相同的符号,可以作为判别式使用。 将p=2e+1代入到pi?1?pi??p,有
2ei?1?1?2ei?1??p
整理得
ei?1?ei??p/2?ei??e
所以,有
?e??p/2
当e≥0(p≥0)时,
v??e??p/2?(4*(x?y)?10)/2?2*(x?y)?5; (1)
当e<0(p<0)时,
u??e??p/2?(4*x?6)/2?2*x?3。 (2)
起点为(0,R),所以v的初值为v?2*(0?R)?5??2*R?5(由程序中的初始化v←1-2R和循环中的v←v +4完成);u的初值为u?2*0?3?3(由程序中的初始化u←1和循环中的u←u +2完成)。
再讨论v和u的增量。根据等式(1)和(2),当e≥0(p≥0)时,x增1,y减1,则v递增4,u递增2;当e<0(p<0)时,x增1,y不变,则v递增2,u递增2。所以得到题设中的算法。
8.本章第三节叙述了使用活跃边表的多边形扫描转换算法中ET表的填写方法。试写
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库计算机图形学课后题答案--许长青、许志闻(2)在线全文阅读。
相关推荐: