计算机图形学图形二维变换
合集下载
二维图形变换

{
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);
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 窗口视区变换_

为了全部、如实地在视区中显示出窗口内的图形对象,就 必须求出图形在窗口和视区间的映射关系
需要根据用户所定义的参数,找到窗口和视区之间的坐标 对应关系
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),不管它是否 在窗口之中。在窗口中的点映射到视口中的 点,在窗口外的点映射到视口外的点
需要根据用户所定义的参数,找到窗口和视区之间的坐标 对应关系
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); //显示红色、平移后矩形
第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神奇的齐次坐标与二维图形变换

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θ
例如:关于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(陈永强)

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)
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)错切:
,有
*
=
;
-------------------------------------------------------------下课啦---------------------------------------------------------------
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 二维图形变换原理及齐次坐标_

普通坐标×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)“平行性”。即:平行线依然是平行线,且直线上 点的位置顺序不变)
采用了齐次坐标表示法,就可以统一地把二维线形变换表示 如下式所示的规格化形式:
为什么要采用齐次坐标?
在笛卡儿坐标系内,向量(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)“平行性”。即:平行线依然是平行线,且直线上 点的位置顺序不变)
采用了齐次坐标表示法,就可以统一地把二维线形变换表示 如下式所示的规格化形式:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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]; • }