傻大方


首页 > 知识库 > >

完整|(完整word版)计算机图形学实验报告( 二 )


按关键词阅读: 报告 Word 完整 实验 图形学 计算机


核心代码如下:void CTestView::OnDraw(CDC pDC)CTestDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);/ TODO: add draw code for native data hereCRect Rect;
GetClientRect(&Rect);int MaxX=R 。

9、ect.right;int MaxY=Rect.bottom;pDC-SetMapMode(MM_ANISOTROPIC); pDCSetWindowExt(1 ,1);
pDCSetViewportExt(1, -1);pDC-SetViewportOrg(MaxX/2, MaxY/2);
/设置视点原点在屏幕中心DrawObject(pDC);void CTestView::ReadPoint()/读入8个顶点坐标/每一行代表正方体每个顶点的x,y,z坐标int a=200;
/正方体边长P11=-a/2;
P12=a/2;
P13=-a/2;P21=-a/2;
P22=a/2;P23=-a/2;
P3 。

10、1=-a/2;P32=a/2;P33=a/2;
P41=-a/2;P42=a/2;P43=a/2;P51=a/2;
P52=a/2;
P53=a/2;P61=a/2;
P62=a/2;P63=-a/2;P71=a/2;
P72=a/2;P73=a/2;P81=a/2;P82=-a/2;
P83=a/2;
void CTestView::ReadFace()/读入6个面坐标/第一列为每个面的边数;其余列为面的顶点编号F10=4;
F11=1;F12=2;F13=3;
F14=4;F20=4;F21=1;
F22=4;
F23=8;
F24=5;
F30=4;F31=5;F32=6;F33=7;
F34=8;
F40=4;
F4 。

11、1=6;F42=2;
F43=3;F44=7;
F50=4;F51=8;F52=7;
F53=3;F54=4;
F60=4;
F61=5;
F62=6;F63=2;
F64=1;
void CTestView:DrawObject(CDC *pDC)/绘制立方体int TotalEdge,PointNumber;
int xt , yt , zt,x,y , z;/边的点坐标CPen MyPen , * OldPen;
double x2d , y2d;/屏幕坐标系的二维坐标点MyPen.CreatePen(PS_SOLID,3,RGB(0 , 0 , 0));
OldPen=pDCSelectObject(MyPen);for(face 。

12、=1;face=6;face+)TotalEdge=Fface0;
/面的总边数for(int edge=1;edge=TotalEdge;
edge+)/边循环PointNumber=Ffaceedge;/面的顶点号x=PPointNumber1;
/每个顶点的x,y , z坐标y=PPointNumber2;z=PPointNumber3;
Project(x2d, y2d ,x,y,z);
if(edge=1)/保存起点用于闭合pDC-MoveTo(ROUND(x2d),ROUND(y2d));
xt=x;
yt=y;
zt=z;elsepDC-LineTo(ROUND(x2d) , ROUND(y2d));
P 。

13、roject(x2d ,y2d, xt , yt , zt);pDCLineTo(ROUND(x2d) , ROUND(y2d));
/封闭边pDCSelectObject(OldPen);MyPen.DeleteObject();
void CTestView::Project(double x2d, double y2d, int x,int y,int z)/透视变换double x0 , y0,z0;/用户坐标变换为观察坐标系三维坐标 , 即用户坐标系坐标乘观察坐标变换矩阵(x , y , z , 1)*Tvx0 = x*Proj00+y*Proj10+zProj20+Proj30;
y0 = x*Proj01+yProj 。

14、11+zProj21+Proj31;z0 = x*Proj02+y*Proj12+zProj22+Proj32;/观察坐标系三维坐标透视变换为屏幕坐标系二维坐标,即(xv,yv,zv , 1)Ts,再转化为非其次坐标x2d=Dx0/z0;y2d=Dy0/z0;void CTestView::InitParameter()/初始化观察坐标变换矩阵double cosTheta = cos(PITheta/180);
double sinTheta = sin(PITheta/180);
double cosPhi = cos(PIPhi/180);double sinPhi = sin(PIPhi/18 。

15、0);double cosAlpha = cos(PI*Alpha/180);double sinAlpha = sin(PI*Alpha/180);
Proj00 = cosThetacosAlpha+sinTheta*cosPhi*sinAlpha;
Proj01 = cosThetasinAlpha cosPhi*sinTheta*cosAlpha;
Proj02 = sinPhisinTheta;
Proj03 = 0;
Proj10 = -sinPhisinAlpha;
Proj11 = sinPhicosAlpha;
Proj12 = cosPhi;Proj13 = 0;
Proj20 = -si 。

16、nThetacosAlpha+cosThetacosPhisinAlpha;Proj21 = -sinThetasinAlpha-cosPhicosThetacosAlpha;Proj22 = -sinPhicosTheta;Proj23 = 0;
Proj30 = -(acosThetacsinTheta)cosAlpha(-bsinPhi+(asinTheta+ccosTheta)cosPhi)sinAlpha;Proj31 = (a*cosTheta-c*sinTheta)sinAlpha+(-bsinPhi+(a*sinTheta+c*cosTheta)*cosPhi)*cosAlpha 。

17、;Proj32 = b*cosPhi+(a*sinTheta+c*cosTheta)sinPhi;
Proj33 = 1;
void CTestView::OnCustom() / TODO: Add your command handler code hereAfxGetMainWnd()-SetWindowText(透视变换任意观察坐标系透视);
/任意设定观察点a = 200;b = 0;
c = 500;/观察角度Theta=20;
Phi=90;Alpha = 10;/视距D = 800;InitParameter();
ReadPoint();
ReadFace();
RedrawWindow() 。

18、;
void CTestView:OnMENUOne() /一点透视 / TODO: Add your command handler code hereAfxGetMainWnd()-SetWindowText(”透视变换一点透视);Theta=0;Phi=90;Alpha = 0;/采用球面坐标设定观察点double R= 700.0;a = R*sin(PIPhi/180)*sin(PI*Theta/180);b = Rcos(PI*Phi/180);
c = R*sin(PI*Phi/180)cos(PI*Theta/180);
D = 1000;
/视距InitParameter();
Rea 。

19、dPoint();
ReadFace();RedrawWindow();void CTestView:OnMENUTwo()/二点透视 / TODO: Add your command handler code hereAfxGetMainWnd()SetWindowText(”透视变换二点透视);
Theta=30;
Phi=90;
Alpha =0;
/采用球面坐标设定观察点double R= 700 。
0;a = Rsin(PIPhi/180)*sin(PI*Theta/180);b = R*cos(PI*Phi/180);c = Rsin(PI*Phi/180)cos(PITheta/180);
D 。


来源:(未知)

【学习资料】网址:/a/2021/0321/0021738765.html

标题:完整|(完整word版)计算机图形学实验报告( 二 )


上一篇:湿热|湿热分类分析

下一篇:生活|生活中的物理现象大总结