计算机图形学 图形几何变换的实现
计算机图形学第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为对称矩阵,通过矩阵乘法将原坐标进行对称。
对称变换常用于图像处理中,实现图像的镜像翻转、对称图案的生成等。
五、投影变换投影变换是指将三维物体投影到二维平面上的操作,常见的有透视投影和正交投影两种形式。
投影变换常用于计算机图形学中,实现三维物体的绘制和显示。
总结:数学几何变换的方法包括平移、旋转、缩放、对称和投影等。
这些变换方法在各个领域中都有重要应用,比如游戏开发、图像处理、计算机辅助设计等。
掌握几何变换的方法对于理解和应用相关领域的技术具有重要意义。
计算机形学中的几何变换与投影技术
计算机形学中的几何变换与投影技术计算机形学是计算机科学与计算机图形学中重要的一个领域,它研究如何在计算机上对图形进行表示、创建、编辑和呈现。
其中,几何变换和投影技术是计算机形学中常用且核心的技术之一,它们在计算机图形学领域中被广泛应用。
一、几何变换在计算机图形学中,几何变换是指对图形进行平移、旋转、缩放和扭曲等操作,从而改变图形的位置、形状和大小,以满足特定需求。
1. 平移变换平移变换是对图形进行沿着指定方向和距离的移动。
在二维空间中,平移变换可以表示为:x' = x + dxy' = y + dy其中,(x', y')是平移后的坐标,(x, y)是原始坐标,(dx, dy)是平移的向量。
2. 旋转变换旋转变换是对图形进行绕指定点或绕原点的旋转操作。
在二维空间中,旋转变换可以表示为:x' = x * cosθ - y * sinθy' = x * sinθ + y * cosθ其中,(x', y')是旋转后的坐标,(x, y)是原始坐标,θ是旋转角度。
3. 缩放变换缩放变换是对图形进行放大或缩小的操作。
在二维空间中,缩放变换可以表示为:x' = x * sxy' = y * sy其中,(x', y')是缩放后的坐标,(x, y)是原始坐标,(sx, sy)是缩放因子。
4. 扭曲变换扭曲变换是对图形进行形状的变换,使得某些部分被拉伸或收缩。
扭曲变换可以通过矩阵运算进行表示,具体操作较为复杂。
二、投影技术在计算机图形学中,投影技术是指将三维空间中的图形映射到二维平面上的过程。
常见的投影技术包括平行投影和透视投影。
1. 平行投影平行投影是一种保持图形中平行线在投影后保持平行的投影方式。
在三维空间中,平行投影可以表示为:x' = xy' = y其中,(x', y')是投影平面上的坐标,(x, y)是三维空间中的坐标。
计算机图形学第五章图形变换
第五章图形变换重 点:掌握二维几何变换、二维观察变换、三维几何变换以及三维观察变换。
难 点:理解常用的平移、比例、旋转变换,特别是复合变换。
课时安排:授课4学时。
图形变换包括二维几何变换, 二维观察变换,三维几何变换和三维观察变换。
为了能使各种几何变换(平移、旋转、比例等)以相同的矩阵形式表示,从而统一使用矩阵乘法运算来实现变 换的组合,现都采用齐次坐标系来表示各种变换。
有齐次坐标系齐次坐标系:n 维空间中的物体可用 n+1维齐次坐标空间来表示。
例如二维空间直线 ax+by+c=O ,在齐次空间成为 aX+bY+cW=0 ,以X 、Y 和W 为三维变量,构成没有常数项的 三维平面(因此得名齐次空间)。
点P (x 、y )在齐次坐标系中用P (wx,wy,w )表示,其中 W 是不为零的比例系数。
所以从 n 维的通常空间到 n+1维的齐次空间变换是一到多的变换,而其反变换 是多到一的变换。
例如齐次空间点P (X 、Y 、W )对应的笛卡尔坐标是 x=X/W 和y=Y/W 。
将通一地用矩阵乘法来实现变换的组合。
常笛卡尔坐标用齐次坐标表示时, W 的值取1。
采用齐次坐标系可以将平移、比例、旋转这三种基本变换都以相同的矩阵形式来表示,并统齐次坐标系在三维透视变换中有更重要的作用, 示形它使非线形变换也能采用线形变换的矩阵表式。
图形变换平移变换图示如图所示,它使图形移动位置。
新图 p'的每一图元点是原图形 p 中每个图元点在向分别移动Tx 和Ty 产生,所以对应点之间的坐标值满足关系式x'=x+Tx y'=y+Ty可利用矩阵形式表示成:[x' y' ] = : x y ] + : Tx Ty ]简记为:P'= P+T , T= : Tx Ty ]是平移变换矩阵(行向量)二堆几何变换1 1二维观察变換三维几诃变换平移变换 比例变换 陡转变换 对称变换 错切变换 仿肘变换 复合变换平移变换 比例变换 旋转变换 绕空间任意轴離转 对称变换 蜡切变换三维观察变5.1二维几何变换二维几何变换就是在平面上对二维点的坐标进行变换,从而形成新的坐标。
实验报告几何变换实验
实验报告几何变换实验实验报告:几何变换实验引言:几何变换是计算机图形学中的重要概念,它可以改变图像的形状、位置和大小。
在本次实验中,我们将通过对几何变换的实际操作,深入了解几何变换的原理和应用。
一、实验目的本次实验的主要目的是探究几何变换在图像处理中的应用,具体包括平移、旋转、缩放和翻转等几何变换操作。
通过实际操作和观察,我们将了解几何变换对图像的影响,并学习如何使用计算机编程实现这些变换。
二、实验材料和方法1. 实验材料:- 一台计算机- 图像处理软件(如Photoshop、GIMP等)- 编程软件(如Python、MATLAB等)2. 实验方法:- 步骤一:选择一张图片作为实验对象,并导入到图像处理软件中。
- 步骤二:使用图像处理软件进行平移操作,观察图像的位置变化。
- 步骤三:使用图像处理软件进行旋转操作,观察图像的旋转效果。
- 步骤四:使用图像处理软件进行缩放操作,观察图像的大小变化。
- 步骤五:使用图像处理软件进行翻转操作,观察图像的翻转效果。
- 步骤六:使用编程软件编写程序,实现上述几何变换操作,并观察结果。
三、实验结果与分析1. 平移操作:在实验中,我们发现通过平移操作,可以将图像在水平和垂直方向上进行移动。
通过调整平移的距离和方向,我们可以改变图像在画布上的位置。
这种操作常用于图像的对齐和拼接等应用中。
2. 旋转操作:旋转操作可以改变图像的角度和方向。
通过调整旋转的角度和中心点,我们可以使图像以不同的角度进行旋转。
这种操作常用于图像的矫正、仿射变换等应用中。
3. 缩放操作:缩放操作可以改变图像的大小。
通过调整缩放的比例,我们可以使图像变得更大或更小。
这种操作常用于图像的放大、缩小、裁剪等应用中。
4. 翻转操作:翻转操作可以改变图像的方向。
通过水平或垂直翻转,我们可以使图像在左右或上下方向发生镜像反转。
这种操作常用于图像的镜像处理、对称效果等应用中。
四、实验总结通过本次实验,我们深入了解了几何变换在图像处理中的应用。
计算机图形学之图形变换
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) 前面三种变换都可以表示为如下的矩
阵形式
计算机图形学_ 二维图形变换_53 二维图形变换原理及齐次坐标_
为什么要采用齐次坐标?
在笛卡儿坐标系内,向量(x,y)是位于z=0的平面上的点 ;而向量(x,y,1)是位于z=1的等高平面上的点
对于图形来说,没有实质性的差别,但是却给后面矩阵运 算提供了可行性和方便性
假如变换前的点坐标为(x,y),变换后的点坐标为(x*,y* ),这个变换过程可以写成如下矩阵形式:
x*, y*x,
x* a1x b 1 y c1
y•M
x*, y*x
a1
y
1
b 1
c1
a2 b2 c2
上两式是完全等价的。对于向量(x,y,1),可以在几何意义 上理解为是在第三维为常数的平面上的一个二维向量。
这种用三维向量表示二维向量,或者一般而言,用一个n+1维 的向量表示一个n维向量的方法称为齐次坐标表示法
n维向量的变换是在n+1维的空间进行的,变换后的n维结果 是被反投回到感兴趣的特定的维空间内而得到的。
如n维向量(p1,p2,...,pn)表示为(hp1,hp2,...,hpn,h), 其中h称为哑坐标。 普通坐标与齐次坐标的关系为“一对多”:
变换图形就是要变换图形的几何关系,即改变顶点的坐 标;同时,保持图形的原拓扑关系不变
仿射变换(Affine Transformation或 Affine Map)是一 种二维坐标到二维坐标之间的线性变换 (1)“平直性”。即:直线经过变换之后依然是直线
(2)“平行性”。即:平行线依然是平行线,且直线上 点的位置顺序不变)
采用了齐次坐标表示法,就可以统一地把二维线形变换表示 如下式所示的规格化形式:
计算机图形学实验--完整版-带结果--vc++实现
计算机图形学实验报告信息学院计算机专业20081060183 周建明综括:利用计算机编程语言绘制图形,主要实现以下内容:(1)、中点算法生成任意斜率直线,并设置线型线宽。
(2)、中点算法生成圆(3)、中点算法生成椭圆(4)、扫描算法实现任意多边形填充(5)、Cohen_Sutherland裁剪(6)、自由曲线与曲面的绘制(7)、二维图形变换(8)、三视图变换实验一、直线的生成一、实验内容根据提供的程序框架,修改部分代码,完成画一条直线的功能(中点画线法或者Bresenham画线法任选一),只要求实现在第一象限内的直线。
二、算法原理介绍双击直线生成.dsw打开给定的程序,或者先启动VC++,文件(file)→打开工作空间(open workspace)。
打开直线生成view.cpp,按注释改写下列函数:1.void CMyView::OnDdaline() (此为DDA生成直线)2.void CMyView::OnBresenhamline()(此为Bresenham画直线)3.void CMYView::OnMidPointLine()(此为中点画线法)三、程序源代码1.DDA生成直线画法程序:float x,y,dx,dy,k;dx=(float)(xb-xa);dy=(float)(yb-ya);k=dy/dx;x=xa;y=ya;if(abs(k)<1){for (x=xa;x<=xb;x++){pdc->SetPixel(x, int(y+0.5),COLOR);y=y+k;}}if(abs(k)>=1){for(y=ya;y<=yb;y++){pdc->SetPixel(int(x+0.5),y,COLOR);x=x+1/k;}}//DDA画直线结束}2.Bresenham画直线源程序:float b,d,xi,yi;int i;float k;k=(yb-ya)/(xb-xa);b=(ya*xb-yb*xa)/(xb-xa);if(k>0&&k<=1)for(i=0;i<abs(xb-xa);i++){ d=ya+0.5-k*(xa+1)-b;if(d>=0){ xi=xa+1;yi=ya;xa++;ya=ya+0.5;}if(d<0){ xi=xa+1;yi=ya+1;xa++;ya=ya+1.5;}pdc->SetPixel(xi,yi,COLOR);}//BresenHam画直线结束}3.中点画线法源程序:float b,d,xi,yi;int i;float k;k=(yb-ya)/(xb-xa);b=(ya*xb-yb*xa)/(xb-xa);if(k>0&&k<=1)for(i=0;i<abs(xb-xa);i++){ d=ya+0.5-k*(xa+1)-b;if(d>=0){ xi=xa+1;yi=ya;xa++;ya=ya+0.5;}if(d<0){ xi=xa+1;yi=ya+1;xa++;ya=ya+1.5;}pdc->SetPixel(xi,yi,COLOR); }//BresenHam画直线结束}四、实验结果1、DDA生成直线2、Bresenham画直线3、中点画线法实验二、bresenham画圆一、实验内容根据提供的程序框架,修改部分代码,用Bresenham画法画一段圆弧或者画圆。
如何进行平移旋转翻转等几何变换
如何进行平移旋转翻转等几何变换如何进行平移、旋转、翻转等几何变换几何变换是几何学中重要的概念,广泛应用于计算机图形学、游戏开发、计算机辅助设计和工程制图等领域。
通过几何变换,我们可以改变图形的位置、方向和形状,从而达到我们想要的效果。
本文将介绍如何进行平移、旋转和翻转等几何变换,并提供示例说明。
一、平移变换平移变换是指在平面内将图形沿着某个方向移动一定的距离。
平移变换不改变图形的大小和形状,只改变其位置。
对于平面上的一个点(x, y),平移变换的公式为:新的坐标点 = (x + dx, y + dy)其中,dx和dy分别代表在x轴和y轴上的平移距离。
例如,如果要将一个点(2, 3)沿x轴正方向平移3个单位,沿y轴正方向平移2个单位,则变换后的新坐标为(5, 5)。
平移变换也可以用矩阵进行表示。
平移变换矩阵如下所示:[1 0 dx][0 1 dy][0 0 1]二、旋转变换旋转变换是指将图形绕某个点旋转一定的角度。
通过旋转变换,我们可以改变图形的方向和位置。
对于平面上的一个点(x, y),绕原点旋转θ度后的新坐标计算公式为:新的坐标点= (x * cosθ - y * sinθ, x * sinθ + y * cosθ)其中,θ为旋转角度。
例如,如果要将点(1, 1)绕原点逆时针旋转45度,则变换后的新坐标为(0, √2)。
旋转变换也可以用矩阵进行表示。
旋转变换矩阵如下所示:[cosθ -sinθ 0][sinθ cosθ 0][0 0 1]三、翻转变换翻转变换是指将图形关于某个轴或某个点进行对称翻转。
翻转变换有水平翻转和垂直翻转两种情况。
1. 水平翻转:对于平面上的一个点(x, y),关于x轴进行水平翻转后的新坐标计算公式为:新的坐标点 = (x, -y)例如,将点(2, 3)关于x轴进行水平翻转,则变换后的新坐标为(2, -3)。
2. 垂直翻转:对于平面上的一个点(x, y),关于y轴进行垂直翻转后的新坐标计算公式为:新的坐标点 = (-x, y)例如,将点(2, 3)关于y轴进行垂直翻转,则变换后的新坐标为(-2, 3)。
计算机图形学实验报告
计算机图形学实验报告
在计算机图形学课程中,实验是不可或缺的一部分。
通过实验,我们可以更好地理解课程中所学的知识,并且在实践中掌握这些
知识。
在本次实验中,我学习了如何使用OpenGL绘制三维图形,并了解了一些基本的图形变换和视图变换。
首先,我们需要通过OpenGL的基本命令来绘制基本图形,例
如线段、矩形、圆等。
这些基本的绘制命令需要首先设置OpenGL 的状态,例如绘制颜色、线段宽度等,才能正确地绘制出所需的
图形。
然后,在实验中我们学习了图形的变换。
变换是指通过一定的
规则将图形的形状、位置、大小等进行改变。
我们可以通过平移、旋转、缩放等变换来改变图形。
变换需要按照一定的顺序进行,
例如先进行旋转再进行平移等。
在OpenGL中,我们可以通过设
置变换矩阵来完成图形的变换。
变换矩阵包含了平移、旋转、缩
放等信息,通过矩阵乘法可以完成图形的复合变换。
最后,视图变换是指将三维场景中的图形投影到二维平面上,
成为我们所见到的图形。
在实验中,我们学习了透视投影和正交
投影两种方式。
透视投影是指将场景中的图形按照视点不同而产
生不同的远近缩放,使得图形呈现出三维感。
而正交投影则是简单地将场景中的图形按照平行投影的方式呈现在屏幕上。
在OpenGL中,我们可以通过设置视图矩阵和投影矩阵来完成视图变换。
通过本次实验,我对于计算机图形学有了更深入的了解,并掌握了一些基本的图形绘制和变换知识。
在今后的学习中,我将继续学习更高级的图形绘制技术,并应用于实际的项目中。
《计算机图形学》实验报告
实验报告模板《计算机图形学》实验报告一、实验目的及要求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. 了解计算机图形学的基本概念和发展历程;2. 掌握图形学中的基本几何变换,如平移、旋转和缩放等;3. 实现一些常见的图形学算法,如光照模型、三角形剪裁和绘制等。
实验准备在开始实验之前,我们需要准备一些实验所需的工具和环境。
首先,确保计算机上安装了图形学相关的软件,如OpenGL或DirectX等。
其次,为了编写和运行图形学程序,我们需要掌握基本的编程技巧,如C++或Python语言,并了解相关的图形库和API。
实验过程1. 实现平移、旋转和缩放首先,我们需要掌握图形学中的基本几何变换,如平移、旋转和缩放。
通过矩阵运算,我们可以很方便地实现这些变换。
例如,对于一个二维点P(x, y),我们可以通过以下公式实现平移:P' = T * P其中,P'是平移后的点,T是平移矩阵。
类似地,我们可以用旋转矩阵和缩放矩阵来实现旋转和缩放效果。
2. 实现光照模型光照模型是指在计算机图形学中模拟现实光照效果的一种方法。
它可以提供更真实的视觉效果,让计算机生成的图像更加逼真。
其中,常用的光照模型有环境光照、漫反射光照和镜面光照等。
通过计算每个像素的光照强度,我们可以实现阴影效果和光源反射等功能。
3. 实现三角形剪裁三角形剪裁是计算机图形学中一种常用的几何算法,用于确定哪些像素需要绘制,哪些像素需要剔除。
通过对三角形的边界和视口进行比较,我们可以快速计算出剪裁后的三角形顶点,以提高图形渲染的效率。
4. 实现图形绘制图形绘制是计算机图形学中的核心内容,它包括了点、线和面的绘制等。
通过设定顶点坐标和属性(如颜色、纹理等),我们可以使用算法绘制出各种形状的图像。
其中,常用的绘制算法有Bresenham算法和扫描线算法等。
图像几何变换的原理及应用
图像几何变换的原理及应用1. 引言图像几何变换是指通过对图像进行旋转、平移、缩放和仿射变换等操作,改变图像的位置、大小和形状,以达到特定的目的。
在计算机视觉、图像处理和计算机图形学等领域中,图像几何变换被广泛应用于图像的校正、增强、变换和特征提取等任务。
2. 原理图像几何变换的原理基于几何学的相关理论。
对于二维图像来说,可以通过变换矩阵对图像进行坐标变换,从而实现图像的几何变换。
以下是常见的图像几何变换操作及其原理:2.1 旋转旋转是指将图像按一定角度绕某个中心点进行旋转变换。
旋转操作可以通过变换矩阵实现,变换矩阵如下所示:cosθ -sinθ 0sinθ cosθ 00 0 1其中,θ表示旋转的角度。
通过对每个像素进行坐标变换,可以实现图像的旋转。
2.2 平移平移是指将图像沿着水平或垂直方向进行平移操作,即改变图像的位置。
平移操作可以通过变换矩阵实现,变换矩阵如下所示:1 0 tx0 1 ty0 0 1其中,tx和ty分别表示在x轴和y轴上的平移距离。
通过对每个像素进行坐标变换,可以实现图像的平移。
2.3 缩放缩放是指改变图像的尺寸大小。
缩放操作可以通过变换矩阵实现,变换矩阵如下所示:sx 0 00 sy 00 0 1其中,sx和sy分别表示在x轴和y轴上的缩放比例。
通过对每个像素进行坐标变换,并根据缩放比例进行采样,可以实现图像的缩放。
2.4 仿射变换仿射变换是指通过线性变换和平移来对图像进行变换。
仿射变换可以通过变换矩阵实现,变换矩阵如下所示:a11 a12 txa21 a22 ty0 0 1其中,a11、a12、a21和a22分别表示仿射变换的线性变换部分,tx和ty分别表示平移部分。
通过对每个像素进行坐标变换,并根据变换矩阵进行计算,可以实现图像的仿射变换。
3. 应用图像几何变换在各个领域中有着广泛的应用,以下列举了一些常见的应用场景:3.1 图像校正在图像处理中,由于各种因素的影响,例如相机畸变、透视变换等,图像可能会出现失真或畸变。
几何变换的基本概念与操作
几何变换的基本概念与操作几何变换是计算机图形学中的重要概念,它可以将一个图形对象从一个位置、方向或大小变换到另一个位置、方向或大小,通过不同的变换操作,可以实现各种形状和位置的变化。
本文将介绍几何变换的基本概念和操作,包括平移、旋转、缩放和反射四种变换。
一、平移平移是指将图形对象按照指定的向量在平面内沿着直线移动,其作用是改变图形对象的位置而不改变其形状和大小。
平移操作可以用一个向量表示,向量的坐标分别表示在x轴和y轴方向上的移动距离。
平移操作的数学表达式如下:```P' = P + T```其中,P表示原始点的坐标,P'表示平移后点的坐标,T表示平移向量的坐标。
二、旋转旋转是指将图形对象按照指定的角度围绕一个中心点旋转,其作用是改变图形对象的方向而不改变其形状和大小。
旋转操作可以用一个角度表示,角度的正负决定了旋转的方向。
旋转操作的数学表达式如下:P' = R * P```其中,P表示原始点的坐标,P'表示旋转后点的坐标,R表示旋转矩阵。
三、缩放缩放是指将图形对象按照指定的比例在水平和垂直方向上进行放大或缩小,其作用是改变图形对象的大小而不改变其形状。
缩放操作可以用一个缩放因子表示,缩放因子大于1表示放大,缩放因子小于1表示缩小。
缩放操作的数学表达式如下:```P' = S * P```其中,P表示原始点的坐标,P'表示缩放后点的坐标,S表示缩放矩阵。
四、反射反射是指将图形对象按照指定的轴线进行镜像翻转,其作用是改变图形对象的位置和方向而不改变其形状和大小。
反射操作可以用一个轴线表示,轴线可以是水平、垂直或任意一条直线。
反射操作的数学表达式如下:P' = M * P```其中,P表示原始点的坐标,P'表示反射后点的坐标,M表示反射矩阵。
综上所述,几何变换是计算机图形学中的重要概念,通过平移、旋转、缩放和反射四种基本操作,可以实现对图形对象的位置、方向和大小的变化。
旋转变换和放缩变换
旋转变换和放缩变换旋转变换和放缩变换是计算机图形学中常用的几何变换方法,可以通过改变图形的位置、角度和尺寸来实现图形的变形效果。
本文将深入探讨旋转变换和放缩变换的原理和应用。
一、旋转变换旋转变换是指改变一个图形的角度或方向,使其相对于原始位置发生旋转。
在计算机图形学中,旋转变换通常使用矩阵变换的方式来实现。
具体来说,我们可以通过以下公式进行旋转变换:[x′ y′ 1] = [x y 1] ⨀[cosθ -sinθ 0sinθ cosθ 00 0 1]其中[x y 1]表示原始点的坐标,[x′ y′ 1]表示旋转后的点的坐标,θ表示旋转角度,⨀表示矩阵相乘。
二、放缩变换放缩变换也被称为缩放变换或伸缩变换,是指改变一个图形的尺寸,使其相对于原始大小发生放大或缩小。
放缩变换也可以使用矩阵变换的方式来实现。
具体来说,我们可以通过以下公式进行放缩变换:[x′ y′ 1] = [x y 1] ⨀ [Sx 0 00 Sy 00 0 1]其中[x y 1]表示原始点的坐标,[x′ y′ 1]表示放缩后的点的坐标,Sx和Sy分别表示在x轴和y轴方向上的放缩比例。
三、旋转变换和放缩变换的应用1. 图形变形旋转变换和放缩变换可以应用于各种图形的变形效果,例如将一个矩形图形旋转一定角度,或者将一个圆形图形缩放到指定尺寸。
通过调整旋转角度和放缩比例,我们可以实现各种各样的图形变形效果,从而满足不同的设计需求。
2. 图像处理旋转变换和放缩变换在图像处理领域也有广泛的应用。
例如,在图像拼接中,我们可以通过旋转和放缩变换将多个图像拼接成一个全景图像;在图像缩放中,我们可以通过放缩变换改变图像的尺寸,使其适应不同的显示设备。
3. 三维建模在三维建模中,旋转变换和放缩变换是非常重要的操作。
通过旋转变换,我们可以改变三维模型的角度和方向,使其呈现出不同的视角;通过放缩变换,我们可以改变三维模型的大小,使其适应不同的场景需求。
旋转变换和放缩变换在三维建模软件中扮演着重要的角色,帮助设计师实现复杂的模型效果。
计算机图形学三维图形变换
主视图变换矩阵
1 0 0 0 1 0 0 0 1 0 0 0
Tv
0 0
0 0
0 1
0
0
0 0
0
0
பைடு நூலகம்
0
0
1 0 0 0
0 0 0 1 0 0
0
0
0
1
0
0 0 1
0
0 0 1
俯视图变换矩阵
1 0 0 0 1
0
0 0 1 0 0 0
TH
0 0
1 0
0 0
0 0 0 0
cos(90) sin(90)
三维图形变换
基本几何变换
基本几何变换都是相对于原点和坐标
轴进行的几何变换,有平移、缩放和 旋转等。在以下的讲述中,均假设用
p(x, y, z) 表示三维空间上一个未被变 换的点,而该点经过某种变换后得到 的新点用 p'(x', y', z') 表示。
平移变换
平移是指将点沿直线路径从一个坐标位置移动 到另一个坐标位置的一个重定位过程。
0 1
0
0
0 0
0 0 0 1 0 0
0
0
0
1
0
0
0
1
0
0 0 1
0 0 0 0 1 0 0 0
0 1 0 0 0 0 0 1
1 0 0 0
0
Rx ( )
0
c
d b
b
d c
0
0
dd
0 0 0 1
Ry ( )
d 0 a 0
Ry
(
)
0
a
1 0
0 d
几何变换的认识与计算方法
几何变换的认识与计算方法几何变换是指通过一系列的转换操作对几何图形进行位置、形状或大小的改变。
在计算机图形学和计算机视觉中,对几何图形进行变换是非常重要的。
本文将介绍几何变换的基本认识和常用的计算方法。
一、几何变换的基本认识1. 平移变换:平移变换是将图形沿着平行于原来位置的方向移动,只改变了图形的位置不改变其形状和大小。
平移变换的计算方法是将图形的每个点的坐标都加上一个平移向量来实现。
2. 旋转变换:旋转变换是将图形绕某个旋转中心按一定角度进行旋转,改变了图形的位置和形状。
旋转变换的计算方法可以使用旋转矩阵或三角函数来实现。
3. 缩放变换:缩放变换是通过改变图形的大小实现的。
缩放变换可以按照比例进行放大或缩小,也可以按照不同方向进行不等比例变换。
缩放变换的计算方法是将图形的每个点的坐标都乘上一个缩放因子来实现。
4. 对称变换:对称变换是通过图形的镜像对称来实现的。
对称变换可以是关于一个点、一条直线或一个平面的对称。
对称变换的计算方法是将图形的每个点的坐标按照对称轴进行变换来实现。
二、几何变换的计算方法1. 点的表示:在进行几何变换计算时,需要使用点的坐标来表示图形的位置。
通常使用二维坐标系中的(x, y)来表示点的位置,或者使用齐次坐标来表示点的位置。
2. 矩阵表示:几何变换可以通过矩阵的形式来表示和计算。
不同的几何变换对应着不同的变换矩阵,通过将变换矩阵与点的坐标进行相乘,可以得到变换后的点的坐标。
3. 坐标变换:在进行几何变换计算时,需要将图形的坐标系进行变换,使得变换后的点和变换前的点保持相对位置不变。
常见的坐标变换包括平移变换、旋转变换和缩放变换。
4. 变换顺序:多个几何变换可以按照不同的顺序进行组合,得到不同的效果。
在进行几何变换时,需要注意变换的顺序对最终结果的影响。
5. 变换矩阵的求解:针对不同的几何变换,可以通过数学方法求解得到相应的变换矩阵。
例如,对于平移变换,只需要将平移向量作为变换矩阵的一部分;对于旋转变换,可以使用旋转矩阵或三角函数来求解变换矩阵。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
计算机图形学图形几何变换的实现————————————————————————————————作者:————————————————————————————————日期:实验五图形几何变换的实现班级08信计2 学号89姓名徐阳分数一、实验目的和要求:1、掌握理解二维、三维变换的数学知识、变换原理、变换种类、变换方法;进一步理解采用齐次坐标进行二维、三维变换的必要性;利用Turboc实现二维、三维图形的基本变换和复合变换。
二、实验内容:1、理解采用齐次坐标进行图形变换的必要性——变换的连续性,使复合变换得以实现。
2、掌握二维、三维图形基本变换(平移、缩放、对称、旋转、错切)的原理及数学公式。
3、利用Turboc实现二维、三维图形的基本变换、复合变换,在屏幕上显示变换过程或变换结果。
三、实验结果分析:程序代码如下:/*二维图形(直线)平移变换*/#include<stdio.h>#include<graphics.h>#include<conio.h>main(){int x0,y0,x1,y1,i,j;int a[3][3];char key;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 graphdriver=DETECT;int graphmode=0;initgraph(&graphdriver,&graphmode," ");cleardevice();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();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(0);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];cleardevice();line(x0,y0,x1,y1);}closegraph();}2.三维图形(立方体)旋转和比例变换的算法:#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][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];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();setcolor(RGB(255,24,39));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,"");make_box(x,y,h,&a1);drawbox(&a1);for(;;)turn1[0];turn1[1];turn1[2];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; /*ESC*/default: key=0;break;}if(key!=0) drawbox(&a1);}closegraph();}。