计算机图形学实验zbuffer算法Word文件下载.docx
- 文档编号:16911168
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:12
- 大小:33.80KB
计算机图形学实验zbuffer算法Word文件下载.docx
《计算机图形学实验zbuffer算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机图形学实验zbuffer算法Word文件下载.docx(12页珍藏版)》请在冰豆网上搜索。
i++)
{
P[i]=p[i];
}
PNum=m;
CreateBucket()//创建桶表
intyMin,yMax;
yMin=yMax=P[0].y;
PNum;
i++)//查找多边形所覆盖的最小和最大扫描线
if(P[i].y<
yMin)
{
yMin=P[i].y;
//扫描线的最小值
}
if(P[i].y>
yMax)
yMax=P[i].y;
//扫描线的最大值
for(inty=yMin;
y<
=yMax;
y++)
if(yMin==y)//建立桶头结点
HeadB=newCBucket;
//建立桶的头结点
CurrentB=HeadB;
//CurrentB为CBucket当前结点指针
CurrentB->
ScanLine=yMin;
pET=NULL;
//没有连接边链表
next=NULL;
else//建立桶的其它结点
next=newCBucket;
CurrentB=CurrentB->
next;
ScanLine=y;
CreateEdge()//创建边表
CurrentB=HeadB;
intj=(i+1)%PNum;
//边的第二个顶点,P[i]和P[j]构成边
P[j].y)//边的终点比起点高
Edge=newCAET;
Edge->
x=P[i].x;
//计算ET表的值
yMax=P[j].y;
k=(P[j].x-P[i].x)/(P[j].y-P[i].y);
//代表1/k
pb=P[i];
//绑定顶点和颜色
pe=P[j];
while(CurrentB->
ScanLine!
=P[i].y)//在桶内寻找该边的yMin
{
CurrentB=CurrentB->
//移到yMin所在的桶结点
}
if(P[j].y<
P[i].y)//边的终点比起点低
x=P[j].x;
yMax=P[i].y;
k=(P[i].x-P[j].x)/(P[i].y-P[j].y);
=P[j].y)
}
if(int(P[j].y)!
=P[i].y)
CurrentE=CurrentB->
pET;
if(CurrentE==NULL)
CurrentE=Edge;
CurrentB->
pET=CurrentE;
else
while(CurrentE->
next!
=NULL)
{
CurrentE=CurrentE->
}
CurrentE->
next=Edge;
Gouraud(CDC*pDC)//填充多边形
doubleCurDeep=0.0;
//当前扫描线的深度
doubleDeepStep=0.0;
//当前扫描线随着x增长的深度步长
doubleA,B,C,D;
//平面方程Ax+By+Cz+D=0的系数
CVectorV21(P[1],P[2]),V10(P[0],P[1]);
CVectorVN=V21*V10;
A=VN.X();
B=VN.Y();
C=VN.Z();
D=-A*P[1].x-B*P[1].y-C*P[1].z;
DeepStep=-A/C;
//计算直线deep增量步长
CAET*T1,*T2;
HeadE=NULL;
for(CurrentB=HeadB;
CurrentB!
=NULL;
CurrentB=CurrentB->
next)
for(CurrentE=CurrentB->
CurrentE!
CurrentE=CurrentE->
x=CurrentE->
x;
yMax=CurrentE->
yMax;
k=CurrentE->
k;
pb=CurrentE->
pb;
pe=CurrentE->
pe;
AddEt(Edge);
EtOrder();
T1=HeadE;
if(T1==NULL)
return;
while(CurrentB->
ScanLine>
=T1->
yMax)//下闭上开
T1=T1->
HeadE=T1;
if(HeadE==NULL)
return;
if(T1->
T2=T1;
T1=T2->
while(T1!
if(CurrentB->
T2->
next=T1->
T1=T2->
T2=T1;
CRGBCa,Cb,Cf;
//Ca、Cb代边上任意点的颜色,Cf代表面上任意点的颜色
Ca=Interpolation(CurrentB->
ScanLine,HeadE->
pb.y,HeadE->
pe.y,HeadE->
pb.c,HeadE->
pe.c);
Cb=Interpolation(CurrentB->
next->
BOOLFlag=FALSE;
doublexb,xe;
//扫描线的起点和终点坐标
for(T1=HeadE;
T1!
T1=T1->
if(Flag==FALSE)
xb=T1->
CurDeep=-(xb*A+CurrentB->
ScanLine*B+D)/C;
//z=-(Ax+By-D)/C
Flag=TRUE;
xe=T1->
for(doublex=xb;
x<
xe;
x++)//左闭右开
Cf=Interpolation(x,xb,xe,Ca,Cb);
if(CurDeep>
=ZB[ROUND(x)+Width/2][CurrentB->
ScanLine+Height/2])//如果新采样点的深度大于原采样点的深度
{
ZB[ROUND(x)+Width/2][CurrentB->
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;
next)//边的连续性
T1->
x=T1->
x+T1->
}
deleteHeadB;
deleteHeadE;
deleteCurrentE;
deleteCurrentB;
deleteEdge;
AddEt(CAET*NewEdge)//合并ET表
CAET*CE;
CE=HeadE;
if(CE==NULL)
HeadE=NewEdge;
CE=HeadE;
else
while(CE->
CE=CE->
CE->
next=NewEdge;
EtOrder()//边表的冒泡排序算法
intCount=1;
T1=HeadE;
if(T1==NULL)
return;
if(T1->
next==NULL)//如果该ET表没有再连ET表
//桶结点只有一条边,不需要排序
while(T1->
=NULL)//统计结点的个数
Count++;
T1=T1->
for(inti=1;
Count;
i++)//冒泡排序
x>
T1->
x)//按x由小到大排序
T2=T1->
T2->
next=T1;
HeadE=T2;
else
if(T1->
x==T1->
x)
if(T1->
k>
k)//按斜率由小到大排序
T2=T1->
T1->
T2->
HeadE=T2;
while(T1->
T1->
if(T1->
T2->
T1->
T1=T2->
CRGBCZBuffer:
Interpolation(doublet,doublet1,doublet2,CRGBc1,CRGBc2)//线性插值
CRGBc;
c=(t-t2)/(t1-t2)*c1+(t-t1)/(t2-t1)*c2;
returnc;
InitDeepBuffer(intwidth,intheight,doubledepth)//初始化深度缓冲
Width=width,Height=height;
ZB=newdouble*[Width];
Width;
ZB[i]=newdouble[Height];
for(i=0;
i++)//初始化深度缓冲
for(intj=0;
j<
Height;
j++)
ZB[i][j]=double(depth);
四、程序结果截图
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 图形学 实验 zbuffer 算法