计算机图形学实验报告

更新时间:2023-06-25 02:44:51 阅读: 评论:0

                    实验成绩:       
《计算机图形学》实验报告5
班级:  1420551         
专业:  网络工程         
学号:       
姓名:             
《计算机图形学》课程实验报告(五)
翻转课堂教学模式
班级
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为球的顶点
    //纬度方向除南北极点外有"N11"个点,"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 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图