计算机图形学--图形几何变换实现
计算机图形学第4章图形变换

反射变换
总结词
反射变换是将图形关于某一平面进行镜像反射的变换。
详细描述
反射变换可以通过指定一个法向量和反射平面来实现。法向量垂直于反射平面,指向反射方向。在二 维空间中,反射变换可以将图形关于x轴或y轴进行镜像反射;在三维空间中,反射变换可以将图形关 于某一平面进行镜像反射。
03
复合图形变换
组合变换
01
02
03
04
组合变换是指将多个基本图形 变换组合在一起,形成一个复
杂的变换过程。
组合变换可以通过将多个变换 矩阵相乘来实现,最终得到一
个复合变换矩阵。
组合变换可以应用于各种图形 变换场景,如旋转、缩放、平
移、倾斜等。
组合变换需要注意变换的顺序 和矩阵的乘法顺序,不同的顺 序可能导致不同的变换结果。
矩阵变换
矩阵变换是指通过矩阵运算对图形进 行变换的方法。
常见的矩阵变换包括平移矩阵、旋转 矩阵、缩放矩阵和倾斜矩阵等。
矩阵变换可以通过将变换矩阵与图形 顶点坐标相乘来实现,得到变换后的 新坐标。
矩阵变换具有数学表达式的简洁性和 可操作性,是计算机图形学中常用的 图形变换方法之一。
仿射变换
仿射变换是指保持图形中点与 点之间的线性关系不变的变换。
05
应用实例
游戏中的图形变换
角色动画
通过图形变换技术,游戏中的角 色可以完成各种复杂的动作,如
跑、跳、攻击等。
场景变换
游戏中的场景可以通过图形变换 技术实现动态的缩放、旋转和平 移,为玩家提供更加丰富的视觉
体验。
特效制作
图形变换技术还可以用于制作游 戏中的特效,如爆炸、火焰、水
流等,提升游戏的视觉效果。
THANKS
计算机图形学-变换

第3章 变换
基本的二维几何变换 二维复合变换 其他二维变换 三维几何变换 OpenGL几何变换函数 三维图形的显示流程 投影 裁剪
2
几何变换
应用于对象几何描述并改变它的位置、方 向或大小的操作称为几何变换(geometric transformation) 基本的二维几何变换包括平移、旋转和缩 放
8
矩阵表示和齐次坐标
许多图形应用涉及到几何变换的顺序 需要用一个通式来表示平移、旋转和缩放
P M1 P M 2
将2×2矩阵扩充为3×3矩阵,可以把二维几 何变换的乘法和平移项组合为单一矩阵表示
9
二维平移矩阵
x 1 0 t x x y 0 1 t y y 1 0 0 1 1
三维坐标轴旋转
X轴坐标不变,循环替代x、y、z三个 轴可以得到绕x轴旋转的公式
z
y ' y cos z sin
y
z ' y sin z cos x' x
x
35
三维坐标轴旋转
y轴坐标不变,循环替代x、y、z三个 轴可以得到绕y轴旋转的公式
x
z
y
z ' z cos x sin x' z sin x cos y' y
glMatrixMode (GL_MODELVIEW); glColor3f (0.0, 0.0, 1.0); glRecti (50, 100, 200, 150); //显示蓝色矩形
glColor3f (1.0, 0.0, 0.0); glTranslatef (-200.0, -50.0, 0.0); glRecti (50, 100, 200, 150); //显示红色、平移后矩形
数学几何变换的方法

数学几何变换的方法几何变换是数学中一项重要的研究内容,通过对图形进行不同的操作,可以实现平移、旋转、缩放等效果。
这些变换方法不仅在几何学中有着广泛的应用,还在计算机图形学、机器人学等领域发挥着重要作用。
本文将介绍几何变换的常见方法及其应用。
一、平移变换平移变换是指将图形沿着指定方向上移动一定距离的操作。
其数学表达式为:平移后的坐标 = 原坐标 + 平移矢量平移矢量的大小和方向决定了平移的距离和方向。
平移变换常用于游戏开发、图像处理等领域,可以实现图形的移动、平移动画效果等。
二、旋转变换旋转变换是指将图形围绕某个中心点按一定角度进行旋转的操作。
其数学表达式为:旋转后的坐标 = 中心点坐标 + R * (原坐标 - 中心点坐标)其中,R为旋转矩阵,通过矩阵乘法将原坐标进行旋转。
旋转变换常用于计算机图形学中,实现图像的旋转、三维模型的变换等。
三、缩放变换缩放变换是指改变图形的尺寸大小的操作。
其数学表达式为:缩放后的坐标 = 原坐标 * 缩放因子缩放因子可以是一个比例因子,用于确定缩放的大小,也可以是一个矩阵,对各个坐标轴进行不同程度的缩放。
缩放变换常用于计算机辅助设计、图像处理等领域,可以实现图形的放大、缩小、图像的拉伸等效果。
四、对称变换对称变换是指将图形绕着中心轴进行镜像翻转的操作。
其数学表达式为:对称后的坐标 = 中心轴坐标 + S * (原坐标 - 中心轴坐标)其中,S为对称矩阵,通过矩阵乘法将原坐标进行对称。
对称变换常用于图像处理中,实现图像的镜像翻转、对称图案的生成等。
五、投影变换投影变换是指将三维物体投影到二维平面上的操作,常见的有透视投影和正交投影两种形式。
投影变换常用于计算机图形学中,实现三维物体的绘制和显示。
总结:数学几何变换的方法包括平移、旋转、缩放、对称和投影等。
这些变换方法在各个领域中都有重要应用,比如游戏开发、图像处理、计算机辅助设计等。
掌握几何变换的方法对于理解和应用相关领域的技术具有重要意义。
计算机图形学之图形变换

4 T
3
2 p
1
0
012 34 567 8
线段和多边形的平移可以通过顶点的
平移来实现。同样线段和多边形的其它几 何变换也可以通过对顶点的几何变换来实 现。
2. 旋转变换(Rotation) 二维旋转有两个参数:
旋转中心: 旋转角:
?
6 P’
5
4
3
P
2
1
0
012 34 567 8
设OP与x轴的夹角为 则:
由于采用齐次坐标矩阵表示几何变换, 多个变换的序列相应地可以用矩阵链乘来表 示。
需要注意:先作用的变换其矩阵在右边, 后作用的变换其矩阵在左边。
变换函数
平移变换 void glTanslate{fd}(TYPE x, TYPE y, TYPE z);
旋转变换 void glRotate{fd}(TYPE angle, TYPE x, TYPE y, TYPE z); 绕矢量v=(x,y,z)T逆时针方向旋转angle指定的角度。 旋转角度的范围是0~360度。当angle=0时, glRotate()不起作用。
二维旋转有两个参数: 旋转中心: 旋转角:
上述变换可以分解为三个基本变换:
•平移:
•旋转:
•平移: 回原位。
使旋转中心移到坐标原点; 使旋转中心再移
二维旋转有两个参数: 旋转中心: 旋转角:
因此上述变换可以写成矩阵乘积形式:
4. 5 基本三维几何变换(Basic three-dimensional geometric transformation)
1. 矩阵表示(Matrix representation) 前面三种变换都可以表示为如下的矩
阵形式
几何变换与变换矩阵

几何变换与变换矩阵几何变换是计算机图形学中常用的一种技术,用于对二维或三维图形进行平移、旋转、缩放和剪切等操作。
这些操作可以通过变换矩阵来描述和计算。
本文将介绍几何变换的基本概念及其与变换矩阵的关系。
一、几何变换的基本概念1. 平移变换平移变换是将图形沿着指定的方向移动一定的距离。
在二维空间中,平移变换可以通过在原始坐标上加上一个向量来实现。
例如,将原始坐标(x, y)进行平移变换得到新的坐标(x', y'),可以表示为:x' = x + dxy' = y + dy其中,dx和dy分别为在x和y方向上的平移距离。
2. 旋转变换旋转变换是将图形绕指定的点或轴旋转一定的角度。
在二维空间中,旋转变换可以通过将原始坐标(x, y)绕着指定点(xc, yc)逆时针旋转θ角度得到新的坐标(x', y'),可以表示为:x' = (x - xc) * cosθ - (y - yc) * sinθ + xcy' = (x - xc) * sinθ + (y - yc) * cosθ + yc其中,(xc, yc)为旋转中心点,θ为旋转角度。
3. 缩放变换缩放变换是将图形沿着指定的方向进行放大或缩小。
在二维空间中,缩放变换可以通过将原始坐标(x, y)分别乘以指定的缩放因子sx和sy得到新的坐标(x', y'),可以表示为:x' = x * sxy' = y * sy其中,sx和sy分别为在x和y方向上的缩放因子。
4. 剪切变换剪切变换是将图形沿着指定的方向进行截取或拉伸。
在二维空间中,剪切变换可以通过将原始坐标(x, y)进行线性变换得到新的坐标(x', y'),可以表示为:x' = x + kx * yy' = y + ky * x其中,kx和ky分别为在x和y方向上的剪切因子。
二、变换矩阵的基本概念与计算方法变换矩阵是一种矩阵表示方法,用于描述几何变换的转换规则。
《计算机图形学》实验报告

实验报告模板《计算机图形学》实验报告一、实验目的及要求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);}}四、程序调试及结果的分析二维:三维:五、实验心得及建议在实验过程中,尽管过程中任由许多不会的地方,而且有待于今后的提高和改进,但我加深了对书本上知识的理解与掌握,同时也学到了很多书本上没有东西,并积累了一些宝贵的经验,这对我以后的学习与工作是不无裨益的。
计算机图形学--第八讲 图形的三维几何变换

3
变换通式
空间点[x y z] 的四维齐次坐标 [X Y Z H]表示
三维空间点的变换为 [x y z 1] T = [x’ y’ z’ 1]
变换前点的坐标 三维图形的变换矩阵
变换后点的坐标
三维图形变换矩阵通式为4 x 4 方阵
a b c p
T = d
e
5.关于Y轴对称
特点: y 值不变,zx坐标符号改变
[x y z 1] T = [-x y -z 1]
6.关于Z轴对称
特点: z值不变,xy坐标符号改变
[x y z 1] T = [-x -y z 1]
5.3 图形的三维几何变换—三维基本变换(13)
对称变换示意图
17
5.3 图形的三维几何变换—三维基本变换(14)
(x’, y’, z’)
x = xcos −ysin
y = xsin +ycos
z = z
矩阵运算的表达式为
z
cos sin 0 0
x
y
z 1 = x
y
z
1
−
sin
0
cos
0
0
0
1 0
0
0 0 1
y
(x, y, z)
x
10
5.4 图形的三维几何变换-三维基本变换(7)
绕X轴旋转
与二维图形的组合变换一样, 三维立体图形也可通过 三维基本变换矩阵, 按一定顺序依次相乘而得到一个 组合矩阵(称级联), 完成组合变换。
三维组合平移、组合旋转和组合比例变换与二维组合 平移、组合旋转和组合比例变换具有类似的规律。
19
5.3 图形的三维几何变换—三维复合变换(2)
计算机图形学实验报告

计算机图形学实验报告引言计算机图形学是计算机科学中一个重要的研究领域,它涉及了计算机图像的生成、处理和显示等方面的技术。
本次实验旨在通过实际操作学习计算机图形学的相关知识,并利用图形学算法实现一些有趣的效果。
实验目的1. 了解计算机图形学的基本概念和发展历程;2. 掌握图形学中的基本几何变换,如平移、旋转和缩放等;3. 实现一些常见的图形学算法,如光照模型、三角形剪裁和绘制等。
实验准备在开始实验之前,我们需要准备一些实验所需的工具和环境。
首先,确保计算机上安装了图形学相关的软件,如OpenGL或DirectX等。
其次,为了编写和运行图形学程序,我们需要掌握基本的编程技巧,如C++或Python语言,并了解相关的图形库和API。
实验过程1. 实现平移、旋转和缩放首先,我们需要掌握图形学中的基本几何变换,如平移、旋转和缩放。
通过矩阵运算,我们可以很方便地实现这些变换。
例如,对于一个二维点P(x, y),我们可以通过以下公式实现平移:P' = T * P其中,P'是平移后的点,T是平移矩阵。
类似地,我们可以用旋转矩阵和缩放矩阵来实现旋转和缩放效果。
2. 实现光照模型光照模型是指在计算机图形学中模拟现实光照效果的一种方法。
它可以提供更真实的视觉效果,让计算机生成的图像更加逼真。
其中,常用的光照模型有环境光照、漫反射光照和镜面光照等。
通过计算每个像素的光照强度,我们可以实现阴影效果和光源反射等功能。
3. 实现三角形剪裁三角形剪裁是计算机图形学中一种常用的几何算法,用于确定哪些像素需要绘制,哪些像素需要剔除。
通过对三角形的边界和视口进行比较,我们可以快速计算出剪裁后的三角形顶点,以提高图形渲染的效率。
4. 实现图形绘制图形绘制是计算机图形学中的核心内容,它包括了点、线和面的绘制等。
通过设定顶点坐标和属性(如颜色、纹理等),我们可以使用算法绘制出各种形状的图像。
其中,常用的绘制算法有Bresenham算法和扫描线算法等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五 图形几何变换的实现班级:信计二班 学号: :解川 分数:一、实验目的为了掌握理解二维、三维的数学知识、变换原理、变换种类、变换方法;进一步理解采用齐次坐标进行二维、三维变换的必要性;利用VC++语言实现二维、三维图形的基本变换与复合变换。
二、实验容(1) 理解采用齐次坐标进行图形变换的必要性——变换的连续性,使复合变换得以实现。
(2) 掌握二维、三维图形基本变换的原理及数学公式。
(3) 利用VC++语言实现二维、三维图形的基本变换、复合变换,在评不上显示变换过程或变换结果。
三、实验步骤(1) 预习教材关于二维、三维图形变换的原理与方法。
(2) 使用VC++语言实现某一种或几种基本变换。
(3) 调试、编译、运行程序。
四、原理分析源程序分别实现了对二维图形进行的平移变换—基本变换;对三维图形进行的绕某一个坐标轴旋转变换以及相对于立方体中心的比例变换—复合变换。
三维几何变换:(1) 比例变换:[]1111z y x =[]1z y x T 3D =[]1z y x ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡s n m l r j i h q f e d p c b q 局部比例变换:s T =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡1000000000000j e a 其中a 、b 、j 分别为在x 、y 、z 方向的比例系数。
整体比例变换:s T =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡s 000010000100001其中s 为在xyz 方向的等比例系数。
S>1时,整体缩小;s<1时,整体放大。
(2) 旋转变换:旋转变换的角度方向为(沿坐标轴的反方向看去,各轴按逆时针方向旋转) 绕z 轴旋转:RZ T =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-100010000cos sin 00sin cos θθθθ 绕x 轴旋转: RX T =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-10000cos sin 00sin cos 00001θθθθ 绕y 轴旋转: RY T =⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡-10000cos 0sin 00100sin 0cos θθθθ 程序代码: /*三维图形(立方体)旋转变换、比例变换*/#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];/*[0]rx,[1]ry,[3]zoom*/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 trun2d(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 transfrom(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);transfrom(p,q,t);break;case -1:rotationy(p,-2,t);transfrom(p,q,t);break;default:break;}switch (turn1[1]){case 1:rotationz(p,2,t);transfrom(p,q,t);break;case -1:rotationz(p,-2,t);transfrom(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]);trun2d(&p->biao[i],&fan2d[i]);fan2d[i].x+=300;fan2d[i].y+=200;}cleardevice();outtext(" -> :right <- :left ^ :up v :down");moveto(0,20);outtext(" page up:zoom in page down:zoom out space :Redraw 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," ");setcolor(GREEN);make_box(x,y,h,&a1);for(;;){turn1[0]=0;turn1[1]=0;turn1[2]=0;key=getch();switch(key){case 77: turn1[0]=1;break; /*RIGHT*/ case 75: turn1[0]=-1;break; /*LIFT*/ case 72: turn1[1]=1;break; /*UP*/case 80: turn1[1]=-1;break; /*DOWN*/ case 73: turn1[2]=1;break; /*Zoom In*/ case 81: turn1[2]=-1;break; /*Zoom Out*/ case 32: make_box(x,y,h,&a1);break; /*Redraw*/ case 27: exit(0);break;default : key=0;break;}if(key!=0) drawbox(&a1);}closegraph();}五、实验结果:原始图形:左右旋转图形:上下旋转图形:放大图形:. . . .六、实验体会:在老师的细心指导下,利用本实验完成了在计算机中实现三维立体图形的缩放旋转,对立体图形有了更深层次的认识,对VC++有了更深层次的了解,让我对计算机产生了更深刻的兴趣。