3D图形变换汇总.docx

上传人:b****8 文档编号:29211298 上传时间:2023-07-21 格式:DOCX 页数:24 大小:223.61KB
下载 相关 举报
3D图形变换汇总.docx_第1页
第1页 / 共24页
3D图形变换汇总.docx_第2页
第2页 / 共24页
3D图形变换汇总.docx_第3页
第3页 / 共24页
3D图形变换汇总.docx_第4页
第4页 / 共24页
3D图形变换汇总.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

3D图形变换汇总.docx

《3D图形变换汇总.docx》由会员分享,可在线阅读,更多相关《3D图形变换汇总.docx(24页珍藏版)》请在冰豆网上搜索。

3D图形变换汇总.docx

3D图形变换汇总

3D图形变换

一.实验目的:

掌握3D图像的变换,了解多数的3D变换,平移,旋转等几何变换,还有投影变换等知识。

二.实验原理:

3D图像的移动,比例变化,旋转等几何变换算法原理及各种投影变换算法原理。

三.实验步骤:

一.建立MFC单文档程序,用来编写3D变换。

二.建立Mainframe,并设计,添加相应的ID及映射函数。

三.实验的主要代码:

1、设计3维图形平移变换算法的实现程序;

voidCMyView:

:

OnTranslation()

{

m_Select=SEL_TS;

m_str="平移";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=1;

my1.A[2][2]=1;

my1.A[4][4]=1;

my1.A[3][3]=1;

my1.A[4][1]=20;//x轴方向上平移

my1.A[4][2]=28;//y轴方向上平移

my1.A[4][3]=28;//z轴方向上平移

my1.Draw();

}

2、设计3维图形缩放变换算法的实现程序;

voidCMyView:

:

OnScalingS()

{

m_Select=SEL_MO;

m_str="整体变比";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=1;

my1.A[2][2]=1;

my1.A[3][3]=1;

my1.A[4][4]=0.5;

my1.Draw();

}

voidCMyView:

:

OnScalingXyz()

{

m_Select=SEL_MO;

m_str="XYZ变比";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=2;//x轴方向上比例

my1.A[2][2]=1;//y轴方向上比例

my1.A[3][3]=2;//z轴方向上比例

my1.A[4][4]=1;

my1.Draw();}

3、设计3维图形旋转变换算法的实现程序。

voidCMyView:

:

OnRotationX()

{

m_Select=SEL_RX;

m_str="关于X轴旋转";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=1;

my1.A[2][2]=cos(70*PI/180);//旋转70度

my1.A[3][2]=sin(70*PI/180);

my1.A[2][3]=-sin(70*PI/180);

my1.A[3][3]=cos(70*PI/180);

my1.A[4][4]=1;

my1.Draw();

}

voidCMyView:

:

OnRotationY()

{

m_Select=SEL_RY;

m_str="关于Y轴旋转";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[2][2]=1;

my1.A[1][1]=cos(80*PI/180);//旋转80度

my1.A[3][1]=sin(80*PI/180);

my1.A[1][3]=-sin(80*PI/180);

my1.A[3][3]=cos(80*PI/180);

my1.A[4][4]=1;

my1.Draw();

}

voidCMyView:

:

OnRotationZ()

{

m_Select=SEL_RZ;

m_str="关于Z轴旋转";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[3][3]=1;

my1.A[1][1]=cos(60*PI/180);//旋转60度

my1.A[1][2]=sin(60*PI/180);

my1.A[2][1]=-sin(60*PI/180);

my1.A[2][2]=cos(60*PI/180);

my1.A[4][4]=1;

my1.Draw();

}

4.设计3维图形错切变换算法的实现程序:

voidCMyView:

:

OnShX()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_SHX;

m_str="X方向错切";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=1;

my1.A[2][2]=1;

my1.A[3][3]=1;

my1.A[4][4]=1;

my1.A[1][2]=0.5;//为0错切平面离开Z轴,沿X方向移动

my1.A[1][3]=0.5;//为0错切平面离开Y轴,沿X方向移动

my1.Draw();

}

voidCMyView:

:

OnShY()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_SHY;

m_str="Y方向错切";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=1;

my1.A[2][2]=1;

my1.A[3][3]=1;

my1.A[4][4]=1;

my1.A[1][2]=0.5;//为0错切平面离开Z轴,沿Y方向移动

my1.A[3][2]=0.5;//为0错切平面离开X轴,沿Y方向移动

//RedrawWindow();

my1.Draw();

}

voidCMyView:

:

OnV()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_V;

m_str="主视图";

inti,j;

CBaseClassmy1;//构造新的CMyClass对象

//将主视图变换矩阵清零

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

//给主视图变换矩阵赋值

my1.A[1][1]=1;

my1.A[3][3]=1;

my1.A[4][4]=1;

RedrawWindow();

my1.Display();

}

5.设计3维图形对称变换算法的实现程序:

voidCMyView:

:

OnMirrorO()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_MO;

m_str="关于原点对称";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=-1;

my1.A[2][2]=-1;

my1.A[3][3]=-1;

my1.A[4][4]=1;

my1.Draw();

}

voidCMyView:

:

OnMirrorOxy()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_MOXY;

m_str="关于OXY平面对称";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=1;

my1.A[2][2]=1;

my1.A[3][3]=-1;

my1.A[4][4]=1;

my1.Draw();

}

voidCMyView:

:

OnMirrorOyz()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_MOYZ;

m_str="关于OYZ平面对称";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=-1;

my1.A[2][2]=1;

my1.A[3][3]=1;

my1.A[4][4]=1;

my1.Draw();

}

voidCMyView:

:

OnMirrorOzx()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_MOZX;

m_str="关于OZX平面对称";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=1;

my1.A[2][2]=-1;

my1.A[3][3]=1;

my1.A[4][4]=1;

my1.Draw();

}

voidCMyView:

:

OnMirrorX()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_MX;

m_str="关于X对称";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=1;

my1.A[2][2]=-1;

my1.A[3][3]=-1;

my1.A[4][4]=1;

my1.Draw();

}

voidCMyView:

:

OnMirrorY()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_MY;

m_str="关于Y对称";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=-1;

my1.A[2][2]=1;

my1.A[3][3]=-1;

my1.A[4][4]=1;

my1.Draw();

}

voidCMyView:

:

OnMirrorZ()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_MZ;

m_str="关于Z对称";

CBaseClassmy1;//构造新的CBaseClass对象

inti,j;

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=-1;

my1.A[2][2]=-1;

my1.A[3][3]=1;

my1.A[4][4]=1;

my1.Draw();

}

6.设计3维图形平行投影变换算法的实现程序:

voidCMyView:

:

OnV()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_V;

m_str="主视图";

inti,j;

CBaseClassmy1;//构造新的CMyClass对象

//将主视图变换矩阵清零

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

//给主视图变换矩阵赋值

my1.A[1][1]=1;

my1.A[3][3]=1;

my1.A[4][4]=1;

RedrawWindow();

my1.Display();

}

voidCMyView:

:

OnW()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_H;

m_str="侧视图";

inti,j;

CBaseClassmy1;//构造新的CMyClass对象

//将俯视图变换矩阵清零

//将侧视图变换矩阵清零

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.Aw[i][j]=0;

}

//给侧视图变换矩阵赋值

my1.Aw[2][1]=-1;

my1.Aw[3][3]=1;

my1.Aw[4][4]=1;

RedrawWindow();

my1.Display();

}

voidCMyView:

:

OnH()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_H;

m_str="俯视图";

inti,j;

CBaseClassmy1;//构造新的CMyClass对象

//将俯视图变换矩阵清零

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.Ah[i][j]=0;

}

//给俯视图变换矩阵赋值

my1.Ah[1][1]=1;

my1.Ah[2][3]=-1;

//my1.Ah[4][3]=10;//俯视图平移量

my1.Ah[4][4]=1;

RedrawWindow();

my1.Display();

}

voidCMyView:

:

OnSe()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_SE;

m_str="斜等测视图";

inti,j;

CBaseClassmy1;//构造新的CBaseClass对象

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=1;

my1.A[2][2]=1;

my1.A[3][1]=0.707f;//X方向错切位移量

my1.A[3][2]=0.707f;//Y方向错切位移量

my1.A[4][4]=1;

RedrawWindow();

my1.Drawse();

}

voidCMyView:

:

OnSt()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_ST;

m_str="斜二测视图";

inti,j;

CBaseClassmy1;//构造新的CMyClass对象

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my1.A[i][j]=0;

}

my1.A[1][1]=1;

my1.A[2][2]=1;

my1.A[3][1]=0.3535f;//X方向错切位移量

my1.A[3][2]=0.3535f;//Y方向错切位移量

my1.A[4][4]=1;

RedrawWindow();

my1.Drawvt();

}

voidCMyView:

:

OnVe()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_VE;

m_str="正等测视图";

inti,j;

CBaseClassmy2;//构造新的CMyClass对象

my2.theta_y=45;//Y轴夹角

my2.phi_x=125;//X轴夹角

//给正等测变换矩阵清零

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my2.A[i][j]=0;

}

//给正等测变换矩阵赋值

my2.A[1][1]=(float)cos(my2.theta_y*PI/180);

my2.A[1][2]=(float)sin(my2.theta_y*PI/180)*(float)sin(my2.phi_x*PI/180);

my2.A[2][2]=(float)cos(my2.phi_x*PI/180);

my2.A[3][1]=(float)sin(my2.theta_y*PI/180);

my2.A[3][2]=(float)-cos(my2.theta_y*PI/180)*(float)sin(my2.phi_x*PI/180);

my2.A[4][4]=1;

RedrawWindow();

my2.Drawve();

}

voidCMyView:

:

OnVt()

{

//TODO:

Addyourcommandhandlercodehere

m_Select=SEL_VT;

m_str="正二测视图";

inti,j;

CBaseClassmy2;//构造新的CMyClass对象

my2.theta_y=115;//Y轴夹角25-115

my2.phi_x=25;//X轴夹角

//给正二测变换矩阵清零

for(i=1;i<=4;++i)

{

for(j=1;j<=4;++j)

my2.A[i][j]=0;

}

//给正二测变换矩阵赋值

my2.A[1][1]=(float)cos(my2.theta_y*PI/180);

my2.A[1][2]=(float)sin(my2.theta_y*PI/180)*(float)sin(my2.phi_x*PI/180);

my2.A[2][2]=(float)cos(my2.phi_x*PI/180);

my2.A[3][1]=(float)sin(my2.theta_y*PI/180);

my2.A[3][2]=(float)-cos(my2.theta_y*PI/180)*(float)sin(my2.phi_x*PI/180);

my2.A[4][4]=1;

RedrawWindow();

my2.Drawvt();

}

四.实验结果:

1.原三维图:

2.平移:

3.旋转:

(沿x,y,z轴)

4.变比:

5.对称

6.错切:

7.平行投影->三视图:

8.平行投影->正轴测图:

9.平行投影->斜轴测图:

10.透视图:

五.心得体会:

通过上机写程序对3D图像变换有了更深刻的了解。

图像学跟现实中的很多科技联系紧密。

对图形学这门学科也有了跟深刻的认识。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1