计算机图形学实验z-buffer算法

上传人:cn****1 文档编号:544437211 上传时间:2023-10-09 格式:DOCX 页数:10 大小:39.72KB
返回 下载 相关 举报
计算机图形学实验z-buffer算法_第1页
第1页 / 共10页
计算机图形学实验z-buffer算法_第2页
第2页 / 共10页
计算机图形学实验z-buffer算法_第3页
第3页 / 共10页
计算机图形学实验z-buffer算法_第4页
第4页 / 共10页
计算机图形学实验z-buffer算法_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《计算机图形学实验z-buffer算法》由会员分享,可在线阅读,更多相关《计算机图形学实验z-buffer算法(10页珍藏版)》请在金锄头文库上搜索。

1、实验六9-7一、实验题目z-buffer算法的代表性案例是绘制三个相互交叉的红绿蓝条,如图9-85所示,请使用MFC编程实现。二、实验思想Z-Buffer算法建立两个缓冲器: 深度缓冲器,用以存储图像空间中每一像素相应的深度值,初始化为最大深度值(zs坐标)。 帧缓冲器,用以存储图像空间中的每个像素的颜色,初始化为屏幕的背景色。 帧缓冲器初始值置为背景色。 确定深度缓冲器的宽度、高度和初始深度。一般将初始深度置为最大深度值。 对于多边形表面中的每一像素(xs,ys),计算其深度值zs(xs,ys)。 将zs(xs,ys)与存储在z缓冲器中该位置的深度值zBuffer(xs,ys)进行比较。 如

2、果zs(xs,ys)zBuffer(xs,ys),则将此像素的颜色写入帧缓冲器,且用z(xs,ys)重置zbuffer(xs,ys)。三、实验代码CZBuffer:CZBuffer()delete P;void CZBuffer:SetPoint(CPi3 p,int m)P=new CPi3m; for(int i=0;im;i+)Pi=pi;PNum=m;void CZBuffer:CreateBucket()/创建桶表int yMin,yMax;yMin=yMax=P0.y;for(int i=0;iPNum;i+)/查找多边形所覆盖的最小和最大扫描线if(Pi.yyMax)yMax=P

3、i.y;/扫描线的最大值for(int y=yMin;yScanLine=yMin;CurrentB-pET=NULL;/没有连接边链表CurrentB-next=NULL;else/建立桶的其它结点CurrentB-next=new CBucket;CurrentB=CurrentB-next;CurrentB-ScanLine=y;CurrentB-pET=NULL;CurrentB-next=NULL;void CZBuffer:CreateEdge()/创建边表for(int i=0;iPNum;i+)CurrentB=HeadB;int j=(i+1)%PNum;/边的第二个顶点,P

4、i和Pj构成边if(Pi.yx=Pi.x;/计算ET表的值Edge-yMax=Pj.y;Edge-k=(Pj.x-Pi.x)/(Pj.y-Pi.y);/代表1/kEdge-pb=Pi;/绑定顶点和颜色Edge-pe=Pj;Edge-next=NULL;while(CurrentB-ScanLine!=Pi.y)/在桶内寻找该边的yMinCurrentB=CurrentB-next;/移到yMin所在的桶结点if(Pj.yx=Pj.x;Edge-yMax=Pi.y;Edge-k=(Pi.x-Pj.x)/(Pi.y-Pj.y);Edge-pb=Pi;Edge-pe=Pj;Edge-next=NUL

5、L;while(CurrentB-ScanLine!=Pj.y)CurrentB=CurrentB-next;if(int(Pj.y)!=Pi.y)CurrentE=CurrentB-pET;if(CurrentE=NULL)CurrentE=Edge;CurrentB-pET=CurrentE;elsewhile(CurrentE-next!=NULL)CurrentE=CurrentE-next;CurrentE-next=Edge;void CZBuffer:Gouraud(CDC *pDC)/填充多边形doubleCurDeep=0.0;/当前扫描线的深度doubleDeepStep=

6、0.0;/当前扫描线随着x增长的深度步长doubleA,B,C,D;/平面方程Ax+By+CzD=0的系数CVector V21(P1,P2),V10(P0,P1);CVector VN=V21*V10;A=VN.X();B=VN.Y();C=VN.Z();D=-A*P1.x-B*P1.y-C*P1.z;DeepStep=-A/C;/计算直线deep增量步长CAET *T1,*T2;HeadE=NULL;for(CurrentB=HeadB;CurrentB!=NULL;CurrentB=CurrentB-next)for(CurrentE=CurrentB-pET;CurrentE!=NUL

7、L;CurrentE=CurrentE-next)Edge=new CAET;Edge-x=CurrentE-x;Edge-yMax=CurrentE-yMax;Edge-k=CurrentE-k;Edge-pb=CurrentE-pb;Edge-pe=CurrentE-pe;Edge-next=NULL;AddEt(Edge);EtOrder();T1=HeadE;if(T1=NULL)return;while(CurrentB-ScanLine=T1-yMax)/下闭上开T1=T1-next;HeadE=T1;if(HeadE=NULL)return;if(T1-next!=NULL)T2

8、=T1;T1=T2-next;while(T1!=NULL)if(CurrentB-ScanLine=T1-yMax)/下闭上开T2-next=T1-next;T1=T2-next;elseT2=T1;T1=T2-next;CRGB Ca,Cb,Cf;/Ca、Cb代边上任意点的颜色,Cf代表面上任意点的颜色Ca=Interpolation(CurrentB-ScanLine,HeadE-pb.y,HeadE-pe.y,HeadE-pb.c,HeadE-pe.c);Cb=Interpolation(CurrentB-ScanLine,HeadE-next-pb.y,HeadE-next-pe.y

9、,HeadE-next-pb.c,HeadE-next-pe.c);BOOL Flag=FALSE;double xb,xe;/扫描线的起点和终点坐标for(T1=HeadE;T1!=NULL;T1=T1-next)if(Flag=FALSE)xb=T1-x;CurDeep=-(xb*A+CurrentB-ScanLine*B+D)/C;/z=-(Ax+By-D)/CFlag=TRUE;elsexe=T1-x;for(double x=xb;x=ZBROUND(x)+Width/2CurrentB-ScanLine+Height/2)/如果新采样点的深度大于原采样点的深度ZBROUND(x)+

10、Width/2CurrentB-ScanLine+Height/2=CurDeep;/xy坐标与数组下标保持一致pDC-SetPixel(ROUND(x),CurrentB-ScanLine,RGB(Cf.red*255,Cf.green*255,Cf.blue*255);CurDeep+=DeepStep;Flag=FALSE;for(T1=HeadE;T1!=NULL;T1=T1-next)/边的连续性T1-x=T1-x+T1-k;delete HeadB;delete HeadE;delete CurrentE;delete CurrentB;delete Edge;void CZBuf

11、fer:AddEt(CAET *NewEdge)/合并ET表CAET *CE;CE=HeadE;if(CE=NULL)HeadE=NewEdge;CE=HeadE;elsewhile(CE-next!=NULL)CE=CE-next;CE-next=NewEdge;void CZBuffer:EtOrder()/边表的冒泡排序算法CAET *T1,*T2;int Count=1;T1=HeadE;if(T1=NULL)return;if(T1-next=NULL)/如果该ET表没有再连ET表return;/桶结点只有一条边,不需要排序while(T1-next!=NULL)/统计结点的个数Count+;T1=T1-next;for(int i=1;iCount;i+)/冒泡排序T1=HeadE;if(T1-

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号