班级 | 1420551 | 实验日期 | 2016.12.01 | |||
姓名 | 学号 | |||||
实验名称 | 球面地理划分线框模型消隐算法 | |||||
实 验 目 的 及 要 求 | 1.球面的地理划分法 2.球面的数据结构 3.球面线框模型的消隐算法 | |||||
算 法 及 实 验 步 骤 | 1.构造球面的顶点表和小面表。 2.循环访问每个表面内的每个顶点,使用透视投影绘制每个小面的二维投影线框图。 3.使用每个小面一个顶点处的法矢量与视矢量旳点积消隐。 4.使用计时器改变球面的转角生成旋转动画。 | |||||
调 试 过 肉简笔画>施秉县属于哪个市程 及 实重庆旅游攻略三日游自由行 验 结 果 | 过程: 1.读入球面的顶点表 2.读入球面的面表 3.绘制球面线框模型 结果: | |||||
总 结 蛇胆疮传染吗 | ||||||
附 录 | (核心源程序清单) 1. 读入球面的顶点表: void CTestView::ReadVertex()//读入顶点坐标 { int gAlpha=4,gBeta=4;//面片夹角 N1=180/gAlpha,N2=360/gBeta;//N1为纬度区域,N2为经度区域 V=new CP3[(N1-1)*N2+2];//V为球的顶点 //纬度方向除南北极点外有"N1-1"个点,"2"代表南北极两个点 double gAlpha1,gBeta1,r=300;//r为球体半径 //计算北极点坐标 V[0].x=0,V[0].y=r,V[0].z=0; //按行循环计算球体上的点坐标 for(int i=0;i<N1-1;i++) { gAlpha1=(i+1)*gAlpha*PI/180; for(int j=0;j<N2;j++) { gBeta1=j*gBeta*PI/180; V[i*N2+j+1].x=r*sin(gAlpha1)*sin(gBeta1); V[i*N2+j+1].y=r*cos(gAlpha1); V[i*N2+j+1].z=r*sin(gAlpha1)*cos(gBeta1); } } //计算南极点坐标 V[(N1-1)*N2+1].x=0,V[(N1-1)*N2+1].y=-r,V[(N1-1)*N2+1].z=0; } 2. 读入球面的面表: void CTestView::ReadFace()//读入面表 { //设置二维动态数组 F=new CFace *[N1];//设置行 for(int n=0;n<N1;n++) F[n]=new CFace[N2];//设置列 for(int j=0;j<N2;j++)//构造北极三角形面片 { int tempj=j+1; if(tempj==N2) tempj=0;//面片的首尾连接 int NorthIndex[3];//北极三角形面片索引号数组 NorthIndex[0]=0; NorthIndex[1]=j+1; NorthIndex[2]=tempj+1; 第一次坐火车 F[0][j].SetNum(3); for(int k=0;k<F[0][j].vN;k++) F[0][j].vI[k]=NorthIndex[k]; } for(int i=1;i<N1-1;i++)//构造球面四边形面片 { for(int j=0;j<N2;j++) { int tempi=i+1; int tempj=j+1; if(tempj==N2) tempj=0; int BodyIndex[4];//球面四边形面片索引号数组 BodyIndex[0]=(i-1)*N2+j+1; BodyIndex[1]=(tempi-1)*N2+j+1; BodyIndex[2]=(tempi-1)*N2+tempj+1; BodyIndex[3]=(i-1)*N2+tempj+1; F[i][j].SetNum(4); for(int k=0;k<F[i][j].vN;k++) F[i][j].vI[k]=BodyIndex[k]; } } for(j=0;j<N2;j++)//构造南极三角形面片 { int tempj=j+1; if(tempj==N2) tempj=0; int SouthIndex[3];//南极三角形面片索引号数组 SouthIndex[0]=(N1-2)*N2+j+1; SouthIndex[1]=(N1-1)*N2+1;就去色拉 SouthIndex[2]=(N1-2)*N2+tempj+1; F[N1-1][j].SetNum(3); for(int k=0;k<F[N1-1][j].vN;k++) F[N1-1][j].vI[k]=SouthIndex[k]; } } 3. 绘制球面线框模型: void CTestView::DrawObject(CDC *pDC)//绘制球面线框模型 { CLine *line=new CLine; CP2 Point3[3],t3;//南北极顶点数组 CP2 Point4[4],t4;//球体顶点数组 for(int i=0;i<N1;i++) { for(int j=0;j<N2;j++) { CVector ViewVector(V[F[i][j].vI[0]],ViewPoint);//面的视矢量 ViewVector=ViewVector.Normalize();//单位化视矢量 F[i][j].SetFaceNormal(V[F[i][j].vI[0]],V[F[i][j].vI[1]],V[F[i][j].vI[2]]); F[i][j].fNormal.Normalize();//单位化法矢量 if(Dot(ViewVector,F[i][j].fNormal)>=0)//背面剔除 { if(3==F[i][j].vN)//三角形面片 { 好玩的书 for(int m=0;m<F[i][j].vN;m++) { PerProject(V[F[i][j].vI[m]]); Point3[m]=ScreenP; } for(int n=0;n<3;n++) { if(0==n) { line->MoveTo(pDC,Point3[n]); t3=Point3[n]; } el line->LineTo(pDC,Point3[n]); } line->LineTo(pDC,t3);//闭合多边形 } el//四边形面片 { for(int m=0;m<F[i][j].vN;m++) { PerProject(V[F[i][j].vI[m]]); Point4[m]=ScreenP; } for(int n=0;n<4;n++) { if(0==n) { line->MoveTo(pDC,Point4[n]); t4=Point4[n]; } el line->LineTo(pDC,Point4[n]); } line->LineTo(pDC,t4);//闭合多边形}} } } delete line; } | |||||
实验地点 | 专业软件实验室 | 指导教师 | 李丽亚 | |||
本文发布于:2023-06-25 02:44:51,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/fan/82/1033213.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |