计算机图形学 图形的几何变换的实现算法教程文件
- 格式:doc
- 大小:106.00 KB
- 文档页数:7
实验三图形的二维几何变换一、实验目的了解齐次坐标规范化及矩阵的乘法运算熟悉掌握平移,比例,旋转,错切变换的齐次坐标矩阵掌握基于 Win32、Visual C++环境MFC绘制图形配置过程制过程二、实验原理及思想1.基本几何变换2.齐次坐标给定2D 坐标 (x, y), 引入第3维:[x, y, 1]通常, 一个 2D 坐标点的齐次坐标有如下形式:[x, y, W]两个齐次坐标点 [x, y, W] and [x’, y’, W’] 相同 if x = kx’eg: [2, 3, 6] = [4, 6, 12]y = ky’for some k ≠ 0 where k=2W = kW’因此,任意 [x, y, W] 可归一化:[x/W, y/W, 1]3.三、实验关键代码void C2DChangeView::ClearMatrix(double A[3][3])//清除变换矩阵{for(int i=0;i<3;i++){for(int j=0;j<3;j++)A[i][j]=0;}}void C2DChangeView::Draw(double D[][3],int n)//绘制图形{RedrawWindow();CClientDC dc(this);CPen pen,*pOldpen;pen.CreatePen(PS_SOLID,2,RGB(0,0,0));pOldpen=dc.SelectObject(&pen);for(int i=0;i<n;i++){if(i==0)dc.MoveTo(ROUND(MaxX/2+D[i][0]),ROUND(MaxY/2-D[i][1]));elsedc.LineTo(ROUND(MaxX/2+D[i][0]),ROUND(MaxY/2-D[i][1]));}dc.LineTo(ROUND(MaxX/2+D[0][0]),ROUND(MaxY/2-D[0][1]));dc.SelectObject(pOldpen);pen.DeleteObject();}void C2DChangeView::Calculate(double P0[][3],double T[][3])//两个矩阵相乘{double Ptemp[4][3];KeepMatrix(P,Ptemp);for(int i=0;i<4;i++)for(int j=0;j<3;j++)P[i][j]=Ptemp[i][0]*T[0][j]+Ptemp[i][1]*T[1][j]+Ptemp[i][2]*T[ 2][j];}void C2DChangeView::OnMENUleft()//向左平移{// TODO: Add your command handler code hereTmove(-10,0);}void C2DChangeView::OnMENUright()//向右平移{// TODO: Add your command handler code hereTmove(10,0);}void C2DChangeView::OnMENUup() //向上平移{// TODO: Add your command handler code hereTmove(0,10);}void C2DChangeView::OnMENUdown()//向下平移{// TODO: Add your command handler code hereTmove(0,-10);}void C2DChangeView::OnMENUClockwise()//顺时针旋转{// TODO: Add your command handler code hereTrotate(30);}void C2DChangeView::OnMENUAnticlockwise()//逆时针旋转{// TODO: Add your command handler code hereTrotate(-30);}void C2DChangeView::OnMENUIncrease()//放大比例{// TODO: Add your command handler code hereTscale(2,2);}void C2DChangeView::OnMENUDecrease()//缩小比例{// TODO: Add your command handler code hereTscale(0.5,0.5);}void C2DChangeView::OnMENUXdirectionplus()//X正向错切{// TODO: Add your command handler code hereTreform(0,1);}void C2DChangeView::OnMENUXdirectionneg()//X负向错切{// TODO: Add your command handler code hereTreform(0,-1);}void C2DChangeView::OnMENUITYdirectionplus()//Y正向错切{// TODO: Add your command handler code hereTreform(1,0);}void C2DChangeView::OnMENUYdirectionneg()//Y负向错切{// TODO: Add your command handler code hereTreform(-1,0);}void C2DChangeView::OnMENUReset() //复位{// TODO: Add your command handler code hereif(p3==4){KeepMatrix(OSquare,P);}if(p3==3){KeepMatrix(OTriangle,P);}if(p3==2){KeepMatrix(OLine,P);}Draw(P,p3);}void C2DChangeView::Tmove(double Tx,double Ty)//平移变换矩阵{ClearMatrix(TM);RedrawWindow();TM[0][0]=1;TM[1][1]=1;TM[2][0]=Tx;TM[2][1]=Ty;TM[2][2]=1;Calculate(P,TM);AfxGetMainWnd()->SetWindowText("二维几何变换-平移变换");Draw(P,p3);}void C2DChangeView::Tscale(double Sx,double Sy)//比例变换矩阵{ClearMatrix(TS);RedrawWindow();TS[0][0]=Sx;TS[1][1]=Sy;TS[2][2]=1;Calculate(P,TS);AfxGetMainWnd()->SetWindowText("二维几何变换-比例变换");Draw(P,p3);}void C2DChangeView::Trotate(double thta)//旋转变换矩阵{ClearMatrix(TR);RedrawWindow();TR[0][0]=cos(thta*PI/180);TR[0][1]=sin(thta*PI/180);TR[1][0]=-sin(thta*PI/180);TR[1][1]=cos(thta*PI/180);TR[2][2]=1;Calculate(P,TR);AfxGetMainWnd()->SetWindowText("二维几何变换-旋转变换");Draw(P,p3);}void C2DChangeView::Treflect(double Fx,double Fy)//反射变换矩阵{ClearMatrix(TF);RedrawWindow();TF[0][0]=Fx;TF[1][1]=Fy;TF[2][2]=1;Calculate(P,TF);AfxGetMainWnd()->SetWindowText("二维几何变换-反射变换");Draw(P,p3);}void C2DChangeView::Treform(double b,double c)//错切变换矩阵{ClearMatrix(TC);RedrawWindow();TC[0][0]=1;TC[0][1]=b;TC[1][0]=c;TC[1][1]=1;TC[2][2]=1;Calculate(P,TC);AfxGetMainWnd()->SetWindowText("二维几何变换-错切变换");Draw(P,p3);}void C2DChangeView::KeepMatrix(double Orig[][3],double Dest[][3]){int i,j;for(i=0;i<4;i++)for(j=0;j<3;j++)Dest[i][j]=Orig[i][j];}四、实验结果1. 初始图2 --平移(左移)2 --平移(下移)3 、缩放-——放大3 、缩放-——缩小4 、旋转5 、错切——X负向错切5 、错切——Y正向错切五、心得体会通过这次MFC对计算机图形的编程,进一步掌握了MFC的菜单的实现及其响应函数的实现。
数学与软件科学学院实验报告学期: 2010 至 2011 第一学期 2010年 11月 3日课程名称: 计算机图形学专业:信息与计算科学班级 2007级5班实验编号: 05 实验项目: 几何变换指导教师庞朝阳姓名:学号:200706005 实验成绩:一、实验目的及要求图形变换时计算机图形学的重要内容,在图形的生成、处理和现实过程中发挥着关键性的作用,同时,变换本身也是描述图形的一个有力工具。
通过这次的实验,要理解计算机图形学中几何变换的概念和作用,掌握几何变换的过程。
二、实验内容1、整理和总结关于几何变换的概念和作用。
2、掌握基本几何变换3、掌握组合几何变换在齐次坐标下的应用。
三、具体实验内容:1、几何变换的概念和作用:几何变换提供了构造和修改图形的一种方法,图形在位置、方向、尺寸和形状方面的改变都可以通过几何变换来实现。
几何变换的基本方法是吧变换矩阵作为一个算子,作用到图形一系列顶点的位置矢量,从而得到这些顶点在几何变换后的新的顶点序列,连接新的顶点序列即可得到变换后的图形。
2、基本几何变换:假设)yP表示三维空间上一个未被变换的点,而该点经过某种变换后得x(z,,到新的点用)'P表示。
yx,','('z①平移变换:如果点)','(zyx,P在x轴,y轴和z轴分别移动x∆、y∆、y,'('zxP是由点),z∆距离得到的,则两点坐标关系为:='+x∆xxy y y ∆+=' z z z ∆+=' 则矢量形式为:T P P +=' 其中⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=''''z y x P , ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=z y x P , ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡∆∆∆=z y x T ② 缩放变换:缩放变换改变物体的大小。
有坐标关系 x s x x =' y s y y =' z s z z ='其中,x s ,y s ,z s 分别为沿x ,y 和z 轴方向放大或缩小的比例。
计算机图形学图形⼏何变换的实现实验五图形⼏何变换的实现班级 08信计2班学号 20080502053 姓名杨少卿分数⼀、实验⽬的和要求:1、掌握⼆维图形⼏何变换的基本原理及⼆维图形的⼏何算法。
2、巩固所学理论知识,加深对⼆维变换的理解,加深理解利⽤变换矩阵可⽤简单图形得到复杂图形的理解。
3、通过编程完成⼆维图形的⼏何变换动态过程。
4、观察改变图形的形状、⼤⼩、位置等,其关键是坐标的变换。
⼆、实验内容:1、将四边形以原点为中⼼,以10度为间隔做360度旋转。
2、齿轮的边缘轮廓⽣成的⼏何变换,编制利⽤旋转变换绘制齿轮的程序。
3、⼏何图形变换算法(缩放、旋转和平移),编程实现⼆维图形齐次坐标变换的算法和组合变换的算法。
三、实验步骤1、将四边形以原点为中⼼,以10度为间隔做360度旋转。
程序代码:#include#include#include#includedouble sin(),cos();double xmax=639.0,ymax=399.0;double f[3][3],xx,yy;scx(double xi){int x;x=(int)(xi+xmax/2);return(x);}scy(double yi){int y;y=ymax-(int)(yi+ymax/2);return(y);}parallel(double dx,double dy){f[0][0]=1.0;f[0][1]=0.0;f[0][2]=0.0;f[1][0]=0.0;f[1][1]=1.0;f[1][2]=0.0;f[2][0]=dx;f[2][1]=dy;f[2][2]=1.0;}rotate(double theta){double th=theta/180*3.1415627;f[0][0]=cos(th);f[0][1]=sin(th); f[0][2]=0.0; f[1][0]=-sin(th); f[1][1]=cos(th); f[1][2]=0.0; f[2][0]=0.0; f[2][1]=0.0;f[2][2]=1.0;}scale(double s){f[0][0]=s;f[0][1]=0.0;f[0][2]=0.0;f[1][0]=0.0;f[1][1]=s;f[1][2]=0.0;f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;}taishox(){f[0][0]=1.0;f[0][1]=0.0;f[0][2]=0.0;f[1][0]=0.0;f[1][1]=-1.0;f[1][2]=0.0;f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;}taishoy(){f[0][0]=-1.0;f[0][1]=0.0;f[0][2]=0.0;f[1][0]=0.0;f[1][1]=1.0;f[1][2]=0.0;f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;}taishoo(){f[0][0]=-1.0;f[0][1]=0.0;f[0][2]=0.0;f[1][0]=0.0;f[1][1]=-1.0;f[1][2]=0.0;f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;}taishoxy(){f[0][0]=0.0;f[0][1]=1.0;f[0][2]=0.0;f[1][0]=1.0;f[1][1]=0.0;f[1][2]=0.0;f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;}axis(){line(scx(0),scy(-ymax/2),scx(0),scy(ymax/2)); line(scx(-xmax/2),scy(0.0),scx(xmax/2),scy(0.0)); }tuoq(double a,double b){f[0][0]=1.0;f[0][1]=b;f[0][2]=1.0;f[1][0]=a;f[1][1]=1.0;f[1][2]=0.0;f[2][0]=0.0;f[2][1]=0.0;f[2][2]=1.0;}affinex(double x,double y,double d){xx=x*f[0][0]+y*f[1][0]+f[2][0];return(xx);}affiney(double x,double y,double d){yy=x*f[0][1]+y*f[1][1]+f[2][1];return(yy);}main(){int graphdriver=DETECT,graphmode;static double x1[]={0.0,10.0,100.0,110.0,0.0}; static double y1[]={0.0,50.0,50.0,0.0,0.0};static double x2[5];static double y2[5];int i;double r,xx,yy;initgraph(&graphdriver,&graphmode,"");srand((unsigned)time(NULL));for(r=0;r<=360;r=r+10){rotate(r);for(i=0;i<=4;i++){x2[i]=affinex(x1[i],y1[i],1.0);y2[i]=affiney(x1[i],y1[i],1.0);}setcolor(RGB(rand()%256,rand()%256,rand()%256)); Sleep(80);for(i=0;i<=3;i++){line(scx(x2[i]),scy(y2[i]),scx(x2[i+1]),scy(y2[i+1]));}}getch();closegraph();}运⾏结果:截图:2、齿轮的边缘轮廓⽣成的⼏何变换。
实验五图形几何变换的实现班级08信计2班学号20080502050姓名张玉凤分数一、实验目的和要求:1、掌握图形的旋转变换数学原理。
2、掌握一般图形旋转的基本算法。
二、实验内容:1、画一个正方形,并实现45度旋转,进一步可以使之动起来。
2、二维图形变换,包含了平移变换和旋转变换,比例变换。
三、实验步骤1、画一个正方形,并实现45度旋转,进一步可以使之动起来.程序源代码:#include "dos.h"#include "math.h"#include "graphics.h"#include "bios.h"#include "stdlib.h"#include "stdio.h"#define PI 3.1415962void Rotating(){int x1=150 , y1=150;int x2=x1 , y2=y1+100;int n=180;double i=0;int rx1,rx2,ry1,ry2;int wid=100,hei=100;while(!kbhit()){setcolor(RED);line(150,300,450,300);line(150,300,150,10);outtextxy(140,305,"0");outtextxy(140,10,"y");outtextxy(450,305,"x"); /*标出x,y轴*/setcolor(GREEN);rx1=x1+wid*sin(i*360/n*PI/180);ry1=y1+hei*cos(i*360/n*PI/180);rx2=rx1;ry2=ry1+100;line(x1,y1,x2,y2);line(x1,y1,rx1,ry1);line(x2,y2,rx2,ry2);line(rx1,ry1,rx2,ry2);sleep(1);delay(15000);setcolor(YELLOW); /*显示正方形旋转后的痕迹*/line(x1,y1,x2,y2);line(x1,y1,rx1,ry1);line(x2,y2,rx2,ry2);line(rx1,ry1,rx2,ry2);i+=22.5;}}main(){int driver =VGA, mode=VGAHI;initgraph(&driver,&mode,"");Rotating();getch();closegraph();}运行结果:2.二维图形变换,包含了平移变换和旋转变换。
计算机图形学实验报告计算机图形学实验报告姓名徐沛华班级1011 学号20101851 成绩实验名称二维图形的几何变换1.对平面图形进行平移、缩放、旋转、对称实验目的实验步骤算法分析:图形变换是指对图形的几何信息经过几何变换后产生新的图形。
图形变换既可以看作坐标系不动而图形变动,变动后的图形在坐标系中的坐标值发生变化;也可以看作图形不动而坐标系变动,变动后,该图形在新的坐标系下具有新的坐标值。
设(x,y)为图形原坐标值,经几何变换后坐标值变为(**,x y)。
以下为四种常用的几何变换公式。
(a) 平移变换:平移变换在前面的任务中已经用到过,它的变换公式为:[]**100,,1,,1010,,11x yx yx y x y x T y TT T⎡⎤⎢⎥⎡⎤⎡⎤==++⎢⎥⎣⎦⎣⎦⎢⎥⎣⎦(b) 旋转变换:绕原点旋转的变换公式为:[][] **cos sin0,,1,,1sin cos0cos sin,sin cos,1001x y x y x y x yθθθθθθθθ⎡⎤⎢⎥⎡⎤=-=⋅-⋅⋅+⋅⎣⎦⎢⎥⎢⎥⎣⎦(c) 放缩变换:[]**00,,1,,100,,1001xy x ySx y x y S S x S y⎡⎤⎢⎥⎡⎤⎡⎤==⋅⋅⎣⎦⎣⎦⎢⎥⎢⎥⎣⎦几种变换可以组合在一起形成复合变换。
例如平移变换与旋转变换组合得到:(d) 相对点00(,)x y的旋转变换:[]**0000cos sin0 ,,1,,1sin cos0(1cos)sin(1cos)sin1 x y x yx y y xθθθθθθθθ⎡⎤⎢⎥⎡⎤=-⎣⎦⎢⎥⎢⎥-⋅+⋅-⋅-⋅⎣⎦ii、算法程序:void CZhouView::pingyi(){CClientDC dc(this);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y);dc.MoveTo(m_nPoint1.x+100,m_nPoint1.y+100);dc.LineTo(m_nPoint2.x+100,m_nPoint2.y+100);}void CZhouView::xuanzhuan(){CClientDC dc(this);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y);dc.MoveTo((m_nPoint1.x*cos(0.5))-(m_nPoint1.y*sin(0.5)),(m_nPoint 1.x*sin(0.5))+(m_nPoint1.y*cos(0.5)));dc.LineTo((m_nPoint2.x*cos(0.5))-(m_nPoint2.y*sin(0.5)),(m_nPoint2 .x*sin(0.5))+(m_nPoint2.y*cos(0.5)));}void CZhouView::bili(){CClientDC dc(this);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y);dc.MoveTo(m_nPoint1.x*2,m_nPoint1.y*2);dc.LineTo(m_nPoint2.x*2,m_nPoint2.y*2);}void CZhouView::XCQ(){CClientDC dc(this);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x+100,m_nPoint2.y);}void CZhouView::DC(){CClientDC dc(this);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y);dc.MoveTo(m_nPoint1.y,m_nPoint1.x);dc.LineTo(m_nPoint2.y,m_nPoint2.x);}dc.MoveTo(m_nPoint1.y,m_nPoint1.x);dc.LineTo(m_nPoint2.y,m_nPoint2.x);}void CZhouView::YCQ(){CClientDC dc(this);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y);dc.MoveTo(m_nPoint1.x,m_nPoint1.y);dc.LineTo(m_nPoint2.x,m_nPoint2.y+100); }//OnLButtonUp(UINT nFlags, CPoint point) case 8:pingyi();break;case 9:xuanzhuan();break;case 10:bili();break;case 11:XCQ();break;case 12:YCQ();break;case 13:DC();break;编译,运行:平移:。
实验五图形几何变换的实现班级 08信计2班学号 20080502057 姓名冯双捷分数一.实验目的和要求1.掌握二维、三维图形基本变换的变换原理;2.利用TurboC实现二维、三维图形的基本变换和符合变换3.屏幕显示变换过程和变换结果。
二.实验内容1.原程序实现二维图形(直线)的平移变换;=±(1)沿x轴的平移公式:'x x r=±(2)沿y轴的平移公式:'y y s2.源程序实现三维图形(立方体)的旋转变换和比例变换。
(1)旋转变换即图形围绕圆心逆时针旋转一定的角度;(2)比例变换即对象距圆点的距离按照一定比例进行变换。
三.实验结果分析1.二维平移程序代码#include <stdio.h>#include <graphics.h>#include <conio.h>int initjuzhen(m)int m[3][3];{int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)m[i][j]=0;for(i=0;i<3;i++)m[i][i]=1;}main(){int x0,y0,x1,y1,i,j;int a[3][3];char key;int graphdriver=DETECT;int graphmode=0;initgraph(&graphdriver,&graphmode," ");cleardevice();setcolor(2);x0=250;y0=120;x1=350;y1=220;line(x0,y0,x1,y1);for(;;){outtextxy(100,400,"<-:left ->:right^:up v:down Esc->exit");key=getch();initjuzhen(a);switch(key){case 75:a[2][0]=-10;break;case 77:a[2][0]=10;break;case 72:a[2][1]=-10;break;case 80:a[2][1]=10;break;case 27:exit();break;}x0=x0*a[0][0]+y0*a[1][0]+a[2][0];y0=x0*a[0][1]+y0*a[1][1]+a[2][1];x1=x1*a[0][0]+y1*a[1][0]+a[2][0];y1=x1*a[0][1]+y1*a[1][1]+a[2][1];clearviewport();line(x0,y0,x1,y1);}closegraph();}运行结果见文件夹:ERWEI2.三维图形旋转转换,比例变换程序代码:#include <stdio.h>#include <math.h>#include <graphics.h>#include <conio.h>#include <time.h>#include <ctype.h>#define ZOOM_IN 0.9#define ZOOM_OUT 1.1int turn1[3];typedef struct{float x;float y;float z;}point;typedef struct{float x;float y;}point2d;typedef struct{float x;float y;float h;point biao[8];}fanti;void make_box(float x,float y,float h,fanti *p) {p->x=x;p->y=y;p->h=h;p->biao[0].x=x/2;p->biao[0].y=y/2;p->biao[0].z=h/2;p->biao[1].x=-x/2;p->biao[1].y=y/2;p->biao[1].z=h/2;p->biao[2].x=-x/2;p->biao[2].y=-y/2;p->biao[2].z=h/2;p->biao[3].x=x/2;p->biao[3].y=-y/2;p->biao[3].z=h/2;p->biao[4].x=x/2;p->biao[4].y=y/2;p->biao[4].z=-h/2;p->biao[5].x=-x/2;p->biao[5].y=y/2;p->biao[5].z=-h/2;p->biao[6].x=-x/2;p->biao[6].y=-y/2;p->biao[6].z=-h/2;p->biao[7].x=x/2;p->biao[7].y=-y/2;p->biao[7].z=-h/2;}void turn2d(point *p,point2d *q){q->x=p->x+p->z*cos(0.25);q->y=p->y+p->z*sin(0.25);}void initm(float mat[][4]){int count;for(count=0;count<4;count++){mat[count][0]=0.;mat[count][1]=0.;mat[count][2]=0.;mat[count][3]=0.;mat[count][count]=1.;}return;}void transform(point *p,point *q,float tm[][4]){float xu,yv,zw,h;xu=tm[0][0]*p->x+tm[1][0]*p->y+tm[2][0]*p->z+tm[3][0];yv=tm[0][1]*p->x+tm[1][1]*p->y+tm[2][1]*p->z+tm[3][1];zw=tm[0][2]*p->x+tm[1][2]*p->y+tm[2][2]*p->z+tm[3][2];p->x=xu;p->y=yv;p->z=zw;return;}void rotationx(point *p,float alfa,float tm[][4]){float rad=0.0174532925;initm(tm);tm[1][1]=cos(rad*alfa);tm[1][2]=sin(rad*alfa);tm[2][1]=-tm[1][2];tm[2][2]=tm[1][1];return;}void rotationz(point *p,float alfa,float tm[][4]){float rad=0.0174532925;initm(tm);tm[0][0]=cos(rad*alfa);tm[0][1]=sin(rad*alfa);tm[1][0]=-tm[0][1];tm[1][1]=tm[0][0];return;}void rotationy(point *p,float alfa,float tm[][4]) {float rad=0.0174532925;initm(tm);tm[0][0]=cos(rad*alfa);tm[2][0]=sin(rad*alfa);tm[0][2]=-tm[2][0];tm[2][2]=tm[0][0];return;}void adjust(point *p,point *q){float t[4][4];switch(turn1[0]){case 1:rotationy(p,2,t);transform(p,q,t);break;case -1:rotationy(p,-2,t);transform(p,q,t);break;default:break;}switch(turn1[1]){case 1:rotationz(p,2,t);transform(p,q,t);break;case -1:rotationz(p,-2,t);transform(p,q,t);break;default:break;}switch(turn1[2]){case 1:q->x=ZOOM_IN*p->x;q->y=ZOOM_IN*p->y;q->z=ZOOM_IN*p->z;break;case -1:q->x=ZOOM_OUT*p->x;q->y=ZOOM_OUT*p->y;q->z=ZOOM_OUT*p->z;break;default:break;}}void drawbox(fanti *p){point2d fan2d[8];int i;for(i=0;i<=7;i++){adjust(&p->biao[i],&p->biao[i]);turn2d(&p->biao[i],&fan2d[i]);fan2d[i].x+=300;fan2d[i].y+=200;}clearviewport();setcolor(2);outtext("\n ->:right\n <-:left\n ^:up\n v:down");moveto(0,10);outtext("\n page up:zoom in\n page down:zoom out\n space:Redraw\n Esc:exit");for(i=0;i<=3;i++){if(i==3){line(fan2d[i].x,fan2d[i].y,fan2d[0].x,fan2d[0].y);line(fan2d[i+4].x,fan2d[i+4].y,fan2d[4].x,fan2d[4].y);}else{line(fan2d[i].x,fan2d[i].y,fan2d[i+1].x,fan2d[i+1].y);line(fan2d[i+4].x,fan2d[i+4].y,fan2d[i+5].x,fan2d[i+5].y);}line(fan2d[i].x,fan2d[i].y,fan2d[i+4].x,fan2d[i+4].y);}}void main(){int gd=DETECT,gm,i,j;char key;float x,y,h;fanti a1;x=100;y=100;h=100;initgraph(&gd,&gm," ");make_box(x,y,h,&a1);drawbox(&a1);for(;;){turn1[0]=0;turn1[1]=0;turn1[2]=0;key=getch();switch(key){case 77:turn1[0]=1;break;case 75:turn1[0]=-1;break;case 72:turn1[0]=1;break;case 80:turn1[0]=-1;break;case 73:turn1[2]=1;break;case 81:turn1[2]=-1;break;case 32:make_box(x,y,h,&a1);break;case 27:exit();break;default:key=0;break;}if(key!=0)drawbox(&a1);}closegrapg();}运行结果见文件夹:SANWEI3.分析使用矩阵保存图形的坐标位置的方法,二维图形的平移就是一个坐标位置移到另一个坐标位置的重定位过程;对于三维的图形的旋转变换就是图形相应的矩阵进行角度的初等变换,而比例变换即是图形矩阵的相应比例变换。
计算机图形学图形的几何变换的实现算法实验二 图形的几何变换的实现算法班级 08信计 学号 59 姓名 分数一、实验目的和要求:1、掌握而为图形的基本几何变换,如平移,旋转,缩放,对称,错切变换;。
2、掌握OpenGL 中模型变换函数,实现简单的动画技术。
3、学习使用OpenGL 生成基本图形。
4、巩固所学理论知识,加深对二维变换的理解,加深理解利用变换矩阵可由简单图形得到复杂图形。
加深对变换矩阵算法的理解。
编制利用旋转变换绘制齿轮的程序。
编程实现变换矩阵算法,绘制给出形体的三视图。
调试程序及分析运行结果。
要求每位学生独立完成该实验,并上传实验报告。
二、实验原理和内容:. 原理:图像的几何变换包括:图像的空间平移、比例缩放、旋转、仿射变换和图像插值。
图像几何变换的实质:改变像素的空间位置,估算新空间位置上的像素值。
图像几何变换的一般表达式:[,][(,),(,)]u v X x y Y x y = ,其中,[,]u v 为变换后图像像素的笛卡尔坐标, [,]x y 为原始图像中像素的笛卡尔坐标。
这样就得到了原始图像与变换后图像的像素的对应关系。
平移变换:若图像像素点 (,)x y 平移到 00(,)x x y y ++,则变换函数为0(,)u X x y x x ==+,0(,)v Y x y y y ==+,写成矩阵表达式为:00x u x y v y ⎡⎤⎡⎤⎡⎤=+⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦其中,x 0和y 0分别为x 和y 的坐标平移量。
比例缩放:若图像坐标 (,)x y 缩放到( ,x y s s )倍,则变换函数为:00x y s u x s v y ⎡⎤⎡⎤⎡⎤=⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦ 其中, ,x y s s 分别为x 和y 坐标的缩放因子,其大于1表示放大,小于1表示缩小。
旋转变换:将输入图像绕笛卡尔坐标系的原点逆时针旋转θ角度,则变换后图像坐标为:cos sin sin cos u x v y θ-θ⎡⎤⎡⎤⎡⎤=⎢⎥⎢⎥⎢⎥θθ⎣⎦⎣⎦⎣⎦内容:1、对一个三角形分别实现平移,缩放旋转等变化。
2. 在方向、尺寸和形状方面的变换是用改变对象坐标描述的几何变换来完成的。
基本几何变换都是相对于坐标原点和坐标轴进行的几何变换,有平移、旋转、缩放、反射、错切等。
用直线命令画出一个齿(或六边形的一半)→利用旋转变换或对称变换矩阵 实现对其余部分的绘制→调试运行程序→输出图形→分析结果→结束。
编写三维变换算法程序→检查程序的正确性→分段调试程序→输入给出的三维形体各顶点的坐标→执行变换→对算法程序进行必要的调整→更换不同的形体数据继续变换→结束。
3.用实验一的方法解决这个问题,某三角形的三个点点坐标为{5.0.0.25.0},{150.0.25.0},{100.0.100.0},创建一个长度分别为600,600的窗口,窗口的左上角位于屏幕坐标(100,100)处。
然后绘制一个由上述顶点所绘制的三角形,实现该三角形进行下列几何变换:首先使三角形沿着其中心的x 轴和y 轴方向缩小50%,然后沿着出示中心旋转90度;最后沿着y 轴平移100个单位。
三、实验代码如下1实验一#include <GL/glut,h>#include <stdlib.h>Void init (void){glClearVolor (0.0,0.0,0.0,0.0); glShadeModel (GL-FLAT);}Void draw_triangle(void){glBegin(GL_LINE_LOOP);glVertex2f(0.0,25.0);glVertex2f(25.0,-25.0);glVertex2f(-25.0,-25.0);glEnd();}Void display(void){glClear (GL_COLOR_BUEFER_BIT);glColor3f(1.0,1.0,1.0);glLoadIdentity();glColor3f(1.0,1.0,1.0);draw_triangle();glEnable (GL_LINE_STIPPLE);glLineStipple (1,0xF0F0);glLoadIdentity();glTranslatef (-20.0,0.0,0.0);draw_triangle();glLineStipple (1,0xff00);glLoadIdentity ();glScalef (1.5,0.5,1.0);draw_triangle ();glLineStipple (1,0x8888);glLoadIdentity();glRotatef(90.0,0.0,0.0,1.0);draw_triangle ();glDisable (GL_LINE_STIPPLE);glFlush();}Void reshape (int w,,nt h){glViewport (0,0,(GLsizei) w,(GLsizei) h); glMatrixMode (GL_PROJECTION); glLoadIdentity ();if (w<=h)gluOrtho2D(-50.0,50.0,-50.0*(GLfloat)h/(GLfloat)w,50.0*(GLfloat)h/(GLfloat)w); glMatrixMode(GL_MODELVIEW);}int main (int argc,char**argv){glutInit(&argc,argv);glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);glutInitWindowSize (500,500);glutInitWindowPosition (100,100);glutCreatWindow (argv[0]);init ();glutDisplayFunc (display);glutReshapeFunc (reshape);glutMainLoop();return 0;}实验结果如下2实验二代码#include<graphics.h>#include<math.h>inta[14][4]={{30,0,0,1},{30,40,0,1},{0,40,0,1},{0,40,10,1},{0,30,30,1}, {0,0,30,1},{30,0,30,1},{30,10,30,1},{10,10,30,1},{10,30,30,1},{10,40 ,10,1},{10,10,10,1},{30,10,10,1},{30,40,10,1}};float t[4][4],p[14][4];void a400(){int i,j;for(i=0;i<4;i++)for(j=0;j<4;j++)t[i][j]=0;}void a500(){ int k,i,j;for(i=0;i<14;i++){for(j=0;j<4;j++){p[i][j]=0;for(k=0;k<4;k++)p[i][j]=p[i][j]+a[i][k]*t[k][j];}p[i][0]=p[i][0]+280;p[i][1]=-p[i][1]+180;}setcolor(9);moveto(p[0][0],p[0][1]);for(i=0;i<14;i++)lineto(p[i][0],p[i][1]);line(p[6][0],p[6][1],p[0][0],p[0][1]);line(p[7][0],p[7][1],p[12][0],p[12][1]); line(p[8][0],p[8][1],p[11][0],p[11][1]); line(p[9][0],p[9][1],p[4][0],p[4][1]);line(p[10][0],p[10][1],p[3][0],p[3][1]); line(p[13][0],p[13][1],p[10][0],p[10][1]); line(p[1][0],p[1][1],p[13][0],p[13][1]); getch();}main(){int driver,mode,i,j;driver=DETECT;initgraph(&driver,&mode,"d:\\tc"); setbkcolor(3);a400();t[0][0]=0.7071*3;t[0][1]=-0.4082*3;t[1][0]=-0.7071*3;t[1][1]=-0.4082*3;t[2][1]=0.8165*3;t[3][3]=1;a500();closegraph();}实验结果实验三结果三、实验结果分析. 1、该程序实现了而为图形的简单几何变换,包括平移,缩放旋转等。
2、平移变换时最简单的变换,错切变换实际上是用比例因子乘对象的每一坐标和增加位移值。
3、上面所讨论的图形变换时相对于坐标原点或坐标轴来进行的。
实际中,常常需要相对于人一点或任一轴来进行变换。