傻大方


首页 > 知识库 > >

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


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



20、 = 1000;/视距InitParameter();ReadPoint();ReadFace();RedrawWindow();
void CTestView:OnMENUThree() /三点透视/ TODO: Add your command handler code hereAfxGetMainWnd()-SetWindowText(”透视变换三点透视);
Theta=45;Phi=45;Alpha=0;
/采用球面坐标设定观察点double R= 700 。
0;
a = R*sin(PI*Phi/180)*sin(PITheta/180);
b = Rcos(PI*Phi/180);
c = Rs 。

21、in(PIPhi/180)cos(PITheta/180);
D = 1000;/视距InitParameter();
ReadPoint();
ReadFace();
RedrawWindow();
实验截图4、迭代剖分法生成球面 。
首先、使用MFC AppWizard(exe)向导生成一个单文档视图程序框架.其次、初始化生成正八面体的顶点表 , 和面表 。
再次、对面表里的每一个三角形进行剖分 , 一个三角形变成四个三角形 。
将产生的新的顶点加入到顶点表,同时将产生的新三角形加入到面表里 , 并从面表里删除原来的三角形 。
迭代多次后即得一个逼近于球面的多面体.最后、对面表里的每一个三角形进行透视投影,在屏幕上画出透视投影 。

22、图 , 调试程序直至正确 。
实验核心代码如下:void CTestView:GenerateSphereFace()/生成球面表/首先生成一个正八面体int a=200;
P00=0; P01=a;
P02=0;
P10=0; P11=a;
P12=0;
P20=a; P21=0;
P22=0;P30=0; P31=0; P32=-a;P40=-a; P41=0;
P42=0;
P50=0; P51=0; P52=a;int ptNum = 6;
faceNum = 8;F00=3;F01=0;F02=4;F03=5;
F10=3;
F11=0;
F12=5;
F13=2;
F20=3;
F21=0;
F22=2;F23= 。

23、3;F30=3;F31=0;F32=3;
F33=4;F40=3;F41=1;F42=5;F43=4;
F50=3;F51=1;F52=2;F53=5;F60=3;F61=1;F62=3;F63=2;F70=3;F71=1;
F72=4;
F73=3;
/分割迭代for(int times = 0;
times LineTo(ROUND(x2d),ROUND(y2d);
Project(x2d ,y2d, xt,yt , zt);pDC-LineTo(ROUND(x2d),ROUND(y2d));/封闭边void CTestView:Project(double &x2d, double y2d ,int x 。

24、,int y,int z)/透视变换double x0,y0,z0;
/用户坐标变换为观察坐标系三维坐标,即用户坐标系坐标乘观察坐标变换矩阵(x,y,z , 1)Tvx0 = x*Proj00+y*Proj10+z*Proj20+Proj30;
y0 = x*Proj01+yProj11+z*Proj21+Proj31;z0 = xProj02+yProj12+z*Proj22+Proj32;/观察坐标系三维坐标透视变换为屏幕坐标系二维坐标,即(xv,yv,zv , 1)*Ts , 再转化为非其次坐标x2d=D*x0/z0;y2d=D*y0/z0;void CTestView:InitParameter()/ 。

25、初始化观察坐标变换矩阵double cosTheta = cos(PI*Theta/180);
double sinTheta = sin(PITheta/180);double cosPhi = cos(PIPhi/180);double sinPhi = sin(PIPhi/180);double cosAlpha = cos(PIAlpha/180);double sinAlpha = sin(PI*Alpha/180);
Proj00 = cosTheta*cosAlpha+sinThetacosPhisinAlpha;Proj01 = cosThetasinAlpha cosPhi*si 。

26、nTheta*cosAlpha;Proj02 = sinPhi*sinTheta;
Proj03 = 0;
Proj10 = sinPhisinAlpha;Proj11 = sinPhicosAlpha;Proj12 = cosPhi;
Proj13 = 0;Proj20 = sinThetacosAlpha+cosThetacosPhisinAlpha;
Proj21 = -sinThetasinAlphacosPhicosTheta*cosAlpha;Proj22 = sinPhicosTheta;Proj23 = 0;Proj30 = -(acosThetacsinTheta)cosAlpha- 。

27、(b*sinPhi+(a*sinTheta+ccosTheta)cosPhi)*sinAlpha;Proj31 = -(a*cosTheta-csinTheta)*sinAlpha+(-bsinPhi+(asinTheta+c*cosTheta)*cosPhi)cosAlpha;Proj32 = bcosPhi+(asinTheta+c*cosTheta)*sinPhi;
Proj33 = 1;BOOL CTestView:IsFaceVisible(int Face5)/求视矢量int pt0 = Face1;
int pt1 = Face2;
int pt2 = Face3;
/视点坐标减面的某个 。

28、顶点的坐标(这里取第一个顶点),即得视矢量int Vx=aPpt00;
int Vy=bPpt01;int Vz=c-Ppt02;
/求法矢量/先求第一条边的分量int Fx1=Ppt10Ppt00;int Fy1=Ppt11Ppt01;
int Fz1=Ppt12Ppt02;
/先求第二条边的分量int Fx2=Ppt20-Ppt00;
int Fy2=Ppt21Ppt01;int Fz2=Ppt22-Ppt02;/法矢量为第一和第二个矢量的叉积int Nx=Fy1*Fz2Fy2*Fz1;
int Ny=Fz1Fx2Fz2*Fx1;
int Nz=Fx1*Fy2-Fx2*Fy1;/法矢量与视矢量点积0表示 。

29、夹角小于90return VxNx+VyNy+VzNz 0;void CTestView::OnCustom() / TODO: Add your command handler code hereAfxGetMainWnd()-SetWindowText(球”);
Theta=45;Phi=90;Alpha = 0;/采用球面坐标设定观察点double R= 700.0;
a = Rsin(PI*Phi/180)*sin(PI*Theta/180);
b = R*cos(PI*Phi/180);
c = R*sin(PIPhi/180)cos(PITheta/180);D = 800;/视距Init 。

30、Parameter();
GenerateSphereFace();
RedrawWindow();void CTestView:OnMENUOne() / TODO: Add your command handler code hereAfxGetMainWnd()SetWindowText(”椭球”);Theta=0;Phi=90;Alpha = 0;/采用球面坐标设定观察点double R= 700 。
0;a = R*sin(PI*Phi/180)*sin(PI*Theta/180);
b = Rcos(PI*Phi/180);


来源:(未知)

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

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


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

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