您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 其它文档 > 计算机图形学实验报告
1计算机图形学课程设计设计名称正四面体学号092055103学生张彬2目录1项目描述·····················32任务配置····················33效果图······················34原理························45算法························56源代码······················57总结······················103项目描述本项目使用计算机图形学的知识,在屏幕是绘制一个四个面涂上不同颜色的正四面体,并且正四面体绕着其中一个顶点转动。任务配置本程序使用VisualC++6.0,建立一个基于单文档的的项目。效果图4原理本程序的原理为先确定原始的正四面体的4个顶点,然后对其进行3维变换,再对其进行透视变化,然后将3维坐标转换为2维坐标,再判断每个面是否可见对其进行动态消影。再将其画到屏幕上。程序使用了双缓冲,并且使用定时器对坐标进行改变。算法对坐标进行3维转换的坐标为先绕x转,再绕y转,最后绕z转,(这3个矩阵可以参考计算机图形学基础教程110面)将3个矩阵相乘可得ZH[0][0]=cos(b)*cos(c);ZH[0][1]=cos(b)*sin(c);ZH[0][2]=-sin(b);ZH[1][0]=cos(c)*sin(a)*sin(b)-cos(a)*sin(c);ZH[1][1]=sin(c)*sin(a)*sin(b)+cos(c)*cos(a);ZH[1][2]=sin(a)*cos(b);ZH[2][0]=cos(a)*sin(b)*cos(c)+sin(a)*sin(c);ZH[2][1]=cos(a)*sin(b)*sin(c)-cos(c)*sin(a);ZH[2][2]=cos(a)*cos(b);,对其进行透视变换时乘以矩阵(这个矩阵可以参考计算机图形学基础教程123面),将θ,φ都设置为45度,矩阵如下TZ[0][0]=-sqrt(2)/2;TZ[0][1]=-0.5;TZ[0][2]=-0.5;TZ[0][3]=0;TZ[1][0]=sqrt(2)/2;TZ[1][1]=-0.5;TZ[1][2]=-0.5;TZ[1][3]=0;TZ[2][0]=0;TZ[2][1]=sqrt(2)/2;TZ[2][2]=-sqrt(2)/2;TZ[2][3]=0;TZ[3][0]=0;TZ[3][1]=0;TZ[3][2]=700;TZ[3][3]=1;将3维坐标转换为2维坐标时,使用公式x=x1/z1*d,y=y1/z1*d;对其进行动态消隐时,则在平面上取两个向量做差乘,获得其法向量,然后与视向量做5数量级,并对其结果判断,大于0则画出该面,否则不画出该面。另外在框架类里对界面做了改动,去掉了工具栏和状态栏,并且改变了应用程序图标。源代码1.View中得代码CForYuView::CForYuView(){SHU=TRUE;yu[0]=TRUE;yu[1]=TRUE;yu[2]=TRUE;yu[3]=TRUE;AI=100.0;a=0.1;b=0.2;c=0.3;F3D[0][0]=4;F3D[0][1]=0;F3D[0][2]=0;F3D[0][3]=1;F3D[1][0]=AI;F3D[1][1]=0;F3D[1][2]=0;F3D[1][3]=1;F3D[2][0]=AI/2;F3D[2][1]=0;F3D[2][2]=AI/2*sqrt(3);F3D[2][3]=1;F3D[0][0]=AI/2;F3D[0][1]=AI*sqrt(6)/3;F3D[0][2]=AI/6*sqrt(3);F3D[0][3]=1;ZH[0][0]=1;ZH[0][1]=0;ZH[0][2]=0;ZH[0][3]=0;ZH[1][0]=0;ZH[1][1]=1;ZH[1][2]=0;ZH[1][3]=0;ZH[2][0]=0;ZH[2][1]=0;ZH[2][2]=1;ZH[2][3]=0;ZH[3][0]=0;ZH[3][1]=0;ZH[3][2]=0;ZH[3][3]=1;TZ[0][0]=-sqrt(2)/2;TZ[0][1]=-0.5;TZ[0][2]=-0.5;TZ[0][3]=0;TZ[1][0]=sqrt(2)/2;TZ[1][1]=-0.5;TZ[1][2]=-0.5;TZ[1][3]=0;TZ[2][0]=0;TZ[2][1]=sqrt(2)/2;TZ[2][2]=-sqrt(2)/2;TZ[2][3]=0;TZ[3][0]=0;TZ[3][1]=0;TZ[3][2]=700;TZ[3][3]=1;}voidCForYuView::OnDraw(CDC*pDC){CForYuDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);Doublebuffer();}voidCForYuView::Doublebuffer(){GetClientRect(&rect);CDC*pDC=GetDC();pDC-SetMapMode(MM_ANISOTROPIC);pDC-SetWindowExt(rect.Width(),rect.Height());pDC-SetViewportExt(rect.Width(),-rect.Height());pDC-SetViewportOrg(rect.Width()/2,rect.Height()/2);CDCdc;dc.CreateCompatibleDC(pDC);CBitmapbitmap,*oldbitmap;bitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());oldbitmap=dc.SelectObject(&bitmap);CPenpen,*oldpen;pen.CreatePen(PS_SOLID,1,0x00FFFFFF);oldpen=dc.SelectObject(&pen);6dc.SetMapMode(MM_ANISOTROPIC);dc.SetWindowExt(rect.Width(),rect.Height());dc.SetViewportExt(rect.Width(),-rect.Height());dc.SetViewportOrg(rect.Width()/2,rect.Height()/2);Transform();TOUSHI();TranslateFrom3DTo2D();XW();DrawObject(&dc);pDC-BitBlt(-rect.Width()/2,-rect.Height()/2,rect.Width(),rect.Height(),&dc,-rect.Width()/2,-rect.Height()/2,SRCCOPY);dc.SelectObject(oldpen);pen.DeleteObject();dc.SelectObject(oldbitmap);bitmap.DeleteObject();dc.DeleteDC();ReleaseDC(pDC);}voidCForYuView::OnTimer(UINTnIDEvent){a+=0.3;b+=0.2;c+=0.1;ZH[0][0]=cos(b)*cos(c);ZH[0][1]=cos(b)*sin(c);ZH[0][2]=-sin(b);ZH[1][0]=cos(c)*sin(a)*sin(b)-cos(a)*sin(c);ZH[1][1]=sin(c)*sin(a)*sin(b)+cos(c)*cos(a);ZH[1][2]=sin(a)*cos(b);ZH[2][0]=cos(a)*sin(b)*cos(c)+sin(a)*sin(c);ZH[2][1]=cos(a)*sin(b)*sin(c)-cos(c)*sin(a);ZH[2][2]=cos(a)*cos(b);Invalidate(FALSE);CView::OnTimer(nIDEvent);}voidCForYuView::OnSize(UINTnType,intcx,intcy){CView::OnSize(nType,cx,cy);SetTimer(1,100,NULL);}voidCForYuView::Transform(){for(inti=0;i4;i++)for(intj=0;j4;j++){S3D[i][j]=0;for(intk=0;k4;k++)S3D[i][j]+=F3D[i][k]*ZH[k][j];}}voidCForYuView::TOUSHI(){for(inti=0;i4;i++)7for(intj=0;j4;j++){T3D[i][j]=0;for(intk=0;k4;k++)T3D[i][j]+=S3D[i][k]*TZ[k][j];}}BOOLCForYuView::XIAOYING(doublex2,doubley2,doublez2,doublex1,doubley1,doublez1,doublex3,doubley3,doublez3,doublex,doubley,doublez){doubleXL1[3]={x1-x2,y1-y2,z1-z2};doubleXL2[3]={x3-x2,y3-y2,z3-z2};DoubleXL3[3]={(y1-y2)*(z3-z2)-(y3-y2)*(z1-z2),-((x1-x2)*(z3-z2)-(x3-x2)*(z1-z2)),(x1-x2)*(y3-y2)-(x3-x2)*(y1-y2)};doubleXL4[3]={250-x,250-y,500*sin(PI/4)-z};doublejiguo=XL3[0]*XL4[0]+XL3[1]*XL4[1]+XL3[2]*XL4[2];if(jiguo0)returnTRUE;elsereturnFALSE;}voidCForYuView::TranslateFrom3DTo2D(){for(inti=0;i4;i++)for(intj=0;j2;j++)F2D[i][j]=T3D[i][j]/T3D[i][2]*1000;}voidCForYuView::DrawObject(CDC*pDC){if(yu[0]){CBrushbrushg;brushg.CreateSolidBrush(0x0000FF00);pDC-SelectObject(&brushg);pDC-BeginPath();pDC-MoveTo(int(F2D[0][0]),int(F2D[0][1]));pDC-LineTo(int(F2D[1][0]),int(F2D[1][1]));pDC-LineTo(int(F2D[2][0]),int(F2D[2][1]));pDC-LineTo(int(F2D[0][0]),int(F2D[0][1]));pDC-EndPath();pDC-FillPath();brushg.DeleteObject();}if(yu[1]){CBrushbrushr;brushr.CreateSolidBrush(0x000000FF);pDC-SelectObject(&brushr);pDC-BeginPath();pDC-MoveTo(int(F2D[0][0]),int(F2D[0][1]));8pDC-LineTo(int(F2D[2][0]),int(F2D[2][1]));pDC-LineTo(int(F2D[3][0]),int(F2D[3][1]));pDC-LineTo(int(F2D[0][0]),int(F2D[0][1]));pDC-EndPath();pDC-FillPath();brushr.D
本文标题:计算机图形学实验报告
链接地址:https://www.777doc.com/doc-4307143 .html