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

合集下载

二维图形变换

二维图形变换
{
Pt[i].x = (float)Pt[i].x * cos(dRadiusAngle) - (float)Pt[i].y * sin(dRadiusAngle);
Pt[i].y = (float)Pt[i].x * sin(dRadiusAngle) + (float)Pt[i].y * cos(dRadiusAngle);
{
Pt[i].x *= 0.5;
Pt[i].y *= 0.5;
}
Pt[0] = TmpPt;
Pt[1] = Pt[1] + Pt[0];
Pt[2] = Pt[2] + Pt[0];
break;
case 0X58://X的ASCII码
Pt[1] = Pt[1] - Pt[0];
Pt[2] = Pt[2] - Pt[0];
}
RedrawWindow();
}//实现图形旋转
void CTransView::OnTransformScale()
{
// TODO: Add your command handler code here
float dScaleX = 2.0;
float dScaleY = 0.5;
for(int i=0; i<3; i++)
pDC->MoveTo(Pt[0]);
pDC->LineTo(Pt[1]);
pDC->LineTo(Pt[2]);
pDC->LineTo(Pt[0]);
//绘出以(500,240)为原点的坐标轴
pDC->MoveTo(100,240);pDC->LineTo(900,240);

计算机图形学_ 二维图形变换_55 窗口视区变换_

计算机图形学_ 二维图形变换_55 窗口视区变换_
为了全部、如实地在视区中显示出窗口内的图形对象,就 必须求出图形在窗口和视区间的映射关系
需要根据用户所定义的参数,找到窗口和视区之间的坐标 对应关系
y
世界坐标系
y
屏幕坐标系
wyt
vyt
窗口
视区
P(x,y)
wyb
P’(sx,sy)
vyb
0
wxl
wxr
x0
vxl
vxr x
窗口到视区的映射是基于一个等式,即对每一个在世界坐标 下的点(x,y),产生屏幕坐标系中的一个点(sx,sy)
sx vl vr vl
x wl wr wl
sx A* x C sy B * y D
sx x wl (vr vl) vl wr wl
sx vr vl x (vl vr vl wl)
wr wl
wr wl
A看做放大x的部分,而C看做常数
A vr vl wr wl
窗口、视区及变换
一、窗口和视区
世界坐标系中要显示的区射到显示器(设备)上的区域称为视区
窗口定义显示什么;视区定义在何处显示
y
wyt
wyb 0
窗口
wxl
wxr
世界坐标系
y
vyt 视区
vyb
x
0 vxl
vxr x
设备坐标系
世界坐标系中的一个窗口可以对应于多个视区
C vl A*wl
同理,y方向上保持比例性质满足:
sy vb y wb
vt vb
wt wb
sx A* x C sy B * y D
B vt vb wt wb
D vb B*wb
这个映射可用于任意点(x,y),不管它是否 在窗口之中。在窗口中的点映射到视口中的 点,在窗口外的点映射到视口外的点

计算机图形学-变换

计算机图形学-变换
1
第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); //显示红色、平移后矩形

计算机图形学PPT神奇的齐次坐标与二维图形变换

计算机图形学PPT神奇的齐次坐标与二维图形变换
0 P’
例如:关于X轴对称
P(x,y)
P’(x’,y’)
x’=x
x
y’=-y
2 几何变换
以二维为例:
错切:也称为剪切、错位变换,用于产生弹性物体的变形处理。
y
y
y
(a)原图
x
x
x
(b)沿x方向错切
(c)沿y方向错切
2 几何变换
以二维为例: 错切:也称为剪切、错位变换,用于产生弹性物体的变形处理。
2 几何变换
以二维为例:
平移:指将p点沿直线路径从一个坐标位置移到另一个坐标位置的重定位 过程,是 一种不产生变形而移动物体的刚体变换。
y
P’
PT
Ty
Tx
0
x
P(x,y)
P’(x’,y’)
x’=x+Tx y’=y+Ty
Tx :x方向的平移矢量 Ty :y方向的平移矢量
2 几何变换
以二维为例:
比例:对p点相对于坐标原点沿x方向放缩Sx倍,沿y方向放缩Sy倍。其中Sx 和Sy称 为比例系数。
旋转
x’=xcosθ -ysinθ y’=xsinθ +ycosθ
cos sin 0
sin cos 0
0
0 1
3 齐次坐标的引入
T1
T3
a b p
x' y' 1 x y 1T2D x y 1c d q
l m s
T2
T4
其中:
T1是对图形进行比例、旋转、对称、 错切等变换;
T2是对图形进行平移变换; T3是对图形作投影变换; T4则可以对图形作整体比例变换。
旋转
x’=xcosθ -ysinθ y’=xsinθ +ycosθ

计算机图形学6(陈永强)

计算机图形学6(陈永强)
Y
Y
X (e)关于x=-y对称
X (d)关于x=y对称
11
基本几何变换——对称变换
(1)关于x轴对称
Y
1a 0 b 0 1 c d m 0l 0
0 p 0 q s 1
P(x,y) X P'(x,-y)
图6-5 关于x轴对称
12
基本几何变换——对称变换
24
复合变换——二维复合旋转
cos1 sin 1 0 cos 2 Tr Tr1 Tr 2 sin 1 cos1 0 sin 2 0 1 0 0 cos(1 2 ) sin(1 2 ) 0 sin(1 2 ) cos(1 2 ) 0 0 0 1 sin 2 cos 2 0 0 0 1
1 b 0 c 1 0 0 0 1
(3)两个方向错切
18
二维图形几何变换的计算
几何变换均可表示成P’=P*T的形式。 1. 点的变换
x'
y ' 1 x
a b y 1 c d l m
p q r
19
二维图形几何变换的计算
2. 直线的变换
0 cos 0 0 0 1
1 0 tg 1 0
0
tg 1 0
0 1
0
26
6.3.5相对任一参考点的二维几何变换
相对某个参考点(xF,yF)作二维几何变换,其变 换过程为: (1) 平移; (2) 针对原点进行二维几何变换; (3) 反平移。
27
相对任一参考点的二维几何变换
P' P T P (T1 T2 T3 Tn ) P T1 T2 T3 Tn (n 1)

计算机图形学之图形变换

计算机图形学之图形变换

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) 前面三种变换都可以表示为如下的矩
阵形式

二维空间里的简单矩形变换(平移、按比例缩放、旋转、对称、错切)

二维空间里的简单矩形变换(平移、按比例缩放、旋转、对称、错切)
int a[3]; }point;
point change(point p, int a[3][3]) {
int b[3] = { 0, 0, 0 }; for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) b[i] += p.a[j] * a[j][i];
return; }
void Rotation(point p1, point p2, point p3, point p4) {
double d; printf("Please enter the angel of rotation:(格式:60度就输入60):"); scanf("%lf", &d); getchar(); d = d / 180 * 1.0 * PI; double a[3][3] = { cos(d), -sin(d), 0, sin(d), cos(d), 0, 0, 0, 1 }; DrawChange2(p1, p2, p3, p4, a);
(4)对称:
以X轴对称:
,有
*
=

以Y轴对称:
,有
*
=

以原点O对称:
,有
*
=

以Y=X对称:
,有
*
=

以Y=-X对称:
,有
*
=

(5)错切:
,有
*
=

-------------------------------------------------------------下课啦---------------------------------------------------------------

计算机图形学_ 二维图形变换_53 二维图形变换原理及齐次坐标_

计算机图形学_ 二维图形变换_53 二维图形变换原理及齐次坐标_
普通坐标×h→齐次坐标 齐次坐标÷h→普通坐标 当h = 1时产生的齐次坐标称为“规格化坐标”,因为前n个 坐标就是普通坐标系下的n维坐标
为什么要采用齐次坐标?
在笛卡儿坐标系内,向量(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)“平行性”。即:平行线依然是平行线,且直线上 点的位置顺序不变)
采用了齐次坐标表示法,就可以统一地把二维线形变换表示 如下式所示的规格化形式:

计算机图形学 5.1二维变换

计算机图形学 5.1二维变换

a11b13 a12b23 a13b33 a 21b13 a 22b23 a 23b33 (5-1) a n1b13 a n 2 b23 a n3b33
由线性代数知道,矩阵乘法不满足交换律,只有左矩 阵的列数等于右矩阵的行数时,两个矩阵才可以相乘。 特别地,对于二维变换的两个3×3的方阵A和B,矩阵 相乘公式为:
5.1.1 规范化齐次坐标
为了使图形几何变换表达为图形顶点集合矩阵与 某一变换矩阵相乘的问题,引入了规范化齐次坐标。 所谓齐次坐标就是用n+1维矢量表示n维矢量。 例如,在二维平面中,点P(x,y)的齐次坐标表示为 (wx,wy,w)。类似地,在三维空间中,点P(x,y,z) 的齐次坐标表示为(wx,wy,wz,w)。这里,w为任一 不为0的比例系数,如果w=1就是规范化的齐次坐标。 二维点P(x,y)的规范化齐次坐标为〔x,y,1〕,三维 点P(x,y,z)的规范化齐次坐标为〔x,y,z,1〕。不 能写成下标形式,w和x,w和y,w和z是乘法的关系。 定义了规范化齐次坐标以后,图形几何变换可以 表示为图形顶点集合的规范化齐次坐标矩阵与某一变换 矩阵相乘的形式。
x1 x P 2 xn y1 y2 yn 1 1 1
变换后图形顶点集合的规范化齐次坐标矩阵为:
x'1 x' ' P 2 x' n y '1 y' 2 y'n 1 1 1
a b 二维变换矩阵为: T c d l m
a11b11 a12b21 a13b31 a11b12 a12b22 a13b32 a b a b a b a 21b12 a 22b22 a 23b32 21 11 22 21 23 31 a n1b11 a n 2 b21 a n3b31 a n1b12 a n 2 b22 a n3b32

第4章二维变换

第4章二维变换

• 性质
U •V = V •U U •V = 0 ⇔ U ⊥ V U •U = 0 ⇔ U = 0
变换的数学基础(3/4) 变换的数学基础
– 矢量的长度
• 单位矢量 • 矢量的夹角
2 U = U • U = u x + u y + u z2 2
U •V cos θ = U •V
– 矢量的叉积
i U ×V = ux vx
– 在世界坐标系( 在世界坐标系(WCS)中指定的矩形区域 , ) 用来指定要显示的图形 。
2. 视区
– 在设备坐标系(屏幕或绘图纸) 在设备坐标系(屏幕或绘图纸)上指定的矩形区域 , 用来指定窗口内的图形在屏幕上显示的大小及位置。 用来指定窗口内的图形在屏幕上显示的大小及位置。
3. 窗口到视区的变换
P′=P+Tm 等价于
[x’ y’]=[x y] +[Mx My]
图形变换的特点( 4.3.1 图形变换的特点(续)
比例变换 P′=P×Ts
Sx 0 Ts= 0 Sy Sx、Sy分别表示比例因子。 cosθ sinθ Tr= -sinθ cosθ θ>0时为逆时针旋转 θ<0时为顺时针旋转
旋转变换 P'=P×Tr
变换后的 顶点坐标
P
变换前的 顶点坐标

T2D
二维变换矩阵
二维变换矩阵中: a b 是对图形进行缩放、旋转、对称、错切等变换。 c d [ l m] 是对图形进行平移变换
• 计算机图形场景中所有图形对象的空间定位和定义,包括观 计算机图形场景中所有图形对象的空间定位和定义, 察者的位置视线等,是其它坐标系的参照。 察者的位置视线等,是其它坐标系的参照。
2.模型坐标系(Modeling Coordinate System,也称局部坐标系) 模型坐标系

计算机图形学图形变换

计算机图形学图形变换

(X0,y0)
绕任意点的旋转
1 0 0
• 用矩阵表示各个过程
T1
0
1 0
x 1y 11 xy1 T 1
x0 y0 1
x 2y 21 x 1y 11 T 2
cos T2 sin
sin cos
0 0
x ' y ' 1 x 2 y 21 T 3
0
0 1
1 0 0
x ' y ' 1 x 2 y 21 T 3
cos
sin
0
TT1T2T3 sin
cos
0
x0(1co)sx0siny0co sy0 1
复合矩阵可以减少计算量
• 不进行矩阵合并 往往在屏幕上划定一个平行于设备坐标轴的矩形区域作为图形显示区。
点P(x,y)在X’轴上的投影可用点乘得到, 常用的方法是在图形坐标系中取一个与x轴、y轴平行的矩形窗口,只显示窗口内的图形内容。
计算机图形学图形 变换
二维图形平移
• 二维图形平移是将图形上任 意一点P(x,y)在x轴方向y轴方 向分别平移距离tx,ty,则变 换后的新坐标
x’=x+tx
ty
y’=y+ty
• 用矩阵表示
1 [x',y'][x,y]0
1 0tx,ty
P’ p
tx
二维图形旋转
• 二维图形旋转是将图形绕圆
点旋转。图形上任意一点
2. 3次变换需要3×9=27次乘法。 这不仅可以节省运算量,还可以明确一个矩阵代表一种变换的概念。
Y’轴的单位方向矢量为(a21,a22) 这不仅可以节省运算量,还可以明确一个矩阵代表一种变换的概念。 复合矩阵可以减少计算量 我们希望将一种变换用一个矩阵来表示,这样就可以用矩阵合并的方法将一系列的简单变换用一个复杂变换来表示。 有时采用活动坐标系模式,是为了更好地理解变换前后两个对应物体之间的坐标关系。 表示变换前的模型上任意一点 仿射变换的特点是变换前的平行线在变换后依然平行。 变换图形、变换关系式和变换矩阵 合并矩阵与一个点向量相乘得到一个点向量,需要9次乘法。 固定坐标系模式:坐标系不变、图形变动。

二维图形几何变换

二维图形几何变换
矩阵表示法的定义和意义
矩阵表示法的具体形式和计算方法
矩阵表示法在二维图形几何变换中的应用和实现
定义:矩阵的加法运算是指将两个矩阵的对应元素相加,得到一个新的矩阵。
性质:矩阵的加法满足交换律和结合律,即A+B=B+A,(A+B)+C=A+(B+C)。
பைடு நூலகம்
运算规则:两个矩阵相加时,必须保证它们的维度相同,即行数和列数分别相等。
添加标题
添加标题
添加标题
矩阵变换的基本概念:介绍矩阵和几何变换的基本概念,以及它们之间的关系。
添加标题
矩阵变换的种类:列举常见的二维图形几何变换,如平移、旋转、缩放、错切等,并解释如何通过矩阵运算实现这些变换。
添加标题
矩阵变换的步骤:详细介绍如何通过矩阵运算实现二维图形的平移、旋转、缩放和错切等几何变换的步骤,包括变换前后的矩阵表示和计算过程。
汇报人:
,a click to unlimited possibilities
01
02
03
04
05
二维图形几何变换是指对二维图形进行旋转、平移、缩放等操作,使其在几何上发生变化的过程。
通过二维图形几何变换,可以实现图形的重新排列、调整和优化,从而满足不同的设计需求。
二维图形几何变换的基本要素包括原点、方向、角度和比例等,这些要素决定了变换的具体效果。
性质:逆矩阵与原矩阵的乘积为单位矩阵
应用:在二维图形几何变换中,矩阵的逆运算可用于还原图形的原始位置和形状
图像处理:平移变换常用于图像处理中的缩放、旋转等操作,以提高图像质量和分辨率。
动画制作:在动画制作中,平移变换可以用来实现角色或物体的移动、缩放等效果,增强视觉效果和表现力。

二维图形变换

二维图形变换

)
r
cos
sin
+r
sin
cos
将式(5-11)代入式(5-12)得:
x' x cos y sin
y'
x
sin
y
cos
矩阵形式
x
y x
y
cos sin
sin
cos
(5-12) (5-13) (5-14)
5.2.3 齐次坐标(homogeneous coordinates)技术
图形变换
大多数几何变换(如平移、旋转和变比)是保 持拓扑不变的,不改变图形的连接关系和平行 关系
对于线框图形,通常是以点变换为基础,把图 形的一系列顶点作几何变换后,连接新的顶点 序列即可产生新的变换后的图形。
对于用参数方程描述的图形,可以通过参数方 程几何变换,实现对图形的变换(基于效率的 考虑)。
几何 关系
x' y
y'
x
y
o
x
对称变换(3)
y
y=x
x o
对称变换(4)
(5)相对于直线y=-x对称
y=-x
几何关系
x' y
y'
x
y
o
x
对称变换(5)
错切变换(shear)
错切变换是将坐标点沿x和y轴发生不等量的变换, 得到点的过程 。
y
y
y
O
x
O
x
O
x
(a)正方形
(b)沿+x方向错切
(c)沿-x方向错切
图形变换
图形变换
图形变换是计算机图形学基础内容之一。 内容: 几何变换; 视图变换; 投影变换。 作用: 把用户坐标系与设备坐标系联系起来; 可由简单图形生成复杂图形; 可用二维图形表示三维形体; 动态显示。

计算机图形学-第三章-变换及裁剪

计算机图形学-第三章-变换及裁剪
xh hx, yh hy, h 0
(x,y)点对应的齐次坐标为三维空间的一条 直线
xh hx
yh
hy
zh h
7
齐次坐标的作用
1. 将各种变换用阶数统一的矩阵来表示。提供了用矩阵 运算把二维、三维甚至高维空间上的一个点从一个坐 标系变换到另一坐标系的有效方法。
2. 便于表示无穷远点。
例如:(x h, y h, h),令h等于0
25
3 规格化设备坐标系 用于用户的图形是定义在用户坐标系里,
而图形的输出定义在设备坐标系里,它依赖于 基体的图形设备。由于不同的图形设备有不同 的设备坐标系,且不同设备间坐标范围也不尽 相同, 例如:分辨率为1024*768的显示器其屏幕坐标的 范围:x方向为0~1023,y方向为0~767,分辨 率为640*480的显示器,其屏幕坐标范围为:x 方向0~639,y方向0~479
y 1),则
1 0 0
P'x' y' 1 x y 1 0 1 0 x
Tx1
Ty1
1
y 1Tt1
经第二次平移变换后的坐标为P*(x* y* 1)
P * x *
y * 1 x'
y'
1
1 0
0 0 1 0
Tx
2
Ty 2
1
1 0 0 1 0 0
x y 1 0 1 0 0 1 0 x y 1 Tt1Tt2
44
关于透视投影
一点透视投影
两点透视投影
三点透视投影
45
内容
二维变换 三维变换 裁剪
二维线裁剪 二维多边形裁剪 文本裁剪 三维裁剪 关于三维变换与裁剪
46
三维变换流程图

计算机图形学-二维图形变换与裁剪ppt课件

计算机图形学-二维图形变换与裁剪ppt课件
计算机图形学二维图形变换与 裁剪
图形变换
2
观察与思考
零件三视图
3
观察与思考
三视图投影示意图
4
图形变换
从不同角度观察物体,会看到不同的形状 形状的变化可以通过图形变换来实现 图形变换是计算机图形学的基础内容之一 通过图形变换 可由简单图形生成复杂图形 可用二维图形表示三维形体 可对静态图形经过快速变换而获得图形的动 态显示效果
13
数学基础(4)
矩阵的乘法
a b 11 a 12 a 13 11 b 12 b 13 A B a a a b b b 21 22 23 21 22 23 a b 31 a 32 a 33 31 b 32 b 33
矩阵的数乘
a ka 11 a 12 a 13 11 ka 12 ka 13 k a a a ka ka ka 21 22 23 21 22 23 a ka 31 a 32 a 33 31 ka 32 ka 33
y1 y2 yn
z1 z2 zn
10
数学基础 1
设有两个矢量
u x U u y u z
vx V v y vz
矢量和
u x vx U V u v y y u z vz
a b a b a b a b a b a b a b a b a b 11 11 12 21 13 31 11 12 12 22 13 32 11 13 12 23 13 33 a b a b a b a b a b a b a b a b a b 21 1122 2123 3121 1222 2223 3221 1322 2323 33 a b a b a b a b a b a b a b a b a b 31 11 32 21 33 31 31 12 32 22 33 32 31 13 32 23 33 33

计算机图形学基础教程(Visual C++版)第05章 二维图形变换与裁剪(清华大学出版社 孔令德)

计算机图形学基础教程(Visual C++版)第05章 二维图形变换与裁剪(清华大学出版社 孔令德)
x O
y
5-19 设备坐标系
图形学中常用的坐标系
规格化设备坐标系(Normalized Device Coordinate,NDC) 将设备坐标系规格化到(0.0,0.0)到(1.0,1.0)的 范围内而定义的坐标系。 规格化设备坐标系独立于具体输出设备。 一旦图形变换到规格化设备坐标系中,只要作一个简 单的乘法运算即可映射到具体的设备坐标系中。
wyt (xw,yw) 0000 wyb
vyt (xv,yv) 0000 vyb
wxl
wxr
vxl
已知窗口内的一点P的坐标(xw,yw),求视区中 对应点P’的坐标(xv,yv) 这属于相对于任一参考点的二维几何变换
vxr
变换步骤为:
1.将窗口左下角点(wxl,wyb)平移到观察坐标系 原点
写成方程为:
xv S x xw vxl wxl S x yv S y yw vyb wyb S y
则窗视变换的展开式为:

xv a x w b yv c y w d
裁剪
图形变换到观察坐标系下,需要按照窗口进行 裁剪,即只保留窗口内的那部分图形,去掉窗 口外的图形 假设窗口是标准矩形,即边与坐标轴平行的矩 形,由 上(y=wyt)、 下(y=wyb)、 左(x=wxl)、 右(x=wxr) 四条边描述
30
裁剪——点的裁剪
点是构成图形的基本元素 点的裁剪:
wxl x wxr, 且wyb y wyt
把图形全部打散成点进行裁剪?
31
二维直线段的裁剪
直线的裁剪是二维图形裁剪的基础 裁剪的实质是判断直线是否与窗口相交,如相 交则进一步确定位于窗口内的部分

计算机图形学第4章图形变换(2)

计算机图形学第4章图形变换(2)

5、使直线回到原来位置,结果图形即为原图形绕 指定直线旋转变换后的图形。
直线回到原来位置需要进行(3)~(1)的逆变换,其中:
图形绕空间任意轴旋转的总变换矩阵是
H = T
4.3.5 三维对称变换
三维对称变换可以是关于给定对称轴的或者 是关于给定对称平面的变换。三维对称矩阵的建 立类似于二维的。关于给定对称轴的对称变换等 价于绕此轴旋转180°,可以直接使用已讨论过 的相对于轴线的旋转变换公式。关于给定对称平 面的对称变换其最简单的是对称于坐标平面的变 换。当对称平面是坐标平面时(x-y,或x-z,y-z), 可以将此变换看成是左手系和右手系之间的转换。
变换过程为 [x' y' z' 1]=[x y z 1]· S(Sx,Sy,Sz) 其中,Sx,Sy,Sz分别为在x,y,z坐标轴方向上的 比例系数。
4.3.3 三维旋转变换
三维旋转变换:是指将物体绕某个坐标轴旋转 一个角度,所得到的空间位置变化。我们规定旋 转正方向与坐标轴矢量符合右手法则,即从坐标 轴正值向坐标原点观察,逆时针方向转动的角度 为正。如图所示。
设用户选定的窗口范围为(wxl,wyl)和(wxr,wyr), 视口范围为(vxl,vyl)和(vxr,vyr)。 将窗口中的图形转为视口中图形的过程: 1、先平移窗口使其左下角与坐标原点重合; 2、再比例变换使其大小与视口相等; 3、最后再通过平移使其移到视口位置。
4.3 三维几何变换
三维几何变换是二维几何变换的扩展。三维齐 次变换可用4×4矩阵表示。 平移变换 - 比例变换 - 旋转变换 - 绕空间任意轴 的旋转变换 - 对称变换 - 错切变换
四、二维观察变换将投影平面上矩形窗内的图形 变换到显示器(或规范化)坐标中的视口内。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

void CMyView::ClearMatrix(double A[][3]) { for(int i=0;i<3;i++) { for(int j=0;j<3;j++) A[i][j]=0; } }
void CMyView::Draw(double D[][3], int n) { RedrawWindow(); CClientDC dc(this); CPen pen,*pOldpen; pen.CreatePen(PS_SOLID,3,RGB(0,0,255)); 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]));
void CMyView::Calculate(double P0[][3], double T[][3]) { double Ptemp[4][3]; KeepOriginalMatrix(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 CMyView::KeepOriginalMatrix(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]; • }
• 5.在ondraw函数中添加以下代码
• void CMyView::OnDraw(CDC* pDC) • { • CMyDoc* pDoc = GetDocument(); • ASSERT_VALID(pDoc); • // TODO: add draw code for native data here • GetMaxX(); • GetMaxY(); • CPen pen,*pOldpen; • pen.CreatePen(PS_SOLID,3,RGB(0,255,255)); • pDC->SelectObject(&pen); • pDC->MoveTo(MaxX/2,0);//绘制坐标轴 • pDC->LineTo(MaxX/2,MaxY); • pDC->MoveTo(0,MaxY/2); • pDC->LineTo(MaxX,MaxY/2); • }
• • • • • • • • • • • • • •
void CMyView::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,ntype); }
二维图形变换
参考步骤
• • • • 1.建立工程文件 2.在头文件中加入 #define ROUND(a) int(a+0.5)//四舍五入 #define PI 3.1415926//圆周率
• 3.添加数据成员
int MaxX,MaxY;//屏幕x 和y 的最大坐标 double P[4][3];//变换点 double TM[3][3];//平移变换矩阵 double TS[3][3];//比例变换矩阵 double TR[3][3];//旋转变换矩阵 double TF[3][3];//反射变换矩阵 double TC[3][3];//错切变换矩阵 double OTriangle[4][3]; //正三角形坐标 int ntype;//顶点个数
• • • • • • • • • •
void CMyView::OnMENUClockwise() { // TODO: Add your command handler code here Trotate(30); } void CMyView::OnMENUAnticlockwise() { // TODO: Add your command handler code here Trotate(-30); }
else dc.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 CMyView::OnMENUDecrease() { // TODO: Add your command handler code here Tscale(0.5,0.5); } void CMyView::OnMENUIncrease() { // TODO: Add your command handler code here Tscale(2,2); }
• • • • • • • • • • • •
void CMyView::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,ntype); }
void CMyView::GetMaxX() { CRect Rect; GetClientRect(&Rect); MaxX=Rect.right; }
void CMyView::GetMaxY() { CRect Rect; GetClientRect(&Rect); MaxY=Rect.bottom; }
• • • • • • • • • • • • • •
void CMyView::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,ntype); }
• • • • • • • • • • • • • •
void CMyView::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,ntype); }
• void CMyView::OnMENUright() • { • // TODO: Add your command handler code here • Tmove(10,0); • }
• void CMyView::OnMenuup() • { • // TODO: Add your command handler code here • Tmove(0,10); • } • void CMyView::OnMenudown() • { • // TODO: Add your command handler code here • Tmove(0,-10); • }
• • • • • • • • • • • • • • •
void CMyView::OnMENUXaxis() { // TODO: Add your command handler code here Treflect(1,-1); } void CMyView::OnMENUYaxis() { // TODO: Add your command handler code here Treflect(-1,1); } void CMyView::OnMENUorg() { // TODO: Add your command handler code here Treflect(-1,-1); }
• 4.初始化构造函数
• CMyView::CMyView() • { • // TODO: add construction code here • P[0][0]=-100/2;P[0][1]=0;P[0][2]=1; • P[1][0]=100/2;P[1][1]=0;P[1][2]=1; • P[2][0]=0;P[2][1]=100/2*tan(60*PI/180);P[2][2]=1; • P[3][0]=0;P[3][1]=0;P[3][2]=1; • ntype=3; • int i,j; • for(i=0;i<4;i++) • for(j=0;j<3;j++) • OTriangle[i][j]=P[i][j]; • }
相关文档
最新文档