实验三 2D图形变换

合集下载

工学cad二维图形变换PPT教案学习

工学cad二维图形变换PPT教案学习

A T C
B D
A

T
C
第25页/共40页M
B 0 D 0 N 1
平移变换矩阵
平移变换矩阵为
1 0 0
T
0
1 0
M N 1
X * Y * 1 X Y 1T X M Y N 1
X* X M
Y*
Y
N
M为沿X方向的平移量,N为沿Y方向的平移量。
第26页/共40页
二维图形的变换矩阵
X
C=-B;D=A 输入旋转角ZJ,即可 按要求画出图形了。
第24页/共40页
六、平移变换及齐次坐标
平移变换是二维变换中最基本的一种,但是,
一般的矩阵不能完成平移变换。原因是平移为
X* X M
Y*
Y
N
一般矩阵的任何积都不能找到上述关系,在此引入一个附加坐标,使
X Y → X Y 1
X * Y * → X * Y * 1
第9页/共40页
对矩形的四个角点进行赋值 。
二维图形变换程序(续)
setcolor(getmaxcolor()); xmax = getmaxx(); ymax = getmaxy(); /* draw a diagonal line */ line(0, 0, 0, ymax); line(0, ymax, xmax,
变换矩形为
1 0 T C 1
X *
Y * X
Y C1
0 1
X
CY
Y
X * X CY
Y* Y
错切结果如右图所示,在图中
tg CY / Y C C tg
第20页/共40页
CY
Y
X
沿X正负方向的错切

二维图形变换

二维图形变换
图形变换
图形变换
图形变换是计算机图形学基础内容之一。 内容: 几何变换; 视图变换; 投影变换。 作用: 把用户坐标系与设备坐标系联系起来; 可由简单图形生成复杂图形; 可用二维图形表示三维形体; 动态显示。
图形变换的基本原理是: (1)图形的拓扑关系不变; (2)图形的几何关系可以改变。 所谓图形拓扑关系不变是指图形的连边规则不变, 即原来是相邻的点变换后依然相邻,原来不相交的 线变换后依然不相交。
0 0 1
x
△x
错切变换(1)
y
O
x
y
O
x
y
O
x
(d)沿+y方向错切 (e)沿-y方向错切
(f)沿+x和+y方向错 切
(2)沿 y 轴方向关于 x 轴错切
将图形上关于x轴的平行线沿y方向推成Ψ角的倾斜线, 而保持x坐标不变。
几何关系
y
x' x
y' y y
△y
令 b ctg y xctg bx
)
r
cos
sin
+r
sin
cos
将式(5-11)代入式(5-12)得:
x' x cos y sin
y'
x
sinLeabharlann ycos矩阵形式
x
y x
y
cos sin
sin
cos
(5-12) (5-13) (5-14)
5.2.3 齐次坐标(homogeneous coordinates)技术
(x1, x2 ,...,xn ,)
(x1 , x2 ,..., xn , )
有n+1个分量的向量 哑元或标量因子

计算机图形学实验3------二维几何变换

计算机图形学实验3------二维几何变换

实验三图形的二维几何变换一、实验目的了解齐次坐标规范化及矩阵的乘法运算熟悉掌握平移,比例,旋转,错切变换的齐次坐标矩阵掌握基于 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的菜单的实现及其响应函数的实现。

实验三 2D图形变换

实验三 2D图形变换

实验三 2D图形变换一、实验目的1、了解和掌握2D图形变换-学会使用OPENGL平移、旋转和比例缩放函数。

2、掌握基本图形变换和复合图形变换实现的方法。

二、实验内容与要求要求使用OpenGL几何变换函数改变当前2D图形:(1) 使用 glTranslatef()函数,实现2D图形平移,如图4-1所示。

a)平移前 b)平移后图4-1(2) 使用 glRotatef()函数,实现2D图形绕平面固定点旋转,如图4-2所示。

a)旋转前 b)旋转后图4-2(3) 使用 glScalef()函数,实现缩放2D图形绕固定点缩放,在前面程序基础上设计修改,如图4-3所示。

a)缩放前 b)缩放后图4-3(4)参考函数:1、gltranslatef(x,y,z)函数,x,y,z分别代表x,y,z方向的平移量,对于2D图形,z=0。

2、glrotatef(Q,x,y,z)函数,q为逆时针方向旋转的角度度数(0~360),(x,y,z)为旋转轴的方向矢量,(x,y,z)=(0,0,1)时代表沿Z轴方向旋转;(x,y,z)=(1,0,0)代表沿x轴方向旋转;(x,y,z)=(0,1,0)代表沿y轴方向旋转。

3、glscalef(x,y,z)函数,x,y,z分别表示x,y,z方向的比例因子。

对于2D图形,z=0。

比例因子取-1时,产生对称变换。

(5)代码示例1)某图形沿水平方向垂直方向分别平移Tx,Ty段距离清屏glMatrixMode(GL_MODELVIEW); //设置矩阵模式为模型变换模式,表示在世界坐标系下glLoadIdentity(); //将当前矩阵设置为单位矩阵glTranslatef(Tx,Ty,0);DrawSomeShape();刷新2)某图形绕任意点(cx,cy)旋转ALPHA清屏glMatrixMode(GL_MODELVIEW); //设置矩阵模式为模型变换模式,表示在世界坐标系下glLoadIdentity(); //将当前矩阵设置为单位矩阵glTranslatef(cx,cy,0);glRotatef(ALPHA,0,0,1);glTranslatef(-cx,-cy,0);DrawSomeShape();刷新3)某图形绕任意点(cx,cy)缩放Sx,Sy比例因子清屏glMatrixMode(GL_MODELVIEW); //设置矩阵模式为模型变换模式,表示在世界坐标系下glLoadIdentity(); //将当前矩阵设置为单位矩阵glTranslatef(cx,cy,0);glScalef(Sx,Sy,1);glTranslatef(-cx,-cy,0);DrawSomeShape();刷新//样本程序:绘制六边形#include<glut.h>#include<math.h>#define PI 3.14159 //设置圆周率int n=6, R=10; //多边形变数,外接圆半径float theta=0.0; //旋转初始角度值void Display(void);void Reshape(int w, int h);void main(int argc, char** argv){ glutInit(&argc, argv); //初始化GLUT库;glutInitWindowSize(700,700); //设置显示窗口大小glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //设置显示模式;(注意双缓冲)glutCreateWindow("A Square"); // 创建显示窗口glutDisplayFunc(Display); //注册显示回调函数glutReshapeFunc(Reshape); //注册窗口改变回调函数glutMainLoop(); //进入事件处理循环}void Display(void){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0,0,0); //设置红色绘图颜色glBegin(GL_POLYGON); //开始绘制六边形for (int i=0;i<n;i++)glVertex2f( R*cos(theta+i*2*PI/n), R*sin(theta+i*2*PI/n));glEnd();glutSwapBuffers(); //双缓冲的刷新模式;}void Reshape(GLsizei w,GLsizei h){glMatrixMode(GL_PROJECTION); //投影矩阵模式glLoadIdentity(); //矩阵堆栈清空gluOrtho2D(-1.5*R*w/h,1.5*R*w/h,-1.5*R,1.5*R); //设置裁剪窗口大小glViewport(0,0,w,h); //设置视区大小glMatrixMode(GL_MODELVIEW); //模型矩阵模式}。

计算机图形学二维图形变换

计算机图形学二维图形变换

宁夏师范学院数学与计算机科学学院《计算机图形学》实验报告实验序号:7 实验项目名称:二维图形变换菜单菜单项ID值图形变换(&T)缩放(&Z)ID_TRANSFORM_SCALE图形变换(&T)旋转(&R)ID_TRANSFORM_ROTATE图形变换(&T)对称(&S)ID_TRANSFORM_SYMMETRY 4、在CTransView视图类中添加消息映射函数;对象消息函数ID_TRANSFORM_SCALE COMMAND OnFigureCirleID_TRANSFORM_ROTATE COMMAND OnFigureEllipseID_TRANSFORM_SYMMETRY COMMAND OnTransformSymmetry5、添加自定义的成员变量:CPoint Pt[3]; //三角形定点数组float dAngle; //每一次旋转的角度在视图类CPP文件的构造函数中初始化成员变量Pt[0].x = 540; Pt[0].y = 220;Pt[1].x = 670; Pt[1].y = 130;Pt[2].x = 560; Pt[2].y = 120;dAngle = 0;6、在视图类的OnDraw()函数中加入下列代码,实现视图绘图。

void CTransView::OnDraw(CDC* pDC){CTransDoc* pDoc = GetDocument();ASSERT_VALID(pDoc);// TODO: add draw code for native data here//绘出以以(540,220)、(670,130)、(560,120)为顶点的三角形。

pDC->MoveTo(Pt[0]);pDC->LineTo(Pt[1]);三、运行结果变换前:对称变换:缩放变换:旋转变换:五、教师评语成绩签名:日期:年月日。

计算机图形 二维变换

计算机图形 二维变换

几何图形变换和函数曲线的画法一、实验目的和要求1、巩固所学理论知识,加深对二维变换的理解,加深理解利用变换矩阵可由简单图形得到复杂图形,加深对变换矩阵算法的理解。

2、熟悉vc++6.0下实践图形算法(要求编制绘制“M ” 以及正叶线和蝴蝶结的程序。

编程实现变换矩阵算法,绘制给出变换后的视图,调试程序及分析运行结果。

)二、实验步骤1、实验内容(含实验原理介绍):(1)二维几何变换:原理:图形变换的主要功能是把用户坐标系和图形输出设备的坐标系联系起来;图形基本变换是指图形的比例变换、对称变换、错切变换、平移变换等。

通过对原图上二维向量引进第三个坐标,即三维点向量(又称其次坐标点),简称其次坐标,这样在三维坐标下,二维几何变换都可统一用一个矩阵表示。

所谓其次坐标就是将一个原本是n 维的向量用一个n+1维向量来表示。

引进其次坐标的的优点:①、提供了矩阵运算把二维、三维甚至高维空间中的一个点集从一个坐标系变换到另一个坐标系的有效方法;②、可以表示无穷远点。

步骤:①创建工程名为“二维图形变换”的单文档应用程序的框架。

并编辑菜单资源(如下图)②添加消息处理函数。

利用Class Wizard(建立类向导)为应用程序添加与菜单项的消息处理函数,ClassName 栏中选择CMyView ,建立消息映射函数,完成函数声明。

③手工添加几何变换绘图基类。

为程序模块化,对绘制几何图形变换编制了基类Header File ,在“文件”名称输入栏中输入MyClass ;同样,在工程中选择“文件” “新建”命令,在弹出的新建对话框中,选择C/C++ Source File ,在“文件”名称输入栏中输入MyClass 。

在工作区中系统自动创建的相应的空文件中,分别添加此基类的头文件(.h 文件)和应用文件(.cpp 文件)。

(2)正叶线和蝴蝶结:正叶线是一种类似植物叶子形状的曲线,数学表达式:r=a*sin(n*θ)x=r*cos θy=r*sin θ其中(a>0,n=2,3,4,5……)蝴蝶结,顾名思义即类似于蝴蝶结的图案。

「二维图形变换」教案:针对平面几何,介绍视觉图形的平移、旋转、翻转等变换方式及其位置作用

「二维图形变换」教案:针对平面几何,介绍视觉图形的平移、旋转、翻转等变换方式及其位置作用

二维图形变换是平面几何中不可避免的一个环节。

它是指将一个平面上的图形,按照一定的规则进行平移、旋转、翻转等操作,从而新生成一个以原图形为基础的图形,这一系列操作就叫做二维图形变换。

在图形学、计算机视觉、计算机图形学、技术、动画等领域都有广泛的应用。

本文将介绍视觉图形的平移、旋转、翻转等变换方式及其位置作用。

一、平移变换平移变换是指将图形沿着某个方向移动一定的距离。

在平移变换中,原始图形的形状和大小保持不变,只是位置发生变化。

[pic1.png]上图中的矩形为原始图形,向右移动5个单位长度后得到的新图形为平移后的图形。

可以看出,平移后的图形与原始图形形状相同,只是位置发生了变化。

二、旋转变换旋转变换是指将图形绕着某个点旋转一定的角度。

在旋转变换中,原始图形的大小和形状保持不变,只是位置和方向发生了变化。

[pic2.png]上图中的矩形为原始图形,绕点A逆时针旋转45°后得到的新图形为旋转后的图形。

可以看出,旋转后的图形与原始图形大小和形状相同,只是方向偏转了45°。

三、翻转变换翻转变换是指将图形绕着某个轴对称翻转。

在翻转变换中,原始图形的大小和形状保持不变,只是位置和方向发生了变化。

[pic3.png]上图中的矩形为原始图形,绕着红色虚线所示的轴对称翻转后得到的新图形为翻转后的图形。

可以看出,翻转后的图形与原始图形大小和形状相同,只是方向发生了变化。

四、位置作用在二维图形变换中,原始图形和变换后的图形在位置上是有一定关系的。

例如,在平移变换中,原始图形向右平移5个单位长度,所得到的新图形的位置就比原始图形向右偏移了5个单位长度。

但是,若考虑到坐标系的影响,则需对图形的顶点进行坐标变换。

以平移变换为例,设原图形的四个点坐标为(x1, y1)、(x2, y2)、(x3, y3)、(x4, y4),平移距离为(dx, dy),则其变换后的新点坐标为(x1+dx, y1+dy)、(x2+dx, y2+dy)、(x3+dx, y3+dy)、(x4+dx, y4+dy)。

实验三 几何图形变换实验

实验三 几何图形变换实验
这意味着物体在视点前面时far和near都为负值,物体在视点后面时far和near都为正值。
另一个函数是:
void gluOrtho2D(GLdouble left,GLdouble right,GLdouble bottom,GLdouble top)
它是一个特殊的正射投影函数,主要用于二维图像到二维屏幕上的投影。它的near和far缺省值分别为-1.0和1.0,所有二维物体的Z坐标都为0.0。因此它的裁剪面是一个左下角点为(left,bottom)、右上角点为(right,top)的矩形。
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
init ();
glutDisplayFunc(display);
glutReshapeFunc(reshape);
glutMainLoop();
{
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);//使用双缓存模式
glutInitWindowSize (500, 500);
glutInitWindowPosition (100, 100);
glutCreateWindow (argv[0]);
三、实验内容
1、下面的代码采用GLUT库,使用了双缓存,在按下鼠标左键后,程序在空闲时一直不停地调用spinDisplay函数,实现了一个矩形在窗口中匀速转动(单击鼠标右键停止转动)。请修改代码,实现矩形在窗口内沿着水平线移动。
/*
* double.c

二维图形几何变换

二维图形几何变换

《计算机图形学》实验报告题目:二维图形几何变换院、系(院):计算机科学与技术学院专业及班级:姓名:学号:日期:1.实验目的1)掌握3*3矩阵乘法运算的编程实现;2)掌握平移,比例,旋转三种基本二维几何变换矩阵生成; 3)掌握相对于任意参考点的二维复合变换矩阵生成。

2.实验要求1)设计实现二维图形变换类,具有平移,比例,旋转二维几何变换功能,以及相对于任意参考点的二维复合变换功能;2)将2.2节直线类所绘制的菱形线框,绕最上端A 点匀速旋转,并要求相对于A 点来回缩放;3)使用双缓冲机制进行图形绘制,避免运动闪烁,所有图形先绘制到用户自定义的DC ,绘制完成后再统一拷贝到屏幕DC 。

3.详细设计3.1核心算法及类型设计平移变换矩阵:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=1010001Tt ty tx 旋转变换矩阵:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=100cos sin 0sin cos Tr αααα比例变换矩阵:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=1000000sy sx Ts相对于任意参考点的旋转变换矩阵:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡∙⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-∙⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=1010001100cos sin 0sin cos 1010001T ty tx ty tx fr αααα 相对于任意参考点的比例变换矩阵:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡∙⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡∙⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=101000110000001010001T ty tx sy sx ty tx fs3.2程序设计实现及流程开始定义变量a,A,points[4], s,step,tans,theta,*line 设置坐标系, 绘制双缓冲机制, 绘制坐标轴。

200→a, (0,a)→A,points[0].x ←0, points[0].y ←a; points[1].x ←a, points[1].y ←0; points[2].x ←0, points[2].y ←-a; points[3].x ←-a,points[3].y ←0;s+step →s;tans.ScalePoint(s,s,A); theta=0.0;tans.RotatePoint(theta,A);-step →step;结束(s>=2.0||s<=0.5)theta>=360.0theta=0.0绘制菱形的AB,BC,CD,DA 四条边拷贝内存图到屏幕Invalidate(FALSE)4.典型测试结果5.实验问题总结通过本次试验让我有一次对MFC有了进一步的了解,在本次实验中我也遇到了一些错误,但是经过后来我和同学的讨论也得到了改正,本次试验让我进一步熟悉了二维图形几何变换的过程及变换矩阵。

二维图形的简单变换

二维图形的简单变换

---------------------------------------------------------------最新资料推荐------------------------------------------------------二维图形的简单变换学年设计报告设计题目:用 C 语言实现简单 2D图形的绘制和变换作者姓名:王兴超王天祥张涛朱龙飞席晓东所学专业:网络工程专业指导老师:赵瑞斌2019 年年 9 月月 2 号学年设计任务书学年设计题目用 C 语言实现简单 2D图形的绘制和变换组长王兴超学号2019211311 班级 11 网工(二)班组别软件第二组专业网络工程组员王兴超、王天祥、张涛、朱龙飞、席晓东指导教师赵瑞斌学年设计目的合理运用所学专业课(C 语言)设计一些小程序来解决实际问题学年设计所需环境微机房 YF3503 学年设计任务要求利用 C 语言编写代码进行图形变换学年设计工作进度计划序号起止日期工作内容分工情况 1 7.1~7.15 分析题目,查找并学习几何变换的相关知识全体成员 2 7.16~8.1 学习并熟悉 graphics.h 库函数绘制图形的方法与技巧王兴超,张涛,王天祥,朱龙飞 3 8.2~8.15 实现一些简单变换的思路,实行平移变换、比例变换、旋转变换等. 席晓东查找资料,王兴超,张涛代码1 / 22实现 4 8.16~8.25 总体界面与主函数的设计朱龙飞,王天祥,席晓东 5 8.26~8.28 对代码进行整体测试修改王兴超,张涛 6 8.29~9.2 完成设计报告王兴超,朱龙飞,王天祥教研室审核意见:教研室主任签字:年月日目录摘要 ........................................................ ........................................................... .............................................. 1 1 绪论 ........................................................ ........................................................... .......................................... 1 1.1 设计背景与意义 ........................................................ ........................................................... ............ 1 1.2 系统结构 ........................................................ ........................................................... ........................ 1 2 问题描述 ........................................................ ........................................................... .................................. 2 3 分---------------------------------------------------------------最新资料推荐------------------------------------------------------ 析 ........................................................ ........................................................... .......................................... 2 3.1 平移变换 ........................................................ ........................................................... ........................ 2 3.2 比例变换 ........................................................ ........................................................... ....................... 2 3.3 旋转变换 ........................................................ ........................................................... ....................... 2 4 设计实现 ........................................................ ........................................................... .................................. 3 4.1 加载页面 ........................................................ ........................................................... ....................... 3 4.2 画出三角形 ........................................................ ........................................................... .................... 3 4.3 对三角形进行平移变3 / 22换 ........................................................ ..........................................................4 4.4 对三角形进行比例变换 ........................................................ ..........................................................6 4.5 对三角形进行旋转变换 ........................................................ ..........................................................7 4.6 画出所要的矩形 ........................................................ ........................................................... ........... 7 4.7 矩形进行平移变换 ........................................................ ........................................................... ....... 8 4.8 矩形进行比例变换 ........................................................ ........................................................... ..... 10 4.9 矩形进行旋转变换 ........................................................ ........................................................... ..... 11 4.10 圆对圆形进行变换选择 ........................................................---------------------------------------------------------------最新资料推荐------------------------------------------------------ (12)4.11 画出的圆形进行平移 ........................................................ ..........................................................13 4.12 对画出的圆形进行比例变换 ........................................................ ............................................... 14 4.13 主程序 ........................................................ ........................................................... ........................ 14 5.运行结果 ........................................................ ........................................................... .............................. 15 5.1 加载页面 ........................................................ ........................................................... ................... 15 5.2 目录界面进行选择。

二维三维图形的变换原理和算法

二维三维图形的变换原理和算法
在这种表示法中,n维向量的变换是在n+1 维的空间进行的,变换后的n维结果是被 反投回到感兴趣的特定的n维空间内得到 的。
图形变换的基本原理
采用了齐次坐标表示法以后,我们可以把二维 的线性变换表示成如下规格化的形式:
a1 a2 0 [x* y* 1]=[x y 1] b1 b2 0
其中: a1 a2 0
图形变换的基本原理
从图形上来看,两种表示方法是没有实质性差别 的。但却为后面矩阵运算的实现提供了可行性和 方便。
Z Z=1
Y X
图形变换的基本原理
这种用三维的向量来表示一个二维向量, 进一步推广来说,用一个 n+1维的向量来 表示 n 维向量的方法,叫做齐次坐标表示 法。(注意,增加的一维是常数 1)
比例变换
比例变换
– 下面讨论缩放因子a1,b2 对图形变换的影响:
• a1 = b2 = 1, 为恒等变换,即变换后点的坐标不变。 • a1 = b2 ≠1,则为等比例变换。
–a1 = b2 >1,图形沿 x 和 y 两个方向等比例放大。 –0 < a1 = b2 <1,图形沿 x 和 y 两个方向等比例例缩小。
0 01
错切变换
错切变换
Y
Y
– 沿 x 向错切变换结果:
x* = x + b1y
y* = y
X
– 从以上结果(a可) 以原看图 到:
X
(b) 沿x方向错切
• 新有图值形的各基顶础点上的增加y 坐了标一图没个6有增-7变量,△错而x,切x这变坐个换标增是量在是原坐
标值 y 的正比例函数(△x = b1y)。所以使得整 个图形在等高的前提下,沿 x 向发生了倾斜,倾 斜角度 ( tan = b1y/y =b1)。

二维形的变换认识平移旋转和翻转等变换

二维形的变换认识平移旋转和翻转等变换

二维形的变换认识平移旋转和翻转等变换二维形的变换认识平移、旋转和翻转等变换在数学中,平移、旋转和翻转是二维形体常见的变换形式。

通过这些变换,我们可以改变一个二维形体的位置、方向或者姿态,进而获得新的二维形体。

本文将重点介绍平移、旋转和翻转这三种变换,并探讨它们的特点和应用。

一、平移变换平移变换是指保持形体内部点之间距离关系不变的变换方式。

简单来说,就是将一个形体沿着某个方向平行移动一段距离。

平移变换的特点是保持形体的大小、形状不变,只改变了其位置。

以点为例,假设有一个点P(x,y),我们对其进行平移变换,偏移量为(dx, dy),则新的点P'的坐标为P'(x+dx, y+dy)。

对于图形,同样的道理也适用。

通过平移变换,我们可以将一个图形从一个位置移动到另一个位置,而不影响其形状和大小。

平移变换在现实生活中有着广泛的应用。

比如,我们在地图上寻找某个位置,可以通过平移变换确定相对位置。

在电脑界面设计中,我们也常常使用平移变换来移动图形元素,实现界面的布局。

二、旋转变换旋转变换是指将形体围绕某一中心点按一定角度进行旋转的变换方式。

旋转变换的特点是保持形体的大小不变,只改变了其方向和姿态。

以点为例,假设有一个点P(x,y),我们对其进行旋转变换,旋转角度为θ,中心点为O,则新的点P'的坐标为P'((x-O)*cosθ - (y-O)*sinθ + O, (x-O)*sinθ + (y-O)*cosθ + O)。

对于图形,同样的道理也适用。

通过旋转变换,我们可以改变图形的方向和姿态。

旋转变换在很多领域都有应用。

比如,建筑设计中常常要考虑建筑物的朝向和角度,可以通过旋转变换来模拟不同的方向。

在电脑图形学中,我们也常常使用旋转变换来实现图形的旋转效果。

三、翻转变换翻转变换是指将形体围绕某一轴线进行翻转的变换方式。

翻转变换的特点是保持形体的大小不变,只改变了其方向。

以点为例,假设有一个点P(x,y),我们对其进行翻转变换,翻转轴为x轴,则新的点P'的坐标为P'(x, -y)。

二维图形的几何变换

二维图形的几何变换

二位图形的几何变换算法分析:基本几何变换都是相对于坐标原点和坐标轴进行的几何变换,有平移、比例、旋转、反射和错切等。

1.平移:是指将某点沿直线路径从一个坐标位置移到另一个坐标位置的重定位过程。

他是一种不产生变形而移动物体变换。

可以根据矩阵获得点坐标,求得平移变换矩阵以后,得出点坐标。

(此实验以三维矩阵为例)2.缩放变换:缩放变换是指对p点相对于坐标原点沿x方向放缩Sx倍,沿y方向放缩Sy倍。

其中Sx和Sy称为缩放系数。

缩放变换可改变物体的大小,如下图所示。

当Sx=Sy >1时,图形沿两个坐标轴方向等比例放大;当Sx=Sy<1,图形沿两个坐标轴方向等比例缩小;当Sx≠Sy,图形沿两个坐标轴方向作非均匀的比例变换。

3 旋转变换二维旋转是指将p点绕坐标原点转动某个角度(逆时针为正,顺时针为负)得到新的点p’的重定位过程。

4 对称变换对称变换后的图形是原图形关于某一轴线或原点的镜像。

5 错切变换错切变换也称为剪切、错位变换,用于产生弹性物体的变形处理。

核心代码:int move(int dx, int dy) //将图形进行平面移动{int i;for(i = 0; i < 3; i++){line((array[i].x+dx),(array[i].y+dy),(array[(i+1)%3].x+dx), (array[(i+1)%3].y+dy));}getch();setcolor(0);for(i = 0; i < 3; i++){line((array[i].x+dx),(array[i].y+dy),(array[(i+1)%3].x+dx), (array[(i+1)%3].y+dy));}return 0;}int move_change(int sx,int sy) //平移并缩放{int arr_one[3];int arr_two[3];int i;for(i = 0; i < 3; i++){arr_one[i]=(array[i].x-array[0].x)*sx+array[0].x;arr_two[i]=(array[i].y-array[0].y)*sy+array[0].y;}for(i = 0; i < 3; i++){line(arr_one[i]+120,arr_two[i],arr_one[(i+1)%3]+120,arr_ two[(i+1)%3]);}getch();setcolor(0);for(i = 0; i < 3; i++){line(arr_one[i]+120,arr_two[i],arr_one[(i+1)%3]+120,arr_ two[(i+1)%3]);}return 0;}int turn_around(int x, int y, int a) //旋转图形{int i;int arr_one[3];int arr_two[3];for(i = 0; i < 3; i++){arr_one[i]=(array[i].x-x)*cos(a)-(array[i].y-y)*sin(a)+x;arr_two[i]=(array[i].x-x)*sin(a)+(array[i].y-y)*cos(a)+y;}for(i = 0; i < 3; i++){line(arr_one[i],arr_two[i],arr_one[(i+1)%3],arr_two[(i+1) %3]);}getch();setcolor(0);for(i = 0; i < 3; i++){line(arr_one[i],arr_two[i],arr_one[(i+1)%3],arr_two[(i+1) %3]);}return 0;}int move_turn(int a, int b, int d, int e) //平移并旋转{int i;int arr_one[3];int arr_two[3];for(i = 0; i < 3; i++){arr_one[i]=(a*array[i].x)+(b*array[i].y);arr_two[i]=(d*array[i].x)+(e*array[i].y);}for(i = 0; i < 3; i++){line(arr_one[i]+120+420,arr_two[i],arr_one[(i+1)%3]+12 0+420,arr_two[(i+1)%3]);}getch();setcolor(0);for(i = 0; i < 3; i++){line(arr_one[i]+120+420,arr_two[i],arr_one[(i+1)%3]+12 0+420,arr_two[(i+1)%3]);}return 0;}int move_turn_change(int b, int d) //平移,旋转并缩放{int i;int arr_one[3];int arr_two[3];for(i = 0; i < 3; i++){arr_one[i]=array[i].x+(b*array[i].y);arr_two[i]=(d*array[i].x)+array[i].y;}for(i = 0; i < 3; i++){line(arr_one[i],arr_two[i],arr_one[(i+1)%3],arr_two[(i+1) %3]);}getch();setcolor(0);for(i = 0; i < 3; i++){line(arr_one[i],arr_two[i],arr_one[(i+1)%3],arr_two[(i+1) %3]);}return 0;}实验截图:原图:。

计算机图形学实验报告几何变换

计算机图形学实验报告几何变换

计算机图形学实验报告计算机图形学实验报告姓名徐沛华班级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;编译,运行:平移:。

江苏大学-计算机图形学第三次实验报告-二维图形变换

江苏大学-计算机图形学第三次实验报告-二维图形变换

计算机科学与通信工程学院实验报告课程实验题目学生姓名学号专业班级指导教师日期计算机图形学二维图形变换成绩评定表二维图形变换1. 实验内容完成对北极星图案的缩放、平移、旋转、对称等二维变换。

首先要建好图示的北极星图案的数据模型(顶点表、边表。

)另外,可重复调用“清屏”和“暂停”等函数,使整个变换过程具有动态效果。

3.问题分析为了建立北极星图形,首先在二维空间中根据坐标绘制出北极星图形。

并且在此坐标 系中确定好走笔顺序以便于进行连线操作。

同时需要好好的使用清屏函数以使得显示正常。

2. 实验环境操作系统:Windows XP开发工具:visual studio 20081. 放大缩小变换放大缩小变换公式为:x’=x.a, 比例系数。

y’=y.d; 其中 a,d 分别为 x,y 方向的放缩可通过不同的比例系数来显示程序运行结果。

当 a=d 时为等比例放缩操作。

可令 变换矩阵为 T 。

2. 对称变换包括以 x 轴对称、y 轴对称和原点 O 对称三种。

由于屏幕坐标只有第一象限,我 们可以将原点平移到(500,240)处。

在第一象限画出一个三角形,然后分别求出三 个对称图形。

3. 旋转变换将图形上的点(x ,y )旋转 θ 角度,得到新的坐标(x ’,y ’)为:x’=xcosθ-ysin θ,y’=xsinθ+ycos θ;旋转矩阵T为4.平移变换4.算法设计5.源代码//北极星void hzbjx(CDC*pDC,long x[18],long y[18]){CPen newPen1,*oldPen;newPen1.CreatePen(PS_SOLID,2,RGB(255,0,0));oldPen=pDC->SelectObject(&newPen1);POINTvertex1[11]={{x[1],y[1]},{x[2],y[2]},{x[3],y[3]},{x[4],y[4]},{x[5],y[5]},{x[3],y[3]},{x[1],y[1]},{ x[6],y[6]},{x[3],y[3]},{x[7],y[7]},{x[5],y[5]}};pDC->Polyline(vertex1,11);newPen1.DeleteObject();newPen1.CreatePen(PS_SOLID,2,RGB(0,255,0));oldPen=pDC->SelectObject(&newPen1);POINT vertex2[5]={{x[6],y[6]},{x[8],y[8]},{x[9],y[9]},{x[3],y[3]},{x[8],y[8]}};pDC->Polyline(vertex2,5);POINT vertex3[5]={{x[4],y[4]},{x[10],y[10]},{x[11],y[11]},{x[3],y[3]},{x[10],y[10]}};pDC->Polyline(vertex3,5);newPen1.DeleteObject();newPen1.CreatePen(PS_SOLID,2,RGB(255,0,90));oldPen=pDC->SelectObject(&newPen1);POINTvertex4[11]={{x[12],y[12]},{x[13],y[13]},{x[3],y[3]},{x[9],y[9]},{x[14],y[14]},{x[15],y[15]},{x[ 3],y[3]},{x[11],y[11]},{x[12],y[12]},{x[3],y[3]},{x[14],y[14]}};pDC->Polyline(vertex4,11);newPen1.DeleteObject();newPen1.CreatePen(PS_SOLID,2,RGB(0,100,255));oldPen=pDC->SelectObject(&newPen1);POINT vertex5[5]={{x[15],y[15]},{x[16],y[16]},{x[3],y[3]},{x[16],y[16]},{x[7],y[7]}};pDC->Polyline(vertex5,5);POINT vertex6[5]={{x[2],y[2]},{x[17],y[17]},{x[3],y[3]},{x[17],y[17]},{x[13],y[13]}};pDC->Polyline(vertex6,5);pDC->SelectObject(oldPen);Sleep(10);}void CDiamondView::Polaris() {InvalidateRgn(NULL);UpdateWindow();CDC*pDC=GetDC();long x[18],y[18];x[1]=553,y[1]=100;x[2]=515,y[2]=251;x[3]=553,y[3]=338;x[4]=516,y[4]=426;x[5]=553,y[5]=551;x[6]=589,y[6]=253;x[7]=591,y[7]=426;x[8]=678,y[8]=212;x[9]=641,y[9]=311;x[10]=454,y[10]=438;x[11]=478,y[11]=364;x[12]=415,y[12]=338;x[13]=466,y[13]=301;x[14]=703,y[14]=338;x[15]=640,y[15]=375;x[16]=665,y[16]=450;x[17]=440,y[17]=226;hzbjx(pDC,x,y);Sleep(500);InvalidateRect(NULL);long x1[18],y1[18];//缩小for(double n=1;n>=0.5;n-=0.01) {for(int i=1;i<18;i++){x1[i]=Round(x[i]*n);y1[i]=Round(y[i]*n);}hzbjx(pDC,x1,y1);Sleep(10);InvalidateRect(NULL);UpdateWindow();}InvalidateRect(NULL); UpdateWindow();long x2[18],y2[18];//放大for(double n=1;n<=1.5;n+=0.01) {for(int i=1;i<18;i++){x2[i]=Round(x1[i]*n);y2[i]=Round(y1[i]*n);}hzbjx(pDC,x2,y2);Sleep(10);InvalidateRect(NULL);UpdateWindow();}InvalidateRect(NULL);6.程序运行结果图1 北极星图案的数据模型图2 北极星图案的缩放图3 北极星图案的平移图4 北极星图案的旋转图5 北极星图案的对称7.总结在这次的实验中,我根据图形变换的基本原理简单实现了图形的几种变换。

二维图形的几何变换

二维图形的几何变换

实验报告学院:计信学院专业:计算机科学与技术(软件工程方向)班级:07软件2班姓名学号实验组实验时间2010.5.24 指导教师成绩实验项目名称二维图形的几何变换实验目的掌握二维图形的基本几何变换:位置改变(平移、旋转)和变形(缩放、错切,反射、投影等)以及复合变换。

实验要求实现二维图形的集合变换实验原理1.平移变换平移变换将一点P沿直线路径从一个坐标集团移动到另一个坐标位置的一个重定位过程。

如果点p1(x1,y1.z1)是由点p(x,y,z)在x轴,y轴和z轴分别移动tx,ty,tz距离得到的,则这两点坐标间的关系为X1=x+tx, y1=y+ty,z1=z+tz该式的矢量形式为:p1=p+T其中,p1,p,T分别定义为发下向量:P1=[x1,y1,z1 ] p=[x,y,z] T=[tx,ty,tz]2.二维图形变换主要是基于齐次坐标方程,通过一些简单的矩阵运算来实现:二维齐次坐标变换的矩阵形式是:ihgfedcba矩阵的每个元素都有特殊含义.基中edba可以对图形进行缩放,旋转,对称,错切等变换;fc是对图形进行平移变换;hg的对图形作投影变换;i则是对图形整体进行缩放变换.例如:将一个图形在X 方向中平移tx 个单位,在Y 方向平移ty 个单位.其实现过程如下:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡++=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1),(11101001111y x ty tx T ty y tx x y x ty tx y x其中:x1,y1是变换后的坐标,x,y 是变换前的坐标,通过上述变换,(x,y)被平移了P(tx,ty).在二维平面上任何复杂的变换都可以通过上述基本变换的组合来实现.级合方式在计算机上主要体现在矩阵的乘法运算,即将各个简单变换的矩阵逆序相乘,就可以得到一个总的变换矩阵.利用这个总的变换矩阵就可以对图形进行复合变换.实验环境 硬件平台:PC运行环境:Windows 平台,Visual C++实验步骤1.编写程序完成实验内容的要求 2.实验总结。

二维图形的几何变换.doc

二维图形的几何变换.doc

3、对1的图形进行旋转变换, 转坐标变换。

4、对1的图形进行对称变换, 进行的对称变换。

5、对1的图形进行错切变换, 进行的错切变换。

6、对1的图形进行比例变换, 绘制出变换后的几何图形,绘制出变换后的几何图形,绘制出变换后的儿何图形,绘制出变换后的儿何图形,并在下边标注出实施多少度的旋并在下边标注出实施对什么坐标并在下边标注出实施对何种坐标并在下边标注出实施的多少比例计算机图形学实验报告实验名称二维图形的儿何变换评分实验日期_年_月_日指导教师姓名专业班级学号一、实验目的1、复习不同的二维坐标变换公式。

2、掌握二维坐标变换公式的使用方法。

3、对二维坐标组合变换的灵活运用。

二、实验要求1、在屏幕上绘制出较简单的儿何图形。

2、对1的图形进行平移变换,绘制出变换后的儿何图形,并在下边标注出实施x, y各多少的平称坐标变换。

坐标变换。

7、为了进行比较,适当选择坐标,可将原图(变换前)及经过不同变换后的图形绘制在同一个屏幕上,设省不同的线形或颜色加以区分各种变换。

三、关键算法及实现原理1、二维图形的变换实际上是一个变换矩阵,平面图形是由若干个二维点(阳,*)组成, 经过变换后的二维点(x'i,yi),其变换公式为:对应于不同的变换,都是用矩阵乘法来计算坐标,只需改变变换矩阵即可。

因此对每一种坐标变换编成一个了程序。

2、编程时的技巧用数组将二维图形的特征坐标点(顶点)保存,将由特征坐标点(顶点)绘制出二维图形的命令编一个绘图子程序,调用绘图子程序绘制出变换以前的图形,根据不同的两维儿何变换,选用相应二维坐标变换公式(调用相应的子程序)将二维坐标进行坐标变换;再调用绘图了程序将变换后的坐标值在屏幕上绘制变换后的几何将图形,可选用不同的颜来区分各种不同儿何变换的图形。

四、程序调试中的问题五、程序运行结果或数据对四边形能完成单项二维变换(平移、比例、错切)的源程序#include<graphics.h>#include<conio.h> #include<dos.h>#include<math.h>double xmax=639.0, ymax=399.0;double f[3][3],xx,yy;int scx(double xj)(int x;x=(int)(xj+xmax/2);return(x);}int scy(double yj){int y;y=ymax-(int)(yj+ymax/2);return(y);)void parallel(double dx,double dy) f[0][0]= 1.0;f[0][ 1 ]=0.0;f[0][2]=0.0;f[l][0]=0.0;f[l][l]=1.0;f[l]⑵=0.0;f[2][0]=dx; f[2][l]=dy; f[2]⑵=1.0;}void scale(double s)(f[O][O]=s;f[O][l]=O.O;f[O]⑵=0.0;f[l][O]=O.O;f[l][l]=s;f[l]⑵=0.0;f[2][0]=0.0; f[2][l]=0.0; f[2]⑵=1.0;}void taisho_y(){f[0][0]=-1.0;f[0][l]=0.0;f[0] [2]=0.0;f[l][0]=0.0;f[l][l]=1.0;f[l][2]=0.0;f[2][0]=0.0; f[2][l ]=().(); f[2][2]=1.0;)void axis()(line(scx(0.0),scy(-ymax/2),scx(0),scy(ymax/2)); line(scx(-xmax/2),scy(().0),scx(xmax/2),scy(0.0)); )void tuoq(double a,double b)(f[0][0]=1.0;f[0][l]=b;f[0]⑵=1.0;f[l][0]=a;f[l][l]=1.0;f[l][2]=0.0;f[2][0]=0.0; f[2][l]=0.0; f[2]⑵=1.0;)double affinex(double x,double y,double d){xx=x*f[0][0]+y*f[l ][0]+d*f[2][0];return(xx);}double affiney(double x,double y,double d) yy=x*f[0] [ 1 ]+y *f[ 1 ] [ 1 ]+d*f[2] [ 1 ]; retum(yy);}void drawtu(x2,y2)double x2[5],y2[5];{int i;for(i=0;i<=3;i++){Iine(scx(x2[i]),scy(y2[i]),scx(x2[i+ l]),scy(y2[i+1]));))void main()(int drive=DETECT,mode;static double x 1 []=( 50.0,60.0,150.0,160.0,50.0);static double yl[]={ 0.0,50.0,50.0,-10.0,0.0);static double x2[5],y2[5];int i;double x,y,xx,yy,yt;initgraph(&drive,&mode,"c:\\tc3\\bgi M);setcolor(RED);axis();for(i=0;i<=3;i++){line(scx(x 1 [i]),scy(y 1 [i]),scx(x 1 [i+1 ]),scy(y 1 [i+1]));/*parallel( 100,-100) */getch();x=100;y=-100;parallel(x,y);setcolor(BLUE);for(i=0;i<=4;i++)(x2[ij=affinex(x 1 [i],y 1 [i], 1.0);y2[i]=affiney(x 1 [i],y 1 [i], 1.0);)drawtu(x2,y2);yt=scy(y2[0])+10;outtextxy(scx(x2[0]),yt,"parallel(l 00,-100)”); /*taisho_y() */getch();taisho_y();setcolor( Y ELLOW);for(i=0;i<=4;i++)(x2[i]=affinex(x 1 [i],y 1 [i], 1.0);y2[i]=affiney(x l[i],yl[i],1.0);}drawtu(x2,y2);yt=scy(y2[0])+10;outtextxy(scx(x2[0]),yt,n taisho_y");/*touq(2,0) */getch();tuoq(2,0);setcolor(LIGHTBLUE);for(i=0;i<=4;i++)x2[i]=affinex(x 1 [i],y 1 [i], 1.0);y2[i]=affiney(xl [i],yl[i],1.0);)drawtu(x2,y2);yt=scy(y2[0])+10;outtextxy(scx(x2[0]),yt,"tuoq(2,0)n);/*scale(2) */gctch();scale(2);setcolor(LIGHTRED);for(i=0;iv=4;i++){x2[i]=affinex(x 1 [i],y 1 [i], 1.0);y2[i]=affiney(xl[i],yl[i],1.0);}drawtu(x2,y2);yt=scy(y2[0])+10;outtextxy(scx(x2[0]),yt,"scale 2");getch();closegraph();Alt: Fl-Last help F3-Pick F6-Swap F7/F8-Preu/Next error F9-Conp六、实验收获及体会1、了解二维坐标变换公式的使用方法。

计算机图形学二维图形变换

计算机图形学二维图形变换
S (xr , yr ; sx , sy ) T (xr , yr ) • S (sx , sy ) •T (xr , yr )
变换矩阵为:
sx 0 (1 sx ) xr
T复合
0
sy
(1
s
y
)
xy
0 0
1
绕任意点 (x0 , y0 ) 旋转 角
变换步骤:
将旋转中心平移到坐标原点; 绕坐标原点旋转 ; 将旋转中心移回到 (x0 , y0 ) 。
两矩阵相乘
void matrix3x3PreMultiply(Matrix3x3 a,Matrix3x3 b) {
int i,j,k; Matrix3x3 tmp;
for(i=0;i<3;i++) for(j=0;j<3;j++) { tmp[i][j]=0; for(k=0;k<3;k++) tmp[i][j]+=a[i][k]*b[k][j]; }
for(i=0;i<3;i++) for(j=0;j<3;j++) a[i][j]=tmp[i][j];
}
顶点序列变换
void transformPoints() {
int i,j,k;
for(i=0;i<N;i++) for(j=0;j<3;j++) { pt[i][j]=0; for(k=0;k<3;k++) pt[i][j]+=point[i][k]*theMatrix[k][j]; }
0 0 1
关于y轴的对称变换
1 0 0
SYy

初中综合实践活动《息技术 5.二维三维的任意变换》优质课教案_7

初中综合实践活动《息技术  5.二维三维的任意变换》优质课教案_7

创意花瓶设计学习目标:1.会用直线、曲线等草图编辑工具绘制草图。

2.通过旋转、抽壳等工具把草图变实体。

3.通过贴图等方法修饰作品。

4.登录自己的三维空间,给朋友们分享自己的作品。

5.做个有心人,处处有创意,时时可创作。

1.视图的选择在3D One“工作区”中网格面视图有两种模式:一种是透视图,另一种正视图,两种视图的切换在“视图导航器”上完成。

选正视图2.网格面显示比例的调整通过鼠标调整网格面到合适的显示比例。

3.“直线”命令:试一试:视图设置好了吗?说一说:你是怎么做的?通过设定两端点,绘制直线。

可通过设定参数,改变直线尺寸。

4“通过点绘制曲线”命令:可通过连续多点绘制曲线或直接输入坐标得到曲线。

试一试:直线命令会用了吗?(*提高同学)会用坐标精确控制吗?试一试:通过点绘制曲线命令会用了吗? (*提高同学)会用坐标精确控制吗?二.绘制花瓶实体1.绘制花瓶截面草图自己明确:想做个什么样的花瓶呢?(形状任你做主)想象一下,你想做的花瓶纵切面什么形状呢?纵切面的1/2又是什么形状呢?2.封闭的截面变实体特征造型工具:○1直线○2曲线○3封闭成面试一试:“旋转”变实体会用了吗?(*提高同学)试试不同的变实体的方法*******************************************************************○4旋转工具 ○5绕轴旋转 试一试:(*提高同学)旋转时改变参数会有什么不一样的发现呢?三.实体花瓶变空心——特殊功能抽壳(*提高同学)瓶口太锋利,如何让瓶口变得圆滑一些?试试“圆角”命令?*******************************************************************○6抽壳 试一试:厚度T 不同,有什么不一样的发现呢?四.美化外观1.瓶口“圆角”设计:注意圆角参数要小于厚度2.颜色或贴图 *设置喜欢的颜色*或者用贴图:*也可以用自己准备图片,找一个符合作品意境的图片,导入到贴图库中。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验三 2D图形变换
一、实验目的
1、了解和掌握2D图形变换-学会使用OPENGL平移、旋转和比例缩放函数。

2、掌握基本图形变换和复合图形变换实现的方法。

二、实验内容与要求
要求使用OpenGL几何变换函数改变当前2D图形:
(1) 使用 glTranslatef()函数,实现2D图形平移,如图4-1所示。

a)平移前 b)平移后
图4-1
(2) 使用 glRotatef()函数,实现2D图形绕平面固定点旋转,如图4-2
所示。

a)旋转前 b)旋转后
图4-2
(3) 使用 glScalef()函数,实现缩放2D图形绕固定点缩放,在前面程序
基础上设计修改,如图4-3所示。

a)缩放前 b)缩放后
图4-3
(4)参考函数:
1、gltranslatef(x,y,z)函数,x,y,z分别代表x,y,z方向的平移量,对于
2D图形,z=0。

2、glrotatef(Q,x,y,z)函数,q为逆时针方向旋转的角度度数(0~360),
(x,y,z)为旋转轴的方向矢量,(x,y,z)=(0,0,1)时代表沿Z
轴方向旋转;(x,y,z)=(1,0,0)代表沿x轴方向旋转;(x,y,z)=
(0,1,0)代表沿y轴方向旋转。

3、glscalef(x,y,z)函数,x,y,z分别表示x,y,z方向的比例因子。

对于2D
图形,z=0。

比例因子取-1时,产生对称变换。

(5)代码示例
1)某图形沿水平方向垂直方向分别平移Tx,Ty段距离
清屏
glMatrixMode(GL_MODELVIEW); //设置矩阵模式为模型变换模式,表示在世界坐标系下
glLoadIdentity(); //将当前矩阵设置为单位矩阵
glTranslatef(Tx,Ty,0);
DrawSomeShape();
刷新
2)某图形绕任意点(cx,cy)旋转ALPHA
清屏
glMatrixMode(GL_MODELVIEW); //设置矩阵模式为模型变换模式,表示在世界坐标系下glLoadIdentity(); //将当前矩阵设置为单位矩阵
glTranslatef(cx,cy,0);
glRotatef(ALPHA,0,0,1);
glTranslatef(-cx,-cy,0);
DrawSomeShape();
刷新
3)某图形绕任意点(cx,cy)缩放Sx,Sy比例因子
清屏
glMatrixMode(GL_MODELVIEW); //设置矩阵模式为模型变换模式,表示在世界坐标系下glLoadIdentity(); //将当前矩阵设置为单位矩阵
glTranslatef(cx,cy,0);
glScalef(Sx,Sy,1);
glTranslatef(-cx,-cy,0);
DrawSomeShape();
刷新
//样本程序:绘制六边形
#include<glut.h>
#include<math.h>
#define PI 3.14159 //设置圆周率
int n=6, R=10; //多边形变数,外接圆半径
float theta=0.0; //旋转初始角度值
void Display(void);
void Reshape(int w, int h);
void main(int argc, char** argv)
{ glutInit(&argc, argv); //初始化GLUT库;
glutInitWindowSize(700,700); //设置显示窗口大小
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); //设置显示模式;(注意双缓冲)
glutCreateWindow("A Square"); // 创建显示窗口
glutDisplayFunc(Display); //注册显示回调函数
glutReshapeFunc(Reshape); //注册窗口改变回调函数
glutMainLoop(); //进入事件处理循环
}
void Display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1.0,0,0); //设置红色绘图颜色
glBegin(GL_POLYGON); //开始绘制六边形
for (int i=0;i<n;i++)
glVertex2f( R*cos(theta+i*2*PI/n), R*sin(theta+i*2*PI/n));
glEnd();
glutSwapBuffers(); //双缓冲的刷新模式;
}
void Reshape(GLsizei w,GLsizei h)
{
glMatrixMode(GL_PROJECTION); //投影矩阵模式
glLoadIdentity(); //矩阵堆栈清空
gluOrtho2D(-1.5*R*w/h,1.5*R*w/h,-1.5*R,1.5*R); //设置裁剪窗口大小glViewport(0,0,w,h); //设置视区大小
glMatrixMode(GL_MODELVIEW); //模型矩阵模式
}。

相关文档
最新文档