图形学实验四地理划分画球算法实验Word下载.docx
- 文档编号:15848943
- 上传时间:2022-11-16
- 格式:DOCX
- 页数:11
- 大小:17.70KB
图形学实验四地理划分画球算法实验Word下载.docx
《图形学实验四地理划分画球算法实验Word下载.docx》由会员分享,可在线阅读,更多相关《图形学实验四地理划分画球算法实验Word下载.docx(11页珍藏版)》请在冰豆网上搜索。
2)理解双缓冲的算法
3)理解mfc作用原理
环
境
VC++6.0基于MFC
内
容
利用mfc绘制地理球
算
法
描
述
步
骤
部分重要代码截图:
(用适当的形式表达算法设计思想与算法实现步骤)
调
试
过
程
结
果
实验过程中没有出现太大的问题
实验结果展示如下:
地理球
(详细记录在调试过程中出现的问题及解决方法。
记录实验运行结果)
总
1)通过本次实验,了解到了mfc的最基本知识,发现自己学习mfc任重而道远,在前行的路上还有很多学习的地方。
2)实践是检验真理的唯一标准
3)动手能力需要再次提高
4)算法思想要与时俱进,要多学习算法
(对实验结果进行分析,实验心得体会及改进意见)
附
录
//OnDraw函数
voidCTestView:
:
OnDraw(CDC*pDC)
{
CTestDoc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
DoubleBuffer();
}
ReadVertex()//读入顶点坐标
intgAlpha=4,gBeta=4;
//面片夹角
N1=180/gAlpha,N2=360/gBeta;
//N1为纬度区域,N2为经度区域
V=newCP3[(N1-1)*N2+2];
//V为球的顶点
//纬度方向除南北极点外有"
N1-1"
个点,"
2"
代表南北极两个点
doublegAlpha1,gBeta1,r=300;
//r为球体半径
//计算北极点坐标
V[0].x=0,V[0].y=r,V[0].z=0;
//按行循环计算球体上的点坐标
for(inti=0;
i<
N1-1;
i++)
{
gAlpha1=(i+1)*gAlpha*PI/180;
for(intj=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;
ReadFace()//读入面表
//设置二维动态数组
F=newCFace*[N1];
//设置行
for(intn=0;
n<
N1;
n++)
F[n]=newCFace[N2];
//设置列
for(intj=0;
j++)//构造北极三角形面片
inttempj=j+1;
if(tempj==N2)tempj=0;
//面片的首尾连接
intNorthIndex[3];
//北极三角形面片索引号数组
NorthIndex[0]=0;
NorthIndex[1]=j+1;
NorthIndex[2]=tempj+1;
F[0][j].SetNum(3);
for(intk=0;
k<
F[0][j].vN;
k++)
F[0][j].vI[k]=NorthIndex[k];
for(inti=1;
i++)//构造球面四边形面片
inttempi=i+1;
inttempj=j+1;
if(tempj==N2)tempj=0;
intBodyIndex[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(intk=0;
F[i][j].vN;
F[i][j].vI[k]=BodyIndex[k];
for(j=0;
j++)//构造南极三角形面片
intSouthIndex[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);
F[N1-1][j].vN;
F[N1-1][j].vI[k]=SouthIndex[k];
InitParameter()//透视变换参数初始化
k[1]=sin(PI*Theta/180);
k[2]=sin(PI*Phi/180);
k[3]=cos(PI*Theta/180);
k[4]=cos(PI*Phi/180);
k[5]=k[2]*k[3];
k[6]=k[2]*k[1];
k[7]=k[4]*k[3];
k[8]=k[4]*k[1];
ViewPoint.x=R*k[6];
ViewPoint.y=R*k[4];
ViewPoint.z=R*k[5];
PerProject(CP3P)//透视变换
CP3ViewP;
ViewP.x=P.x*k[3]-P.z*k[1];
//观察坐标系三维坐标
ViewP.y=-P.x*k[8]+P.y*k[2]-P.z*k[7];
ViewP.z=-P.x*k[6]-P.y*k[4]-P.z*k[5]+R;
ScreenP.x=d*ViewP.x/ViewP.z;
//屏幕二维坐标系
ScreenP.y=d*ViewP.y/ViewP.z;
DoubleBuffer()//双缓冲
CDC*pDC=GetDC();
CRectrect;
//定义客户区
GetClientRect(&
rect);
//获得客户区的大小
pDC->
SetMapMode(MM_ANISOTROPIC);
//pDC自定义坐标系
SetWindowExt(rect.Width(),rect.Height());
//设置窗口范围
SetViewportExt(rect.Width(),-rect.Height());
//x轴水平向右,y轴垂直向上
SetViewportOrg(rect.Width()/2,rect.Height()/2);
//屏幕中心为原点
CDCMemDC;
//内存DC
CBitmapNewBitmap,*pOldBitmap;
//内存中承载图像的临时位图
MemDC.CreateCompatibleDC(pDC);
//建立与屏幕pDC兼容的MemDC
NewBitmap.CreateCompatibleBitmap(pDC,rect.Width(),rect.Height());
//创建兼容位图
pOldBitmap=MemDC.SelectObject(&
NewBitmap);
//将兼容位图选入MemDC
MemDC.FillSolidRect(&
rect,pDC->
GetBkColor());
//按原来背景填充客户区,否则是黑色
MemDC.SetMapMode(MM_ANISOTROPIC);
//MemDC自定义坐标系
MemDC.SetWindowExt(rect.Width(),rect.Height());
MemDC.SetViewportExt(rect.Width(),-rect.Height());
MemDC.SetViewportOrg(rect.Width()/2,rect.Height()/2);
DrawObject(&
MemDC);
BitBlt(-rect.Width()/2,-rect.Height()/2,rect.Width(),rect.Height(),&
MemDC,-rect.Width()/2,-rect.Height()/2,SRCCOPY);
//将内存位图拷贝到屏幕
MemDC.SelectObject(pOldBitmap);
//恢复位图
NewBitmap.DeleteObject();
//删除位图
ReleaseDC(pDC);
//释放DC
DrawObject(CDC*pDC)//绘制球面线框模型
CP2Point3[3],t3;
//南北极顶点数组
CP2Point4[4],t4;
//球体顶点数组
{
CVectorViewVector(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(intm=0;
m<
m++)
{
PerProject(V[F[i][j].vI[m]]);
Point3[m]=ScreenP;
}
for(intn=0;
3;
if(0==n)
{
pDC->
MoveTo(Point3[n].x,Point3[n].y);
t3=Point3[n];
}
else
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 图形学 实验 地理 划分 算法