实验.四二维图形的基本几何变换
二维几何变换学习镜像平移和旋转等变换
二维几何变换学习镜像平移和旋转等变换在几何学中,二维几何变换是一种将平面上的点或形状进行改变的操作。
镜像、平移和旋转是常见的二维几何变换,它们不仅有着广泛的应用,而且在计算机图形学和图像处理等领域中扮演着重要的角色。
本文将分别介绍镜像、平移和旋转等变换的基本概念、性质与应用。
一、镜像变换镜像变换,又称翻转变换,是将平面上的点或形状沿着一条直线进行对称的变换。
在镜像变换中,我们可以定义一条直线作为镜像轴,对于沿轴线的点,它们在镜像后仍保持在轴上,而对于不在轴上的点,则沿垂直于轴线的方向移动相同的距离。
镜像变换可以分为对称镜像和中心镜像两种类型。
对称镜像是将平面上的点或形状沿着一条直线进行对称的变换。
对于对称镜像,镜像轴上的点保持不变,其他点关于轴线对称。
例如,在一个直角三角形中,如果将三角形沿着斜边的中垂线进行对称,那么三角形的形状将完全相同,但位置改变了。
中心镜像是将平面上的点或形状沿着一个点进行对称的变换。
对于中心镜像,镜像中心点保持不变,其他点关于镜像中心对称。
例如,在一个正方形中,如果将正方形沿着中心进行中心镜像,那么正方形的形状将保持不变。
镜像变换在现实生活和工程应用中有着广泛的应用。
例如,在建筑设计中,通过对称镜像可以快速获得相对称的结构,从而减少设计和施工的难度。
在计算机图形学中,镜像变换被广泛应用于图像处理和计算机游戏中,能够快速生成镜像效果。
二、平移变换平移变换是将平面上的点或形状沿着一个方向进行移动的变换。
在平移变换中,每个点的平移距离和方向相同,所有的点都保持相对位置不变。
平移变换可以用坐标表示为(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。
-图形学实验报告-二维基本变换
一、 实验目的和要求利用VC6.0编写二维基本几何变换算法的实现。
实现平移,比例,旋转等变换。
二、 算法原理介绍齐次坐标表示法就是用N+1维向量来表示一个N 维向量。
在齐次坐标系统中,点(X,Y)用(X,Y ,H)来表达,其中H 为非零的一个任意数。
点(X,Y)的标准齐次坐标表达为(X/H,Y/H,1),由于H 是一个任意非零常量,为了简便起见,我们通常取H=1。
齐次坐标系统中的点(X,Y ,1)包含有笛卡尔坐标上的点(X,Y)。
平移变换:比例变换:旋转变换:对称变换:关于x 轴对称:关于y 轴对称:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1000000y x SS ⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-100010001关于原点对称:关于y=x 对称:关于y=-x 对称:错切变换:当b=0时: (x` y` 1)=(x+cy y 1)。
图形的y 坐标不变。
当c>0:图形沿+x 方向作错切位移。
ABCD →A1B1C1D1当c<0:图形沿-x 方向作错切位移。
ABCD → A2B2C2D2当c=0时, (x` y` 1)=(x bx+y 1):图形的x 坐标不变。
当b>0:图形沿+y 方向作错切位移。
ABCD → A1B1C1D1当b<0:图形沿-y 方向作错切位移。
ABCD → A2B2C2D2当b 不等于0且c 不等于0时,(x` y` 1)=(x+cy bx+y 1) :图形沿x,y 两个方向作错切位移。
∴错切变换引起图形角度关系的改变,甚至导致图形发生变形。
三、 程序核心源代码void CChangeView::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;⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-100010001⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--100010001⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡100001010⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--100001010⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡1000101c bCalculate(P,TM);AfxGetMainWnd()->SetWindowText("二维几何变换-平移变换");Draw(P,p3);}void CChangeView::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 CChangeView::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 CChangeView::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 CChangeView::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 CChangeView::OnMENUup(){// TODO: Add your command handler code hereTmove(0,10);}void CChangeView::OnMENUdown(){// TODO: Add your command handler code hereTmove(0,-10);}void CChangeView::OnMENUleft(){// TODO: Add your command handler code hereTmove(-10,0);}void CChangeView::OnMENUright(){// TODO: Add your command handler code hereTmove(10,0);}void CChangeView::OnMENUClockwise() //顺时针旋转{// TODO: Add your command handler code hereTrotate(-30);}void CChangeView::OnMENUAnticlockwise() //逆时针旋转{// TODO: Add your command handler code hereTrotate(30);}void CChangeView::OnMENUIncrease(){// TODO: Add your command handler code hereTscale(2,2);}void CChangeView::OnMENUDecrease(){// TODO: Add your command handler code here Tscale(0.5,0.5);}void CChangeView::OnMENUY(){// TODO: Add your command handler code here Treflect(-1,1);}void CChangeView::OnMENUO(){// TODO: Add your command handler code here Treflect(-1,-1);}void CChangeView::OnMENUX(){// TODO: Add your command handler code hereTreflect(1,-1);}void CChangeView::OnMENUXdirectionplus(){// TODO: Add your command handler code here Treform(0,1);}void CChangeView::OnOnMENUXdirectionneg() {// TODO: Add your command handler code here Treform(0,-1);}void CChangeView::OnMENUITYdirectionplus(){// TODO: Add your command handler code here Treform(1,0);}void CChangeView::OnMENUYdirectionneg(){// TODO: Add your command handler code here Treform(-1,0);}void CChangeView::OnMENUReset(){// TODO: Add your command handler code here if(p3==4){ KeepMatrix(OSquare,P); }if(p3==3){ KeepMatrix(OTriangle,P); }if(p3==2){ KeepMatrix(OLine,P); }Draw(P,p3);}void CChangeView::Onre(){// TODO: Add your command handler code here Treflect(-1,-1);}四、实验结果抓图原图:平移变换后:对称变换后:(关于X轴对称)旋转变换后:(顺时针旋转)比例变换后:缩小放大错切变换后:Y正向五、参考文献[1]赵建忠,段康廉.三维建模在虚拟矿山系统中的应用[J].中国科技论文.[2]许惠平,陈越,陈华根,廖晓留,王智博.青藏高原亚东-格尔木地学断面域岩石圈结构演化虚拟现实表达[J].中国科技论文.[3]罗斌,魏世民,黄昔光,张艳.基于OpenGL的3P-6SS并联机构的仿真与轨迹规划研究[J].;国家自然科学基金资助项目.。
计算机图形学--实验四-几何变换
贵州大学实验报告
学院:计算机科学与信息学院专业:软件工程班级: 102班姓名学号实验组实验时间指导教师成绩实验项目名称实验四几何变换
实
验目的掌握二维图形的几何变换的基本原理。
二维图形的基本几何变换:位置改变(平移、旋转)和变形(缩放、错切,反射、投影等)以及复合变换。
了解三维图形的错切变换
实验要求根据本实验的特点、要求和具体条件,掌握二维图形的几何变换的基本原理,了解三维图形的错切变换,并成功编写测试代码进行实验。
1.设有一三角形ABC,其中三个顶点为A(5,10),B(1,2),C(8,5),如三角形的顶点A不变,将AB和AC边缩小一倍后,求缩小后的三角形对于直线-2x+4y+3=0的对称变换后的结果图。
2.将一四边形以原点为中心,以15°为间隔旋转。
3.在三维坐标中,对长度为1的标准立方体做错切变换,错切单位为2;
实验原理一、实验原理:标准齐次坐标(x,y,1) 二维变换的矩阵表示
平移变换
旋转变换
[][][]),(
1
1
1
1
1
1
y
x
y
x
t
t
T
y
x
t
t
y
x
y
x⋅
=
⎥
⎥
⎥
⎦
⎤
⎢
⎢
⎢
⎣
⎡
=
'
'记为
[][][]
cos sin0
1x y1sin cos01()
001
x y x y R
θθ
θθθ
⎡⎤
⎢⎥
''=-=
⎢⎥
⎢⎥
⎣⎦
记为。
图形学实验报告六-二维图形的几何变换
贵州大学实验报告学院:计算机科学与信息学院专业:计算机科学与技术班级:101姓名学号实验组 6 实验时间2013.5.9 指导教师吴云成绩实验项目名称二维图形的几何变换实验目的掌握二维图形的基本几何变换:位置改变(平移、旋转)和变形(缩放、错切,反射、投影等)以及复合变换。
实验要求1、在VS2010环境下利用C#编程实现画二维图形的几何变换。
2、给出代码。
3、附上结果截图。
实验原理标准齐次坐标(x,y,1) 二维变换的矩阵表示平移变换旋转变换放缩变换平移变换只改变图形的位置,不改变图形的大小。
旋转变换不改变图形的形状放缩变换引起图形形状的变化。
复合变换结果与变换的顺序有关(矩阵乘法不可交换)例:对一矩形先缩放S(2,0.5),再旋转R(p/6)。
对称变换关于x轴的对称变换:关于y轴的对称变换:实验环境VS2010(C#)实验步骤1. 掌握算法原理;2. 依据算法,编写源程序并进行调试;下面缩放变化的算法实现:private void TriangleChange()//缩?小?{Pen pen = new Pen(Color.Gray, 2);int x, y;x = point.X + 50;y = point.Y - 100;Point[] points ={new Point(x,y),new Point((x+point.X+10)/2,(y+point.Y-20)/2),new Point((x+point.X+80)/2,(y+point.Y-50)/2) };graphics.DrawPolygon(pen, points);}下面是旋转变化的算法实现:实验内容1.设有一三角形ABC,其中三个顶点为A(5,10),B(1,2),C(8,5),如三角形的顶点A不变,将AB和AC边缩小一倍后,求缩小后的三角形对于直线-2x+4y+3=0的对称变换后的结果图。
2.将一四边形以原点为中心,以15°为间隔旋转。
二维图形的几何变换
二位图形的几何变换算法分析:基本几何变换都是相对于坐标原点和坐标轴进行的几何变换,有平移、比例、旋转、反射和错切等。
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;}实验截图:原图:。
二维图形几何变换-PPT
cos sin 0
sin cos 0
0
0 1
旋转变换
简化计算(θ很小)
1 0
x' y' 1 x y 1 1 0
0 0 1
对称变换
对称变换后得图形就是原图形关于某一轴线或原点得镜像。
Y
Y
Y
X (a)关于x轴对称
X (b)关于y轴对称
X (c)关于原点对称
对称变换
对称变换后得图形就是原图形关于某一轴线或原点得镜像。
光栅变换
任意角度得Байду номын сангаас栅旋转变换:
旋转的 象素阵列
A
1A 3
光栅网格
2
n
Gray(A)=∑ [Gray(i) × A在i上得覆盖率](Gray(x)表示某点得灰度等级)
i=1 Gray(A)=Gray(1) × A在1上得覆盖率+ Gray(2) × A在2上得覆盖率+ Gray(3) × A在3上得覆盖率
光栅变换
光栅比例变换:
n
∑ [Gray(i) × Si] Gray(A)= i=1
n
∑ Si
i=1
缩小时原图 中的相应象 素区域
(a)Sx=1/2,Xy=1/2
(b)原图
12
1
43
2
放大时原图 中的相应象 素区域
(a)Sx=1,Xy=3/2
G=(G1+G2+G3+G4)/4
G=(G1×S1 + G2×S2)/(S1 + S2)
O
x0
x
图6-9 坐标系间的变换
坐标系之间得变换
分析: y
y'
p,也即p' x'
图形学实验报告
图形学实验报告计算机图形学实验指导书学号:1441901105姓名:谢卉实验一:图形的几何变换实验学时:4学时实验类型:验证实验要求:必修一、实验目的二维图形的平移、缩放、旋转和投影变换(投影变换可在实验三中实现)等是最基本的图形变换,被广泛用于计算机图形学的各种应用程序中,本实验通过算法分析以及程序设计实验二维的图形变换,以了解变换实现的方法。
如可能也可进行裁剪设计。
二、实验内容掌握平移、缩放、旋转变换的基本原理,理解线段裁剪的算法原理,并通过程序设计实现上述变换。
建议采用VC++实现OpenGL程序设计。
三、实验原理、方法和手段1.图形的平移在屏幕上显示一个人或其它物体(如图1所示),用交互操作方式使其在屏幕上沿水平和垂直方向移动Tx和Ty,则有x’=x+Tx y’=y+Ty其中:x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。
其交互方式可先定义键值,然后操作功能键使其移动。
2.图形的缩放在屏幕上显示一个帆船(使它生成在右下方),使其相对于屏幕坐标原点缩小s倍(即x方向和y方向均缩小s倍)。
则有:x’=x*s y’=y*s注意:有时图形缩放并不一定相对于原点,而是事先确定一个参考位置。
一般情况下,参考点在图形的左下角或中心。
设参考点坐标为xf、yf则有变换公式x’=x*Sx+xf*(1-Sx)=xf+(x-xf)*Sxy’=y*Sy+yf*(1-Sy)=yf+(y-yf)*Sy式中的x与y为变换前图形中某一点的坐标,x’和y’为变换后图形中该点的坐标。
当Sx>1和Sy>1时为放大倍数,Sx<1和Sy<1时为缩小倍数(但Sx 和Sy必须大于零)。
3.图形的旋转在屏幕上显示一个汽车,根据自己确定的旋转角度和旋转中心对图形进行旋转。
旋转公式为x’=xf+(x-xf)*cos(angle)-(y-yf)*sin(angle)y’=yf+(y-yf)*cos(angle)+(x-xf)*sin(angle)其中:xf,yf为围绕旋转的中心点的坐标。
二维三维图形的变换原理和算法
– a2和b1的取值不同,错切变换分为:
• 沿 x 向错切 • 沿 y 向错切
错切变换
错切变换
– 沿 x 向错切
1 a2 0 T = b1 1 0
0 01
• 令a2=0,沿 x 向错切的变换矩阵为:
1 00 T= b1 1 0
0 01
1 00 则[ x* y* 1] = [ x y 1 ] b1 1 0 = [ x+b1y y 1 ]
比例变换
比例变换
– 下面讨论缩放因子a1,b2 对图形变换的影响:
• a1 = b2 = 1, 为恒等变换,即变换后点的坐标不变。 • a1 = b2 ≠1,则为等比例变换。
–a1 = b2 >1,图形沿 x 和 y 两个方向等比例放大。 –0 < a1 = b2 <1,图形沿 x 和 y 两个方向等比例例缩小。
第4章 图形几何变换
图形变换的基本原理 二维图形的变换 三维图形的变换 三维投影变换 任意视点透视变换
图形变换的基本原理
图形变换是计算机图形学中的一个重要内 容。
通过对简单图形进行各种变换,可以改变 图形的形状;
将简单图形进行变换并组合,可以形成一 些复杂的图形;
图形变换也是造型的方法之一。
既然图形的几何变换仅和点的位置变化有关, 所以,我们首先要讨论一个点在空间的位置及 其变化。
– 在二维空间中,可用一对坐标值(x,y)来表示平面 上的一点,或者说可以用一个向量[x y]来标定一 个点的位置。
– 在三维空间中则用(x,y,z)表示空间一点,也可 以用向量[x y z]来标定一个点的位置。
图形变换的基本原理
在实际绘图应用中,经常要对图形进行各种变 换,如几何变换、投影变换、窗口视区变换和 视向变换等。
第4章 二维图形变换_几何变换
y
几何关系
x' y y' x
o
x
矩阵形式
对称变换(5)
x
y 1 x
0 1 0 y 1 1 0 0 y x 1 0 0 1
2.错切变换(shear) (1)沿 x 轴方向关于 y 轴错切
将图形上关于y轴的平行线沿x方向推成θ角的
(4-1)
a b x ' y ' x y T x, y c d x ' ax cy a S x c 0 ' b 0 d S y y bx dy
矩阵形式
x
y x
Sx S y
y
2.旋转变换(rotation)
P
点P绕原点逆时针转θ度角 (设逆时针旋转方向为正方向)
P
x
旋转变换
几何关系
x r cos y r sin
(4-3)
x' r cos( ) r cos cos-r sin sin y ' r sin( ) r cos sin +r sin cos
4.齐次坐标表示
( x1 , x2 ,..., xn )
有n个分量的向量
(x1 , x2 ,..., xn , )
有n+1个分量的向量 哑元或标量因子
( x1 , x2 ,..., xn , )
( x1 / , x2 / ,..., xn / )
齐次坐标表示不是唯一的
1 规格化的齐次坐标
1 2 1 2 1 2 1 2
1
二维图形变换原理及齐次坐标
⼆维图形变换原理及齐次坐标⼆维图形变换通过学习【向量分析】和【图形变换】,可以设计出⼀些⽅法来描述我们所遇见的各种⼏何对象,并学会如何把这些⼏何⽅法转换成数字。
⼀、向量从⼏何⾓度看,向量是具有长度和⽅向的实体,但是没有位置。
⽽点是只有位置,没有长度和⽅向。
在⼏何中把向量看成从⼀个点到另⼀个点的位移。
1、向量的基本知识(1)向量的表⽰从P点到Q点的位移⽤向量v=(3,-2)表⽰。
v是从点P到点Q的向量,两个点的差是⼀个向量:v=Q-P换个⾓度,可以说点Q是由点P平移向量v得到的,或者说v偏移P得到Q:Q=P+v(2)向量的基本运算向量的加(减)法可以采⽤“平⾏四边形法则”(3)向量线性组合m个向量v1,v2,...,v m的线性组合具有如下形式的向量:w=a1v1+a2v2+...+a n v n1>仿射组合线性组合的[系数的和等于1],那么它就是仿射组合a1+a2+...+a m=12>向量的凸组合a1+a2+...+a m=1,[a i>=0(i=1,2,...,m)]2、向量的点积和叉积【点积得到⼀个标量,叉积产⽣⼀个新的向量。
】(1)向量的点积a=(a1,a2) b=(b1,b2)点积最重要的应⽤就是计算两个向量的夹⾓,或者两条直线的夹⾓:可知,两个⾮零向量夹⾓与点积的关系:(2)向量的叉积两个向量的叉积是另⼀个三维向量。
【叉积只对三维向量有意义】最常⽤的属性是【它与原来的两个向量都正交】【利⽤叉积求平⾯的法向量】垂直于平⾯的直线所表⽰的向量为该平⾯的法向量。
⼆、图形坐标系坐标系是建⽴图形与数之间对应联系的参考系1、坐标系的分类从维度上看,可分为⼀维、⼆维、三维坐标系。
从坐标轴之间的空间关系来看,可分为直⾓坐标系、极坐标系、圆柱坐标系、球坐标系等。
在计算机图形学中,从物体(场景)的建模,到在不同显⽰设备上显⽰、处理图形时同样使⽤⼀系列的坐标系2、计算机图形学中坐标系的分类(1)世界坐标系描述对象的空间被称为世界坐标系,即场景中物体在实际世界中的坐标。
相对任意方向的二维几何变换
相对任意方向的二维几何变换平面上的二维几何变换是指将平面上的一个点或一组点通过某种规则进行变换,得到新的点或点集的过程。
这些变换可以是平移、旋转、缩放、对称等。
在本文中,将分别介绍这些二维几何变换的定义、特点和应用。
一、平移变换平移变换是指将平面上的点沿着指定的方向进行移动,距离为指定的平移向量。
平移变换的特点是保持形状和大小不变,只改变位置。
平移变换可以用向量表示,即用平移向量将原始点的坐标进行平移,得到新点的坐标。
平移变换的应用非常广泛,比如在计算机图形学中,平移变换常用于图像的移动、平面的平移等。
此外,在几何学中,平移变换也可以用于解决平面图形的位置关系、求解线段的平移等问题。
二、旋转变换旋转变换是指将平面上的点绕着指定的旋转中心按照指定的角度进行旋转。
旋转变换的特点是保持形状和大小不变,只改变方向和位置。
旋转变换可以用旋转角度和旋转中心表示,即通过旋转矩阵将原始点的坐标进行旋转,得到新点的坐标。
旋转变换的应用也非常广泛,比如在航空航天中,旋转变换常用于描述飞机的姿态变化;在计算机图形学中,旋转变换常用于图像的旋转、三维模型的旋转等。
此外,在几何学中,旋转变换也可以用于解决线段的旋转、图形的对称等问题。
三、缩放变换缩放变换是指将平面上的点按照指定的比例进行放大或缩小。
缩放变换的特点是保持形状不变,只改变大小。
缩放变换可以用缩放因子表示,即通过缩放矩阵将原始点的坐标进行缩放,得到新点的坐标。
缩放变换的应用也非常广泛,比如在计算机图形学中,缩放变换常用于图像的放大、缩小、三维模型的缩放等。
此外,在几何学中,缩放变换也可以用于解决图形的相似性判断、线段的伸缩等问题。
四、对称变换对称变换是指将平面上的点按照指定的对称中心或对称轴进行镜像。
对称变换的特点是保持形状不变,只改变方向。
对称变换可以用对称中心或对称轴表示,即通过对称变换的公式将原始点的坐标进行镜像,得到新点的坐标。
对称变换的应用也非常广泛,比如在几何学中,对称变换常用于解决图形的对称性判断、线段的对称等问题。
二维图形的几何变换 对称、平移
实验五.二维图形的几何变换1.算法分析对称和平移均可利用数学里的坐标系的点的坐标计算出新图形的每个顶点的坐标2.代码实现void CHuXiaoHua_graphics5View::Onsymmetry(){// TODO: Add your command handler code hereRedrawWindow();CDC* pDC=GetDC();CPen newpen(PS_SOLID,3,RGB(65,34,53));CPen *old=pDC->SelectObject(&newpen);CPoint spt [10];spt[0]=CPoint(100,30); //绘制多边形区域spt[1]=CPoint(150,80);spt[2]=CPoint(150,150);spt[3]=CPoint(115,150);spt[4]=CPoint(115,115);spt[5]=CPoint(85,115);spt[6]=CPoint(85,150);spt[8]=CPoint(50,80);spt[9]=CPoint(100,30);pDC->Polyline(spt,10);for(int i=0;i<=9;i++){spt[i].x=400-spt[i].x;}pDC->Polyline(spt,10);}void CHuXiaoHua_graphics5View::Ontranslation() {// TODO: Add your command handler code here RedrawWindow();CDC* pDC=GetDC();CPen newpen(PS_SOLID,3,RGB(65,34,53));CPen *old=pDC->SelectObject(&newpen);CPoint spt [10];spt[0]=CPoint(100,30); //绘制多边形区域spt[1]=CPoint(150,80);spt[3]=CPoint(115,150);spt[4]=CPoint(115,115);spt[5]=CPoint(85,115);spt[6]=CPoint(85,150);spt[7]=CPoint(50,150);spt[8]=CPoint(50,80);spt[9]=CPoint(100,30);pDC->Polyline(spt,10);for(int i=0;i<=9;i++){spt[i].y+=120;}pDC->Polyline(spt,10); }3.运行结果对称平移。
- 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++项目