实验.四二维图形的基本几何变换
二维几何变换学习镜像平移和旋转等变换

二维几何变换学习镜像平移和旋转等变换在几何学中,二维几何变换是一种将平面上的点或形状进行改变的操作。
镜像、平移和旋转是常见的二维几何变换,它们不仅有着广泛的应用,而且在计算机图形学和图像处理等领域中扮演着重要的角色。
本文将分别介绍镜像、平移和旋转等变换的基本概念、性质与应用。
一、镜像变换镜像变换,又称翻转变换,是将平面上的点或形状沿着一条直线进行对称的变换。
在镜像变换中,我们可以定义一条直线作为镜像轴,对于沿轴线的点,它们在镜像后仍保持在轴上,而对于不在轴上的点,则沿垂直于轴线的方向移动相同的距离。
镜像变换可以分为对称镜像和中心镜像两种类型。
对称镜像是将平面上的点或形状沿着一条直线进行对称的变换。
对于对称镜像,镜像轴上的点保持不变,其他点关于轴线对称。
例如,在一个直角三角形中,如果将三角形沿着斜边的中垂线进行对称,那么三角形的形状将完全相同,但位置改变了。
中心镜像是将平面上的点或形状沿着一个点进行对称的变换。
对于中心镜像,镜像中心点保持不变,其他点关于镜像中心对称。
例如,在一个正方形中,如果将正方形沿着中心进行中心镜像,那么正方形的形状将保持不变。
镜像变换在现实生活和工程应用中有着广泛的应用。
例如,在建筑设计中,通过对称镜像可以快速获得相对称的结构,从而减少设计和施工的难度。
在计算机图形学中,镜像变换被广泛应用于图像处理和计算机游戏中,能够快速生成镜像效果。
二、平移变换平移变换是将平面上的点或形状沿着一个方向进行移动的变换。
在平移变换中,每个点的平移距离和方向相同,所有的点都保持相对位置不变。
平移变换可以用坐标表示为(x, y) → (x+dx, y+dy),其中(dx, dy)表示平移的距离和方向。
平移变换的一个重要性质是保持平行性,即平移后的平行线与原先的平行线依然平行。
这个性质在工程设计和计算机图形学中有着重要的应用。
例如,在工程设计中,通过平移变换可以方便地复制和粘贴结构,缩短设计和施工的时间。
实验.四二维图形的基本几何变换

实验报告学院:计算机学号:姓名:实验四 二维图形的基本几何变换一、实验目的1.掌握二维图形基本的几何变换原理及变换矩阵; 2.掌握矩阵运算的程序设计。
二、实验内容实现二维图形的基本变换,包括平移、旋转、比例、对称变换。
三、实验环境硬件平台:PC运行环境: Windows 平台,Visual C++四、算法描述二维图形齐次坐标变换矩阵一般表达式 T = 这 3×3 矩阵中各元素功能一共可分成四块,即a 、b 、c 、d 四项用于图形的比例、对称、错切、旋转等基本变换; k 、m 用于图形的平移变换;p 、q 用于图形的透视变换; s 用于图形的全比例变换。
平移变换 旋转变化放缩变换五、实验过程5.1打开Visualc++6.0程序5.2新建一个C++项目⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡s m kq dc p b a ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡''1),(110010011y x t t T y x t t y x y x y x 记为⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡''1)(11000cos sin 0sin cos 1y x R y x y x θθθθθ记为⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡''1),(11000001y x s s S y x s s y x y x y x记为5.3单击完成,双击源文件里的二维图形几何变换View.cpp,出现下图5.5找到其中的OnDraw函数,并将其改成如下,使其实现了一条直线的平移。
void C二维图形几何变换View::OnDraw(CDC* pDC){C二维图形几何变换Doc* pDoc = GetDocument();ASSERT_VALID(pDoc);if (!pDoc)return;// TODO: 在此处为本机数据添加绘制代码int a[3][3];int i,j;for(i=0;i<3;i++)for(j=0;j<3;j++)a[i][j]=0;for(i=0;i<3;i++)a[i][i]=1;int x0=80,x1=350,y0=120,y1=120;pDC->MoveTo(x1,y1);E:\c++6.0安装\MSDev98\MyProjects\pDC->LineTo(x0,y0);a[2][0]=80;//使直线在行方向上平移了80个单位a[2][1]=50;//使直线在列方向上平移了50个单位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];pDC->MoveTo(x1,y1);pDC->LineTo(x0,y0);}5.6单击运行程序并有如下结果5.7找到其中的OnDraw函数,并将其改成如下,使其实现了一条直线的平移和缩放。
二维图形的几何变换

pDC->MoveTo(xy1[0][0]+200,xy1[0][1]+160);//画对称轴 pDC->LineTo(xy1[1][0]+200,xy1[1][1]+160); //对称变换,利用斜率特性,若两直线垂直,则 k1=-1/k2 //只针对三角形 for(int i=0;i<3;i++){
实
验
硬件平台:PC
环
运行环境:Windows 平台,Visual C++
境
实 1.编写程序完成实验内容的要求
验 2.实验总结。
步
骤
1.设有一三角形 ABC,其中三个顶点为 A(5,10),B(1,2),C(8,5),如三角形的顶点 A 不 实
变,将 AB 和 AC 边缩小一倍后,求缩小后的三角形对于直线-2x+4y+3=0 的对称变换后
xy[3][0]=120; xy[3][1]=100; } void CMyDlg::OnPaint() { CWnd* pWnd=GetDlgItem(IDC_STATIC); CDC* pDC=pWnd->GetDC(); pDC->SetViewportOrg(200,160); pDC->MoveTo(0,-150);//控制纵向坐标
y
ty
T
(tx, ty)
y
1 0 0 1 1 1
1
其中:x1,y1 是变换后的坐标,x,y 是变换前的坐标,通过上述变换,(x,y)被平移了
P(tx,ty). 在二维平面上任何复杂的变换都可以通过上述基本变换的组合来实现.级合方式在计算机上 主要体现在矩阵的乘法运算,即将各个简单变换的矩阵逆序相乘,就可以得到一个总的变换 矩阵.利用这个总的变换矩阵就可以对图形进行复合变换.
河南工业大学-图形学实验四

河南工业大学-图形学实验四-CAL-FENGHAI.-(YICAI)-Company One1实验四:二维变换与裁剪算法的实现一、实验目的1、掌握平移变换、旋转变换和缩放变换方法;2、达到掌握二维图形基本几何变换及运用几何变换快速方便生成图形的目的;3、掌握图形裁剪算法。
二、实验要求1. 在MFC单文档应用程序中,添加奇次二维坐标点类CP2,如图1.1 所示,参考图1.2部分代码,分别完成二维图形的平移、旋转和缩放。
(注:变换参数可在程序内直接给出或用对话框等形式输入,简单二维图形经二维变换后可生成复杂图形。
)图1.1 CP2类定义图1.2 部分二维变换参考代码2. 利用Cohen-Sutherland端点编码算法编程实现任意线段的裁剪,要求自定义窗口区域和直线端点。
(注:未被裁剪的线段及被裁剪的线段用不同的颜色显示出来。
)三、实验内容一,二维图形的变换○1菜单栏的建立○2对话框的创建,创建对应的类为dialog○3为编辑框Edit添加成员变量:右键,建立类向导,选择Member Variables,双击IDC_EDIT1(对应编辑框的ID),Member variable name m_x1Category ValueVariable type OK○4新建两个类CCP2和TransForm,CCP2类用于将二维点坐标转换成齐次坐标,TransForm类是平移,旋转,缩放的具体实现。
代码如下:// CP2.h#pragma onceclass CP2{public:CP2();virtual ~CP2();CP2(double x, double y);//如果滚动条不能拉动,请启用宏。
○5在文件视图中找到test4View.h protected里面加入变量CString x1,y1,x2,y2,translate,scale,rotate。
用于在test4View.cpp中接收编辑框的值。
二维图形基本变换规则及应用

二维图形基本变换规则及应用(07级信息与计算科学傅强070350221)摘要利用计算机绘制的图形与我们日常见到的图片、照片是有相似之处。
除图片、照片等图形外,自然界中还存在丰富多彩的有形物体。
一般,根据图形所在空间的不同,可将图形分为:三维图形和二维图形。
图片、照片属二维图形,自然界中形形色色的物体属于三维图形。
在计算机绘图的过程中,二维图形的绘制是绘制三维图形的基础,研究计算机图形的生成必须从研究二维图形开始。
计算机绘制图形时,无论图形多么复杂,都是利用一些相应图形基元经过图形变换组成的。
在计算机绘图中,经常用到图形变换,图形变换是指图形信息经过几何变换后产生新的图形。
基本的几何变换研究物体坐标在直角坐标系内的平移、旋转和变比等规则。
本文主要介绍二维图形的一些基本变换规则及其应用关键词:直角坐标系内;平移;旋转;应用ABSTRACTUsing the computer graphics and see our daily drawings, photographs are similarities. Besides the drawings, photographs and other graphic, nature also exist rich and colorful tangible objects. In general, according to the different space, the graphics can be divided into: 3d graphics and 2d graphics. The drawings, photographs of 2d graphics, all kinds of objects in the nature belongs to 3d graphics. In computer graphics, the process of 2d graphics rendering 3d graphics drawing is the basis, research of computer graphics generation must start from the 2d graphics. Computer graphics, no matter how complex, graphics are using some corresponding graphic element composed by graphical transformation. In computer graphics, often use graphics transformation, graphics transform refers to the graphical information through after new graphics geometry transform. The basic research object coordinate geometry transform in cartesian coordinate system in translation, rotation and change rules than etc. This paper mainly introduces some basic transformation of 2d graphics and its application in the rules.Keywords: a cartesian coordinate system, Translation, Rotating, application1用户坐标到屏幕坐标的变换实际图纸上坐标系是实数域中的直角坐标系或极坐标系,统称为用户坐标系;计算机设备(如屏幕)上采用的坐标系为整数域(如屏幕一般为直角左手系),称为设备坐标系。
二维图形几何变换

⼆维图形⼏何变换⼀、基本变换1. 平移定义:将物体沿直线路径从⼀个坐标位置移到另⼀个坐标位置的重定位。
不产⽣变形⽽移动物体的刚体变换。
原始坐标位置:(x ,y ),平移距离t x 、t y ,新位置(x ′,y ′),则x ′=x +t x ,y ′=y +t y 表⽰为矩阵形式,令:→P =x y→P ′=x ′y ′→T =t x t y⼆位平移⽅程:→P ′=→P +→T2. 旋转当参考点为(0,0)定义:以某个参考点为圆⼼,将对象上的各点(x ,y )围绕圆⼼转动⼀个逆时针⾓度θ,变成新的坐标(x ′,y ′)的变换。
x ′=rcos (φ+θ)=rcos φcos θ−rsin φsin θy ′=rsin (φ+θ)=rsin φcos θ+rcos φsin θ∵x =rcos φ,y =rsin φ∴x ′=xcos θ−ysin θy ′=xsin θ+ycos θ令:→R =cos θ−sin θ−sin θcos θ写成矩阵形式:→P ′=→R ⋅→P绕任意指定的旋转位置(x r ,y r )旋转的变换⽅程1. 将坐标系原点平移到(x r ,y r )2. 在新的坐标系下做旋转变换3. 将坐标原点平移回原坐标系x ′=x r +(x −x r )cos θ−(y −y r )sin θy ′=y r +(x −x r )sin θ+(y −y r )cos θ3. 变化(缩放)Scaling定义:使对象按⽐例因⼦Sx 和Sy 放⼤或缩⼩的变换。
x ′=x ⋅S xy ′=y ⋅S y令→S =S x 00S y矩阵形式:→P ′=→S ⋅→PS x 、S y 均⼩于1,缩⼩物体尺⼨,S x 、S y 均⼤于1,放⼤物体。
S x =S y ,则保持物体相对⽐例缩放⼀致。
特殊情况当Sy =−1、Sx =1,按x 轴反射当Sy =1、Sx =−1,按y 轴反射()()()()()当Sy =−1、Sx =−1,按原点(0,0)反射⼆、变换矩阵每个基本变换均可表⽰为普通矩阵形式:→P ′=→M 1→P +→M 2平移将2×2矩阵扩充为3×3矩阵,将⼆维⼏何变换的乘法和平移项组合成单⼀矩阵表⽰平移。
《计算机图形学》实验报告

实验报告模板《计算机图形学》实验报告一、实验目的及要求1.实习三维图形的坐标系之间的变换;2.三维图形几何变换;3.掌握三维图形的坐标系之间的变换算法及三维图形几何变换的原理和实现;4.实现二维图形的基本变换(平移、旋转、缩放、错切、对称、复合等);5.实现三维图形的基本变换(平移、旋转、缩放、复合等);二、理论基础在齐次坐标理论下,二维图形几何变换矩阵可用下式表示:⎪⎪⎪⎭⎫⎝⎛===ifchebgdaTnkxx kk2,1,0,)(ϕ平移变换:[x* y* 1] =[x y 1] *0000001ts⎛⎫⎪⎪⎪⎝⎭=[t*x s*y 1]比例变换:[x* y* 1]=[x y 1] *1000101m n⎛⎫⎪⎪⎪⎝⎭=[m+x n+y 1]旋转变换:在平面上的二维图形饶原点逆时针旋转Ө角,变换矩阵为[x* y* 1]=[x y 1] *cos sin0sin cos0001θθθθ⎛⎫⎪- ⎪⎪⎝⎭= [x*cosө-y*sinө]复合变换:以上各种变换矩阵都是以原点为参照点,当以任意参照点进行变换的时候,我们就要用到复合变换矩阵。
三维变换类似于二维,在画图时,把三维坐标转换为二维即可。
三、算法设计与分析二维变换:#define dx 50#define dy 100void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+dx;a[1]=m[i][1]+dy;b[0]=m[i+1][0]+dx;b[1]=m[i+1][1]+dy;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define h 0.1745#include<math.h>void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*cos(h)-m[i][1]*sin(h);a[1]=m[i][1]*cos(h)+m[i][0]*sin(h);b[0]=m[i+1][0]*cos(h)-m[i+1][1]*sin(h);b[1]=m[i+1][1]*cos(h)+m[i+1][0]*sin(h);DDALine(a,b, RGB(0, 200, 255), pDC);}}#define k 2;#define f 2.5void CCGWithVCView::OnTransMove() //缩放{// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Scale Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]*k;a[1]=m[i][1]*f;b[0]=m[i+1][0]*k;b[1]=m[i+1][1]*f;DDALine(a,b, RGB(0, 200, 255), pDC);}}#define n 2#define d 0void CCGWithVCView::OnTransOther(){// TODO: Add your command handler code here//AfxMessageBox(_T("Please Insert The Other Change Code!")) ;int m[4][2]={{100,50},{50,100},{150,100},{100,50}};int i;int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<3;i++){a[0]=m[i][0];a[1]=m[i][1];b[0]=m[i+1][0];b[1]=m[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for(i=0;i<3;i++){a[0]=m[i][0]+n*m[i][1];a[1]=m[i][1]+d*m[i][0];b[0]=m[i+1][0]+n*m[i+1][1];b[1]=m[i+1][1]+d*m[i+1][0];DDALine(a,b, RGB(0, 200, 255), pDC);}}三维变换:#include<math.h>#define dx 100#define dy 100#define dz 0void CCGWithVCView::OnTransScale() //平移(50,100){// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Move Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]+dy-p3d[i][0]+dx/sqrt(2);p2d[i][1]=p3d[i][2]+dz+p3d[i][0]+dx/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}#define k 0.1745void CCGWithVCView::OnTransRotate() //旋转{// TODO: Add your command handler code here// AfxMessageBox(_T("Please Insert The Rotate Change Code!")) ;int i;int p2d[6][2];int p3d[6][3]={{400,300,0},{300,400,0},{300,300,10},{275,300,0},{400,300,0},{300,300,10}};for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]+p3d[i][0]/sqrt(2);}int a[2],b[2];CDC * pDC = GetDC();for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 200, 255), pDC);}for( i=0;i<6;i++){p2d[i][0]=p3d[i][1]*cos(k)-p3d[i][2]*sin(k)-p3d[i][0]/sqrt(2);p2d[i][1]=p3d[i][2]*cos(k)+p3d[i][1]*sin(k)+p3d[i][0]/sqrt(2);}for(i=0;i<5;i++){a[0]=p2d[i][0];a[1]=p2d[i][1];b[0]=p2d[i+1][0];b[1]=p2d[i+1][1];DDALine(a,b, RGB(0, 0, 255), pDC);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。
二维几何形的平移旋转与翻转方法

二维几何形的平移旋转与翻转方法二维几何形的平移、旋转与翻转方法在二维几何学中,平移、旋转和翻转是常用的形状变换方法。
通过这些方法,我们可以改变形状的位置和方向,从而达到不同的目的,例如对图像进行调整、创建图案或进行设计等。
本文将介绍二维几何形的平移、旋转和翻转的基本方法及其应用。
一、平移方法平移是指在平面上将一个几何形状沿着一定方向进行移动,移动的距离和方向是相同的。
下面是平移的基本方法:1. 翻译向量法:平移可以通过翻译向量来实现。
翻译向量可以表示从一个点移动到另一个点的位移量,通常使用向量坐标的形式来表示。
假设有一个点A(x1, y1),要将其平移至另一个点B(x2, y2),则平移向量可以表示为(Tx, Ty),其中Tx = x2 - x1,Ty = y2 - y1。
通过将所有点坐标的x和y值分别加上相应的平移向量,即可将整个几何形状平移至目标位置。
2. 平移矩阵法:平移也可以通过平移矩阵来实现。
平移矩阵是一个2x3的矩阵,其第三列表示平移向量,即[1, 0, Tx; 0, 1, Ty]。
通过将几何形状的坐标点与平移矩阵相乘,即可得到平移后的新坐标。
该方法更适用于计算机图形学和图像处理中的平移操作。
二、旋转方法旋转是指将一个几何形状绕着某一点或某一直线进行旋转。
下面是旋转的基本方法:1. 极坐标法:通过极坐标系来进行旋转。
假设有一个点A(x, y),要将其绕原点O旋转一个角度θ,通过将其坐标转换为极坐标形式(r, φ),其中r = √(x^2+y^2),φ = arctan(y / x)。
旋转后的新坐标可以表示为(r, φ + θ)。
通过将所有点的极坐标进行相应的旋转计算,再转换回直角坐标系即可完成旋转操作。
2. 旋转矩阵法:旋转也可以通过旋转矩阵来实现。
旋转矩阵是一个2x2的矩阵,其元素由旋转角度θ决定。
假设有一个点A(x, y),通过旋转矩阵[R] = [cos(θ), -sin(θ); sin(θ), cos(θ)],点A的旋转后坐标可以表示为点B(x', y') = [R] * A。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
5.3 单击完成,双击源文件里的二维图形几何变换 View.cpp,出现下图
5.5 找到其中的 OnDraw 函数,并将其改成如下,使其实现了一条直线的平移。
void C二维图形几何变换View::OnDraw(CDC* pDC) { C二维图形几何变换Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 int a[3][3]; int i,j; for(i=0;i<3;i++) for(j=0;j<3;j++) a[i][j]=0; for(i=0;i<3;i++) a[i][i]=1; int x0=80,x1=350,y0=120,y1=120; pDC->MoveTo(x1,y1); E:\c++6.0安装\MSDev98\MyProjects\ pDC->LineTo(x0,y0); a[2][0]=80;//使直线在行方向上平移了80个单位 a[2][1]=50;//使直线在列方向上平移了50个单位
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]; pDC->MoveTo(x1,y1); pDC->LineTo(x0,y0); }
5.10 单击运行程序并有如下结果
5.11 找到其中的 OnDraw 函数,并将其改成如下,使其实现了一条直线的旋转变换。
void C二维图形几何变换View::OnDraw(CDC* pDC)
{ C二维图形几何变换Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 float a[3][3]; int i,j; for(i=0;i<3;i++) for(j=0;j<3;j++) a[i][j]=0; for(i=0;i<3;i++) a[i][i]=1; int x0=80,x1=350,y0=120,y1=120; pDC->MoveTo(x0,y0); pDC->LineTo(x1,y1); a[0][0]=0.866; a[1][1]=0.866; a[0][1]=0.5; a[1][0]=-0.5; 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]; pDC->MoveTo(x0,y0); pDC->LineTo(x1,y1); }
实验报告
学院:计算机 学号: 姓名:
实验四
一、实验目的
二维图形的基本几何变换
1.掌握二维图形基本的几何变换原理及变换矩阵; 2.掌握矩阵运算的程序设计。
二、实验内容
实现二维图形的基本变换,包括平移、旋转、比例、对称变换。
三、实验环境
硬件平台:PC 运行环境: Windows 平台,Visual C++
int x0=80,x1=350,y0=120,y1=120; pDC->MoveTo(x0,y0); pDC->LineTo(x1,y1); pDC->MoveTo(x0,y1);// 画出X轴 pDC->LineTo(500,y1);// 画出X轴 y0=y0+(y1-y0)*2;//实现X轴的对称轴的重点Y坐标 pDC->MoveTo(x1,y1);//画出X轴的对称轴 pDC->LineTo(x0,y0);//画出X轴的对称轴 }
5.12 单击运行程序并有如下结果
六、注意事项
5.1 这里实现的二维几何变换是以直线为例的,其他二维图形可以由多条直线段获曲线段做 相同的变化而实现。 5.2 上面实例中的旋转变换, 是实现了一条直线旋转 30°, 我是直接将其正弦值余弦值计算 出来并赋值。
七、实验心得
通过本次实验我更加深入的了解了二维几何变换,把书本上的知识用入到了实践中, 但是实验中也遇到一些问题,借鉴网上资料与同学合作才完成。 。
平移变换
x 1 0 t x x x 记为 y 0 1 t y T ( t , t ) y y x y 1 0 0 1 1 1
x cos y sin 1 0 sin cos 0 0 x x 记为 0 y R( ) y 1 1 1
5.6 单击运行程序并有如下结果
5.7 找到其中的 OnDraw 函数,并将其改成如下,使其实现了一条直线的平移和缩放。
void C二维图形几何变换View::OnDraw(CDC* pDC) { C二维图形几何变换Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 float a[3][3]; int i,j; for(i=0;i<3;i++) for(j=0;j<3;j++) a[i][j]=0; for(i=0;i<3;i++) a[i][i]=1; int x0=80,x1=350,y0=120,y1=120; pDC->MoveTo(x0,y0); pDC->LineTo(x1,y1); a[2][0]=0;//使直线在行方向上平移了个单位 a[2][1]=30;//使直线在列方向上平移了个单位 a[0][0]=2; //图形放大一倍 a[1][1]=2; //图形放大一倍 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]; pDC->MoveTo(x0,y0); pDC->LineTo(x1,y1); }
5.8 单击运行程序并有如下结果
5.9 找到其中的 OnDraw 函数,并将其改成如下,使其实现了一条直线的对称变换。
void C二维图形几何变换View::OnDraw(CDC* pDC) { C二维图形几何变换Doc* pDoc = GetDocument(); ASSERT_VALID(pDoc); if (!pDoc) return; // TODO: 在此处为本机数据添加绘制代码 float a[3][3]; int i,j; for(i=0;i<3;i++) for(j=0;j<3;j++) a[i][j]=0; for(i=0;i<3;i++) a[i][i]=1;
四、算法描述
二维图形齐次坐标变换矩阵一般表达式 T = 这 3×3 矩阵中各元素功能一共可分成四块,即 a、b、c、d 四项用于图形的比例、对称、错切、旋转等基本变换; k、m 用于图形的平移变换; p、q 用于图形的透视变换; s 用于图形的全比例变换。
a b p c d q k m s
旋转变化
放缩变换
x s x y 0 1 0
0 sy 0
0 x x 记为 y S ( s , s ) y 0 x y 1 1 1
五、实验过程
5.1 打开 Visualc++6.ห้องสมุดไป่ตู้ 程序 5.2 新建一个 C++项目