19-凸多面体消隐_第1页
19-凸多面体消隐_第2页
19-凸多面体消隐_第3页
19-凸多面体消隐_第4页
19-凸多面体消隐_第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1凸多面体消隐算法内容大纲1消隐简介2Roberts消隐算法3Roberts消隐程序设计1消隐简介投影变换失去深度信息,往往导致图形的二义性:消除二义性,在绘制时消除实际不可见的线和面,称为消隐。比较早期闻名的隐藏线消除算法。消除凸多面体被自身遮挡的边和面。2Roberts消隐算法算法思想:根据平面法向量和投影方向确定自隐藏面。2Roberts消隐算法假设平面方程为aix+biy+ciz+di=0(i=1,2,3,4,5,6)使各平面法向量(ai,bi,ci)方向指向多面体外部外法向量1)平面法向量的计算2Roberts消隐算法1)平面法向量的计算(x1,y1,z1)法向量(x2,y2,z2)(x3,y3,z3)

a=(y2-y1)(z3-z1)-(y3-y1)(z2-z1)b=(z2-z1)(x3-x1)-(z3-z1)(x2-x1)c=(x2-x1)(y3-y1)-(x3-x1)(y2-y1)voidvector(intx[],inty[],intz[],float&a,float&b,float&c){a=((float)y[1]-y[0])*(z[2]-z[0])-(y[2]-y[0])*(z[1]-z[0]);b=((float)z[1]-z[0])*(x[2]-x[0])-(z[2]-z[0])*(x[1]-x[0]);c=((float)x[1]-x[0])*(y[2]-y[0])-(x[2]-x[0])*(y[1]-y[0]);floatL=(float)(sqrt(a*a+b*b+c*c));a=a/L,b=b/L,c=c/L;}设投影方向为(Xp,Yp,Zp)投影方向与平面外法向量夹角大于900,(ai,bi,ci)·(Xp,Yp,Zp)<0,此面可见投影方向与平面外法向量夹角小于900,(ai,bi,ci)·(Xp,Yp,Zp)>0,此面不可见2Roberts消隐算法2)消影算法【例1】设投影面为XOY面,投影方向从(0,0,10)到(1,1,-12),即(1,1,-2),绘制消隐后的投影图。2Roberts消隐算法y3645712xz6

40x'=x-(xp/zp)z=x+0.5zy'=y-(yp/zp)z=y+0.5z先计算斜平行投影后的8个点:01234567xy【例1】设投影面为XOY面,投影方向从(0,0,10)到(1,1,-12),即(1,1,-2),绘制消隐后的投影图。0321面:(0,0,-1)·(1,1,-2)=2

不可见4567面:(0,0,1)·(1,1,-2)=-2

可见1265面:(1,0,0)·(1,1,-2)=

1不可见0154面:(0,-1,0)·(1,1,-2)=-1可见0473面:(-1,0,0)·(1,1,-2)=-1可见2376面:(0,1,0)·(1,1,-2)=

1不可见2Roberts消隐算法01234567xy【例2】设正方体绕y轴旋转φ=45o,绕x轴旋转θ=45o正投影到XOY面,绘制消隐后的投影图。2Roberts消隐算法XYZ0123456750x’=xcosφ+zsinφ=0.7x+0.7zy’=xsinφsinθ+ycosθ-zcosφsinθ=0.5x+0.7y-0.5z法向量a=(y2-y1)(z3-z1)-(y3-y1)(z2-z1)b=(z2-z1)(x3-x1)-(z3-z1)(x2-x1)c=(x2-x1)(y3-y1)-(x3-x1)(y2-y1)投影方向:(0,0,-1)或(0,0,1)则(0,0,-1)(a,b,c)<0可见

变为c>0可见或c<0可见【例2】设正方体绕y轴旋转φ=45o,绕x轴旋转θ=45o正投影面到XOY面,绘制消隐后的投影图。2Roberts消隐算法40123567x’=0.7x+0.7zy’=0.5x+0.7y-0.5z0点:(0,0,0)1点:(50,0,0)2点:(50,50,0)3点:(0,50,0)4点:(0,0,50)5点:(50,0,50)6点:(50,50,50)7点:(0,50,50)(0,0)(35,25)(35,60)(0,35)(35,-5)(70,0)(70,35)(35,10)【例2】设正方体绕y轴旋转φ=45o,绕x轴旋转θ=45o正投影面到XOY面,绘制消隐后的投影图。2Roberts消隐算法40123567c=(x2-x1)(y3-y1)-(x3-x1)(y2-y1)x1y1x2y2x3y3

0321面:0(0,0),3(0,35),2(35,60)c<0不可见4567面:4(35,-5),5(70,0),6(70,35)c>0可见1265面:1(35,25),2(35,60),6(70,35)c<0不可见0154面:0(0,0),1(35,25),5(70,0)c<0不可见0473面:0(0,0),4(35,-5),7(35,10)c>0可见2376面:2(35,20),3(0,35),7(35,10)c>0可见【例3】已知正方体,投影面为

XOY面,设视点位置为(0,0,200),平移(100,100,0),绘制消隐后的一点透视投影图。2Roberts消隐算法y3645712xz6

100H=1-z/h-dz/h=1-z/600x’=(x+dx)/H=(x+100)/(1-z/200)y’=(y+dy)/H=(y+100)/(1-z/200)0点:(0,0,0)1点:(100,0,0)2点:(100,100,0)3点:(0,100,0)4点:(0,0,100)5点:(100,0,100)6点:(100,100,100)7点:(0,100,100)(100,100)(200,100)(200,200)(100,200)(200,200)(400,200)(400,400)(200,400)01234567XY0【例3】已知正方体,投影面为

XOY面,设视点位置为(0,0,200),平移(100,100,0),绘制消隐后的一点透视投影图。2Roberts消隐算法法向量投影方向0321面:(0,0,-1)·(100-0,100-0,

0-200)>0不可见4567面:(0,0,1)·(100-0,100-0,100-200)<0可见1265面:(1,0,0)·(200-0,100-0,0-200)>0不可见0154面:(0,-1,0)·(100-0,100-0,

0-200)<0可见0473面:(0,-1,0)·(100-0,100-0,

0-200)<0

可见2376面:(0,1,0)·(200-0,200-0,0-200)>0不可见01234567voidPolyhedraClearHiddle1(CDC*pDC,intx[],inty[],intz[],intpn,intPLine[],intLFaceS[],intLFaceE[],intfn,intxp,intyp,intzp,intdx,intdy,COLORREFcolor){intxx[50],yy[50];floata,b,c;for(inti=0;i<pn;i++)//循环所有点进行斜投影变换xx[i]=x[i]-(float)xp/zp*z[i]+dx,yy[i]=y[i]-(float)yp/zp*z[i]+dy;for(i=0;i<fn;i++) //循环所有面

{intj=LFaceS[i];

vector(&x[PLine[j]],&y[PLine[j]],&z[PLine[j]],a,b,c);

//计算第i个面的法向量if(a*xp+b*yp+c*zp<0)//判定第i个面是否可见for(intj=LFaceS[i];j<LFaceE[i];j++)Line_DDA(pDC,xx[PLine[j]],yy[PLine[j]],xx[PLine[j+1]],yy[PLine[j+1]],color);}}①斜平行投影消隐3Roberts消隐程序设计②正轴测投影消隐voidPolyhedraClearHidde2(CDC*pDC,intx[],inty[],intz[],intpn,intPLine[],intLFaceS[],intLFaceE[],intfn,floatcx,floatcy,intdx,intdy,COLORREFcolor){intxx[50],yy[50];for(inti=0;i<pn;i++)//循环所有点进行正轴测变换

xx[i]=x[i]*cos(cy)+z[i]*sin(cy)+dx, yy[i]=x[i]*sin(cy)*sin(cx)+y[i]*cos(cx)-z[i]*cos(cy)*sin(cx)+dy;for(i=0;i<fn;i++)//循环所有面

{intj=LFaceS[i]; floatc=(float)(xx[PLine[j+1]]-xx[PLine[j]])*(yy[PLine[j+2]]-yy[PLine[j]]) -(xx[PLine[j+2]]-xx[PLine[j]])*(yy[PLine[j+1]]-yy[PLine[j]]); if(c>0) //判定第i个面是否可见

for(intj=LFaceS[i];j<LFaceE[i];j++) Line_DDA(pDC,xx[PLine[j]],yy[PLine[j]],xx[PLine[j+1]],yy[PLine[j+1]],color); }}3Roberts消隐程序设计③一点透视投影消隐3Roberts消隐程序设计voidPolyhedraClearHidde3(CDC*pDC,intx[],inty[],intz[],intpn,intPLine[],intLFaceS[],intLFaceE[],intfn,inth,intdx,intdy,intdz,COLORREFcolor){intxx[50],yy[50],zz[50],xp,yp,zp,xs,ys,xe,ye;floatx1[50],y1[50],z1[50],x2[50],y2[50],z2[50],H;for(inti=0;i<pn;i++)xx[i]=x[i]+dx,yy[i]=y[i]+dy,zz[i]=z[i]+dz;//平移变换for(i=0;i<fn;i++){intj=LFaceS[i];

vector(&x[PLine[j]],&y[PLine[j]],&z[PLine[j]],a,b,c);

//计算第i个面的法向量

xp=xx[PLine[j]],yp=yy[PLine[j]],zp=zz[PLine[j]]-h;//计算投影方向if(a*xp+b*yp+c*zp<0)//判定第i个面是否可见for(intj=LFaceS[i];j<LFaceE[i];j++){H=1-(float)zz[PLine[j]]/h,xs=xx[PLine[j]]/H,ys=yy[PLine[j]]/H;//透视投影变换

H=1-(float)zz[PLine[j+1]]/h,xe=xx[PLine[j+1]]/H,ye=yy[PLine[j+1]]/H;Line_DDA(pDC,xs,ys,xe,ye,color); }}}voidSphereClearHidde(CDC*pDC,intx0,inty0,intz0,intr,floatdu,floatdv,floatcx,floatcy,floatcz,intdx,intdy,COLORREFcolor){floatuu[4],vv[4],x[5],y[5],z[5],xx[5],yy[5],zz[5],aa,bb,cc;for(floatu=-1.57;u<=1.57;u=u+du)for(floatv=0;v<=6.28;v=v+dv){uu[0]=u,vv[0]=v,uu[1]=u+du,vv[1]=v,uu[2]=u+du,vv[2]

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论