(xi,yi) (xi+1,yi)
dH
dD
(xi+1,yi-1)
x2y2?a2??1?x??a2b2?b?y??a2 ?2(1)
根据(1)式修改Bresenham算法
adH?(xi?1)2?(yi)2?a2b?a?dD?a?(xi?1)??(yi?1)??b?a22Pi?dH?dD?2(xi?1)?2(2yi2?2yi?1)?2a2b(2)
2aPi?1?2(xi?1?1)2?2(2yi2?1?2yi?1?1)?2a2ba22?2(xi?2)?2(2yi2?1?2yi?1?1)?2a2ba22?P?Pi?1?Pi?2(2xi?3)?22(yi?1?yi?1?yi2?yi)b222a2若P,yi?1),Pi?1?Pi?4xi?6?42(1?yi) i?0,即dH?dD,选(xi?1b若P,yi),Pi?0,即dH?dD,选(xi?1i?1?Pi?4xi?6
a2a2?2 起点(0,b),x1?0,y1?b,代入(2)式,得到P1?2?2bb情况(2)如图
(xi-1,yi+1) dD
dH
(xi,yi+1)
(xi,yi)
x2y2?b?22??1??x??y?b 22ab?a?根据(3)式修改Bresenham算法
2(3)
bdH?(xi)2?(yi?1)2?b2a?b?dD?b??(xi?1)??(yi?1)2?a?b2Pi?dH?dD?2(2xi2?2xi?1)?2(yi?1)2?2b2a(4)
2bPi?1?2(2xi2?1?2xi?1?1)?2(yi?1?1)2?2b2ab2?2(2xi2?1?2xi?1?1)?2(yi?2)2?2b2ab22?P?Pi?1?Pi?22(xi?1?xi?1?xi2?xi)?2(2yi?3)a22b2若P,yi?1),Pi?1?Pi?42(1?xi)?4yi?6 i?0,即dH?dD,选(xi?1a若Pi?0,即dH?dD,选(xi,yi?1),Pi?1?Pi?4yi?6
b2b2?2 起点(a,0),x1?a,y1?0,代入(4)式,得到P1?2?2aa整理成算法如下:
void BresenhamEllipse(int x0,int y0,int a, int b){ int x,y; double p;
x=0; y=b; p=2-a*a*(2*b-1)/(double)(b*b); for(;b*b*x<=a*a*y;x++){ SetPixel(x0+x,y0+y,RGB(0,0,0)); SetPixel(x0-x,y0+y,RGB(0,0,0)); SetPixel(x0+x,y0-y,RGB(0,0,0)); SetPixel(x0-x,y0-y,RGB(0,0,0)); if(p>=0){ p+=4*x+6+4*a*a*(1-y)/(double)(b*b); y--; }else{ p+=4*x+6; } } x=a; y=0; p=2-b*b*(2*a-1)/(double)(a*a); for(;b*b*x>a*a*y;y++){ SetPixel(x0+x,y0+y,RGB(0,0,0)); SetPixel(x0-x,y0+y,RGB(0,0,0)); SetPixel(x0+x,y0-y,RGB(0,0,0)); SetPixel(x0-x,y0-y,RGB(0,0,0)); if(p>=0){ p+=4*y+6+4*b*b*(1-x)/(double)(a*a); x--; }else{ p+=4*y+6; } } }
11.修改整数Bresenham画线段算法,使能产生实线、虚线或点划线。 void DotBresenhamLine(int x1,int y1,int x2,int y2,unsigned long mask) { int x,y,dx,dy,p,xmin,ymin,xmax,ymax,lx,ly,deltax,deltay; unsigned long newmask,tmpmask; int newmasklen,i; dx=x2-x1; dy=y2-y1; newmask=Mask(mask,dx,dy); newmasklen=MaskLength(newmask); xmin=min(x1,x2); xmax=max(x1,x2); ymin=min(y1,y2);
ymax=max(y1,y2); lx=xmax-xmin; ly=ymax-ymin;
deltax= (dx==0)?0:(dx>0?1:-1); deltay= (dy==0)?0:(dy>0?1:-1); x=x1; y=y1; if(lx>ly) { p=2*dy-dx; for(i=0;x!=x2+deltax;x+=deltax,i=(i+1)%newmasklen) { tmpmask=(newmask>>(newmasklen-1-i))&1; if(tmpmask==1) SetPixel(x,y,RGB(0,0,0)); if(p>=0) { y+=deltay; if(tmpmask==1) SetPixel(x,y,RGB(0,0,0)); p+=2*(ly-lx); } else { p+=2*ly; } } } else { p=2*dx-dy; for(i=0;y!=y2+deltay;y+=deltay,i=(i+1)%newmasklen) { tmpmask=(newmask>>(newmasklen-1-i))&1; if(tmpmask==1) SetPixel(x,y,RGB(0,0,0)); if(p>=0) { x+=deltax; if(tmpmask==1) SetPixel(x,y,RGB(0,0,0)); p+=2*(lx-ly); }
else { p+=2*lx; } } } }
unsigned long Mask(unsigned long mask,int dx,int dy) { int masklen,newmasklen,i; unsigned long newmask=0; double ratio,j; masklen=MaskLength( mask); ratio=sqrt(dx*dx+dy*dy)/(double)max(abs(dx),abs(dy)); newmasklen=(int)(masklen/ratio+0.5); for(j=0,i=0;i<=newmasklen;j+=ratio,i++) { int tmp=(int)(j+0.5); if(((1< int MaskLength(unsigned long mask) { int len,masklen,i; unsigned long bit=1; len=sizeof(unsigned long)*8; for(i=0,bit<<=(len-1);(mask&bit)==0;bit>>=1,i++); masklen=len-i; return (masklen); } void WideBresenhamLine(int x1,int y1,int x2,int y2,int w,unsigned long mask) { int x,y,dx,dy,p,deltax,deltay,ddx,ddy,lx,ly; int x11,y11,x12,y12; double m,tmp; dx=x2-x1; dy=y2-y1; m=sqrt(dx*dx+dy*dy); tmp=w/m; 百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库计算机图形学课后题答案--许长青、许志闻(4)在线全文阅读。
相关推荐: