西工大计算机图形学实验报告05.docx
- 文档编号:2477584
- 上传时间:2022-10-30
- 格式:DOCX
- 页数:18
- 大小:123.54KB
西工大计算机图形学实验报告05.docx
《西工大计算机图形学实验报告05.docx》由会员分享,可在线阅读,更多相关《西工大计算机图形学实验报告05.docx(18页珍藏版)》请在冰豆网上搜索。
西工大计算机图形学实验报告05
《计算机图形学》实验报告
图形变换
一、实验目的及要求
1. 实习三维图形的坐标系之间的变换;
2. 三维图形几何变换;
3. 掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;
二、理论基础
1.二维图形变换
二维平移变换
从矩阵形式来看,平移变换是矩阵加法,而比例和旋转变换则是矩阵乘法。
若这三种变换都能运用乘法来实现的话,我们就可以实现三种变换的任意组合。
为了实现这个目的,一般采用齐次坐标系来表示这三种变换,齐次坐标系中的平移变换矩阵形式是
二维比例变换
可利用矩阵形式表示成:
二维旋转变换
二维旋转变换:
图形相对坐标原点的旋转如图所示,它产生图形位置和方向的变动。
新图形p'的每个图元点是原图形p每个图元点保持离坐标原点距离不变并绕原点旋转θ角产生的,并以逆时针方向旋转为正角度,对应图元点的坐标值满足关系式
x'=xcosθ-ysinθ
y'=xsinθ+ycosθ
用矩阵形式表示成简记为P'=P·R。
是旋转变换矩阵。
在齐次坐标系中的比例变换矩阵形式是
二维对称变换
变换后,图形点集的x坐标值不变,但符号相反;y坐标值不变。
矩阵表示形式为:
变换后,图形点集的x坐标值不变;y坐标值不变,但符号相反。
矩阵表示形式为:
变换后,图形点集的x和y坐标值不变,但符号相反。
矩阵表示形式为:
变换后,图形点集的x和y坐标对调。
矩阵表示形式为
变换后,图形点集的x和y坐标对调,但符号相反。
矩阵表示形式为
二维错切变换
二维错切变换:
是一种会使物体形状发生变化的变换。
常用的错切变换有两种:
改变x坐标值和改变y坐标值。
矩阵表示为
矩阵表示为
二维仿射变换
x'=axxx+axyy+bx
y'=ayxx+ayyy+by
2.三维图形变换
三维变换齐次坐标矩阵:
从功能上可以将4x4的矩阵分为四个部分:
对图形进行缩放、旋转、对称、错切等变换的矩阵:
对图形进行平移变换的矩阵:
对图形透视变换的矩阵:
对图形整体比例变换的矩阵:
三维空间点齐次坐标矩阵变换方法为:
=
通过上述矩阵对图形上坐标值进行计算,获得相应变换后的坐标值,即可输出要显示的图形。
三、算法设计与分析
1.二维图形变换
voidTrans(CClientDC*dc,int*v)//平移变换函数
{
CPen*pt1,pen(PS_SOLID,2,RGB(255,0,0));
pt1=dc->SelectObject(&pen);
intt=40,t1,t2,t3,t4,t5,t6,t7,t8;
for(inti=0;i<=2;i+=2)
{
t1=v[i*2+0]+t;t2=v[i*2+1]+t;
t3=v[(i+1)*2+0]+t;t4=v[(i+1)*2+1]+t;
dc->MoveTo(t1,t2);
dc->LineTo(t3,t4);
}
for(intj=0;j<=1;j++)
{
t5=v[j*2+0]+t;t6=v[j*2+1]+t;
t7=v[(j+2)*2+0]+t;t8=v[(j+2)*2+1]+t;
dc->MoveTo(t5,t6);
dc->LineTo(t7,t8);
}
dc->SelectObject(pt1);
}
voidRotation(CClientDC*dc,int*v)//旋转变换函数
{
CPen*pt0n,pen(PS_SOLID,2,RGB(0,255,0));
doublea=0.35,b,c;
intt1,t2,t3,t4,t5,t6,t7,t8;
b=sin(a);c=cos(a);
pt0n=dc->SelectObject(&pen);
for(inti=0;i<=2;i+=2)
{
t1=int(v[i*2+0]*c-v[i*2+1]*b);t2=int(v[i*2+0]*b+v[i*2+1]*c);
t3=int(v[(i+1)*2+0]*c-v[(i+1)*2+1]*b);t4=int(v[(i+1)*2+0]*b+v[(i+1)*2+1]*c);
dc->MoveTo(t1,t2);
dc->LineTo(t3,t4);
}
for(intj=0;j<=1;j++)
{
t5=int(v[j*2+0]*c-v[j*2+1]*b);t6=int(v[j*2+0]*b+v[j*2+1]*c);
t7=int(v[(j+2)*2+0]*c-v[(j+2)*2+1]*b);t8=int(v[(j+2)*2+0]*b+v[(j+2)*2+1]*c);
dc->MoveTo(t5,t6);
dc->LineTo(t7,t8);
}
dc->SelectObject(pt0n);
}
voidNarrow(CClientDC*dc,int*v)//缩放变换函数
{
CPen*pt2n,pen(PS_SOLID,2,RGB(0,0,255));
pt2n=dc->SelectObject(&pen);
intn=4,v1,v2,v3,v4,v5,v6,v7,v8;
for(inti=0;i<=2;i+=2)
{
v1=v[i*2+0]*n;v2=v[i*2+1]*n;
v3=v[(i+1)*2+0]*n;v4=v[(i+1)*2+1]*n;
dc->MoveTo(v1,v2);
dc->LineTo(v3,v4);
}
for(intj=0;j<=1;j++)
{
v5=v[j*2+0]*n;v6=v[j*2+1]*n;
v7=v[(j+2)*2+0]*n;v8=v[(j+2)*2+1]*n;
dc->MoveTo(v5,v6);
dc->LineTo(v7,v8);
}
dc->SelectObject(pt2n);
}
voidShear(CClientDC*dc,int*v)//错切函数
{
CPen*pt3n,pen(PS_SOLID,2,RGB(100,100,0));
intb=2,d=2,v1,v2,v3,v4,v5,v6,v7,v8;
pt3n=dc->SelectObject(&pen);
for(inti=0;i<=2;i+=2)
{
v1=v[i*2+0]+b*v[i*2+1];v2=d*v[i*2+0]+v[i*2+1];
v3=v[(i+1)*2+0]+b*v[(i+1)*2+1];v4=d*v[(i+1)*2+0]+v[(i+1)*2+1];
dc->MoveTo(v1,v2);
dc->LineTo(v3,v4);
}
for(intj=0;j<=1;j++)
{
v5=v[j*2+0]+b*v[j*2+1];v6=d*v[j*2+0]+v[j*2+1];
v7=v[(j+2)*2+0]+b*v[(j+2)*2+1];v8=d*v[(j+2)*2+0]+v[(j+2)*2+1];
dc->MoveTo(v5,v6);
dc->LineTo(v7,v8);
}
dc->SelectObject(pt3n);
}
voidCompSymm(CClientDC*dc,int*v)//复合对称变换函数
{
intb=0,d=0,a=-1,e=1;
intv1,v2,v3,v4,v5,v6,v7,v8;
for(inti=0;i<=2;i+=2)
{
v1=a*v[i*2+0]+b*v[i*2+1]+350;v2=d*v[i*2+0]+e*v[i*2+1];
v3=a*v[(i+1)*2+0]+b*v[(i+1)*2+1]+650;v4=d*v[(i+1)*2+0]+e*v[(i+1)*2+1];
dc->MoveTo(v1,v2);
dc->LineTo(v3,v4);
}
for(intj=0;j<=1;j++)
{
if(0==j)
{
v5=a*v[j*2+0]+b*v[j*2+1]+350;v6=d*v[j*2+0]+e*v[j*2+1];
v7=a*v[(j+2)*2+0]+b*v[(j+2)*2+1]+350;v8=d*v[(j+2)*2+0]+e*v[(j+2)*2+1];
dc->MoveTo(v5,v6);
dc->LineTo(v7,v8);
}
else
if(1==j)
{
v5=a*v[j*2+0]+b*v[j*2+1]+650;v6=d*v[j*2+0]+e*v[j*2+1];
v7=a*v[(j+2)*2+0]+b*v[(j+2)*2+1]+650;v8=d*v[(j+2)*2+0]+e*v[(j+2)*2+1];
dc->MoveTo(v5,v6);
dc->LineTo(v7,v8);
}
}
}
voidCCGView:
:
OnChange2d()
{
//TODO:
Addyourcommandhandlercodehere
AfxMessageBox(_T("PleaseInsertThe2DChangeCode!
"));
CClientDCdc(this);
intv[4*2];//二维图形坐标数组,画出二维图形原型
v[0*2+0]=50;v[0*2+1]=50;
v[1*2+0]=200;v[1*2+1]=50;
v[2*2+0]=50;v[2*2+1]=100;
v[3*2+0]=200;v[3*2+1]=100;
for(inti=0;i<=2;i+=2)
{
dc.MoveTo(v[i*2+0],v[i*2+1]);
dc.LineTo(v[(i+1)*2+0],v[(i+1)*2+1]);
}
for(intj=0;j<=1;j++)
{
dc.MoveTo(v[j*2+0],v[j*2+1]);
dc.LineTo(v[(j+2)*2+0],v[(j+2)*2+1]);
}
Trans(&dc,v);//平移变换
Rotation(&dc,v);//旋转变换
Narrow(&dc,v);//缩放变换
Shear(&dc,v);//错切变换
CompSymm(&dc,v);//复合对称变换
}
2.三维图形变换
voidTranss(CClientDC*dc,int(&a)[8][3])//3维平移变换
{
CPen*pt,pen(PS_SOLID,2,RGB(255,0,0));
pt=dc->SelectObject(&pen);
intt=250,v1,v2,v3,v4,v5,v6,v7,v8;
intb[8][3],v[8][2];
for(intk=0;k<=7;k++)
{
b[k][0]=a[k][0]+t;
b[k][1]=a[k][1]+t;
b[k][2]=a[k][2]+t;
}
v[0][0]=b[0][1]-b[0][0]/2;v[0][1]=b[0][2]-b[0][0]/2;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 西工大 计算机 图形学 实验 报告 05
