《计算机图形学》实验报告实验九二维图形变换一、实验教学目标与基本要求1.掌握图形变换的基本算法原理;2.实现若干典型二维图形变换算法。二.理论基础1.生成前几次实验中的基本图形;2.对生成的基本图形进行平移、旋转、放缩、对称等变换。3.对计算机绘图的原理有一定的认识。三.算法设计与分析1.二维变换1.平移变换2.比例变换•Sx=Sy=1等比例变换•Sx=Sy>1放大•Sx=Sy<1缩小100**1101011xyxyxyxyxTyTTT100**1101011xyxyxyxyTTxTyT00**11000011xyxySxyxySSxSy•Sx≠Sy≠13.对称变换当b=d=0,a=-1,e=1时关于Y轴对称当b=d=0,a=1,e=-1时关于X轴对称当b=d=0,a=-1,e=-1时关于原点对称当b=d=1,a=e=0时关于直线y=x对称当b=d=-1,a=e=0时0**1100011adxyxybeaxbydxey''100110100011xyxyxy''100110100011xyxyxy''100110100011xyxyxy''010111000011xyxyyx''010111000011xyxyyx关于直线y=-x对称4.旋转变换绕原点逆时针旋转θ5.错切变换•当d=0时,x*=x+by,y*=y,沿x方向错切位移•当b=0时,x*=x,y*=dx+y,沿y方向错切位移•当b≠0时,当d≠0时,x*=x+by,y=dx+y6.复合变换----复合平移对同一图形做两次平移相当于将两次的平移两加起来:1010001101000110100012121221121yyxxyxyxtttTTTTTTTTTTT复合变换----复合缩放1000000100000010000002121221121yyxxyxyxsssssssssssTTT''cossin011sincos0001cossinsincos1xyxyxyxy10**11101001dxyxybxbydxy复合变换----复合旋转1000)cos()sin(0)sin()cos(1000cossin0sincos1000cossin0sincos212121212222111121rrrTTT复合变换----关于F(xf,yf)点的缩放变换先把坐标系平移到(xf,yf),在新的坐标系下做比例变换,然后再将坐标原点平移回去。1)1()1(0000101000110000001010001fyfxyxffyxffsfysxsssyxssyxT复合变换----绕F(xf,yf)点的旋转变换先把坐标系平移到F(xf,yf),在新的坐标系下做旋转变换,然后再将坐标原点平移回去1sin)cos1(sin)cos1(0cossin0sincos10100011000cossin0sincos1010001ffffffffrfxyyxyxyxT四、程序调试及结果的分析本程序运行环境为VC下的MFC环境。实验代码:voidCZuobiaobianhuanView::OnCGpingyi()//平移{//TODO:Addyourcommandhandlercodeherefor(inti=0;i3;i++){pt[i].x+=5;//pt[i].y+=5;}RedrawWindow();}voidCZuobiaobianhuanView::OnCGxuanzhuan()//旋转变换{floatdangle=15.0*PI/180.0;for(inti=0;i3;i++){pt[i].x=(pt[i].x-500)*cos(dangle)-(pt[i].y-240)*sin(dangle)+500;pt[i].y=(pt[i].x-500)*sin(dangle)+(pt[i].y-240)*cos(dangle)+240;}//TODO:AddyourcommandhandlercodehereRedrawWindow();}voidCZuobiaobianhuanView::OnCGduicheng()//对称变换{//TODO:Addyourcommandhandlercodeherefor(inti=0;i3;i++){pt[i].x=2*500-pt[i].x;pt[i].y=pt[i].y;}RedrawWindow();}voidCZuobiaobianhuanView::OnCGshuofang()//缩放变换{//TODO:AddyourcommandhandlercodeherefloatdscaleX=1.1;floatdscaleY=1.1;for(inti=0;i3;i++){pt[i].x*=dscaleX;pt[i].y*=dscaleY;}RedrawWindow();}voidCZuobiaobianhuanView::OnCGcuoqiebianhuan()//错切变换{//TODO:Addyourcommandhandlercodehereintb=0,d=2;for(inti=0;i3;i++){pt[i].x=pt[i].x-500+b*(pt[i].y-240)+500;pt[i].y=pt[i].y-240+d*(pt[i].x-500)+240;}RedrawWindow();}voidCZuobiaobianhuanView::OnCGjianpan(){//TODO:Addyourcommandhandlercodehere//OnKeyDown(nChar,nRepCnt,nFlags);}voidCZuobiaobianhuanView::OnKeyDown(UINTnChar,UINTnRepCnt,UINTnFlags){//TODO:Addyourmessagehandlercodehereand/orcalldefaultinti=0;CPointtemp=pt[0];switch(nChar){caseVK_UP:for(i=0;i3;i++){pt[i].y-=5;}break;caseVK_DOWN:for(i=0;i3;i++){pt[i].y+=5;}break;caseVK_LEFT:for(i=0;i3;i++){pt[i].x-=5;}break;caseVK_RIGHT:for(i=0;i3;i++){pt[i].x+=5;}break;case0X5A:for(i=0;i3;i++){pt[i].x=(pt[i].x-500)*0.8+500;pt[i].y=(pt[i].y-240)*0.8+240;}break;case0X58:for(i=0;i3;i++){pt[i].x=(pt[i].x-500)*1.1+500;pt[i].y=(pt[i].y-240)*1.1+240;}break;case0X52:floatdangle=15.0*PI/180.0;for(inti=0;i3;i++){pt[i].x=(pt[i].x-500)*cos(dangle)-(pt[i].y-240)*sin(dangle)+500;pt[i].y=(pt[i].x-500)*sin(dangle)+(pt[i].y-240)*cos(dangle)+240;}break;}RedrawWindow();CView::OnKeyDown(nChar,nRepCnt,nFlags);}voidCZuobiaobianhuanView::OnDraw(CDC*pDC){CZuobiaobianhuanDoc*pDoc=GetDocument();ASSERT_VALID(pDoc);//TODO:adddrawcodefornativedatahereCPenPenRed(PS_SOLID,3,RGB(255,0,0));//定义红色笔pDC-SelectObject(&PenRed);pDC-MoveTo(pt[0]);pDC-LineTo(pt[1]);pDC-LineTo(pt[2]);pDC-LineTo(pt[0]);pDC-MoveTo(100,240);pDC-LineTo(900,240);pDC-MoveTo(500,5);pDC-LineTo(500,400);//yuandian(500,240)pDC-TextOut(15,10,平移变换,键盘方向键);pDC-TextOut(15,28,缩放变换,Z缩小,X放大);pDC-TextOut(15,46,旋转变换,键盘R键);pDC-TextOut(15,66,还可以根据上面的菜单栏中的图形变换进行选择);//OnKeyDown(nChar,nRepCnt,nFlags);}运行结果展示:原图:旋转变换后:对称变换后:错切变换后:实验十三维图形变换一、实验教学目标与基本要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现。二.理论基础实现三维图形的坐标系之间的变换(世界坐标、物坐标、屏幕坐标)以及三维图形几何变换。三.算法设计与分析三维变换变换矩阵1.平移变换若点(x*,y*,z*)是由点(x,y,z)在x,y和z轴方向分别移动距离Tx,Ty和Tz得到的,则这两点间的坐标关系为:x*=x+Txy*=y+Tyz*=z+Tz该式的矩阵形式为:111213142122232433132333441424344DaaaaaaaaTaaaaaaaa111213212223313233aaaaaaaaa比比例例、、错错切切、、旋旋转转变变换换10000100[*,*,*,1][,,,1]0010xyz1xyzxyzTTT2.比例变换设点(x,y,z)经过缩放变换后得到点(x*,y*,z*),这两点坐标间的关系为:x*=Sxx;y*=Syy;z*=Szz;其中,Sx,Sy,Sz分别为沿x轴,y轴和z轴方向放大或缩小的比例。它们可以相当,也可以不相等。上式的矩阵形式如下所示:3.旋转变换在右手坐标系下,设给定点的坐标为(x,y,z)=(rcosφ,rsinφ,z),则它绕z轴旋转α角后,得点(x`,y`,z`),则x`=rcos(φ+α)=xcosα–ysinα;y`=rsin(φ+α)=xsinα+ycosα;z`=z;所以,旋转变换对应的变换矩阵为:4.对称变换相对于xy平面对称:坐标变换后有x`=x,y`=y,z`=-z;则变换矩阵为:参数图形的几何变换对于一般的线框图,可以利用基于点的几何变换(前面所讲),但对于参数表示的点、曲线、曲面图形,通过基于点的几何变换进行变换,则