77范文网 - 专业文章范例文档资料分享平台

计算机图形学课后题答案--许长青、许志闻(4)

来源:网络收集 时间:2018-12-17 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

(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)在线全文阅读。

计算机图形学课后题答案--许长青、许志闻(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/366940.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: