二维图形复合变换

    复合变换是指图形做一次以上的几何变换,变换结果是每次的变换矩阵相乘。从另一个方面看,任何一个复杂的几何变换都可以看成是基本几何变换的组合。

    P^{'} = P \cdot (T_{1}\cdot T_{2}\cdot T_{3} ......T_{3})       (n>1)

1. 复合平移

    P经过两次连续平移后,其变换矩阵可写为:

 

2.复合缩放

   P经过两次连续缩放后,其变换矩阵可写为:

 

3.复合旋转

    P经过两次连续旋转后,其变换矩阵可写为:

    

    在复合变换中,需要注意的是矩阵相乘的顺序,由于矩阵乘法不满足交换律,因此通常T_{1}\cdot T_{2} \neq T_{2}\cdot T_{1} 矩阵相乘的顺序不可交换。

4.小结

     在实际应用中,很少只需要单一的基本变换,通常需要几种基本变化的组合。

 

    其中,各部分的效果如下

   T_{1} = \begin{bmatrix} a \ b \\ c\ d \\ \end{bmatrix}     比例、旋转、对称、错切等变换

   T_{2} = \begin{bmatrix} l \ m \\ \end{bmatrix}     平移变换

   T_{3} = \begin{bmatrix} p \\q \\ \end{bmatrix}        投影变换

   T_{4} = \begin{bmatrix} s \end{bmatrix}         整体比例变换

 

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是利用C++和EasyX库实现二维图形复合变换的示例代码,包括复合平移变换复合比例变换复合旋转变换: ```cpp #include <graphics.h> #include <conio.h> #include <math.h> #define PI 3.14159265 // 定义矩阵结构体 struct Matrix { double a[3][3]; }; // 定义向量结构体 struct Vector { double x; double y; }; // 定义矩形结构体 struct Rectangle { Vector vertex[4]; }; // 初始化矩阵 void initMatrix(Matrix& mat) { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (i == j) { mat.a[i][j] = 1; } else { mat.a[i][j] = 0; } } } } // 矩阵相乘 Matrix multiply(Matrix& mat1, Matrix& mat2) { Matrix res; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { res.a[i][j] = 0; for (int k = 0; k < 3; k++) { res.a[i][j] += mat1.a[i][k] * mat2.a[k][j]; } } } return res; } // 复合平移变换 Matrix translate(double dx, double dy) { Matrix mat; initMatrix(mat); mat.a[0][2] = dx; mat.a[1][2] = dy; return mat; } // 复合比例变换 Matrix scale(double sx, double sy) { Matrix mat; initMatrix(mat); mat.a[0][0] = sx; mat.a[1][1] = sy; return mat; } // 复合旋转变换 Matrix rotate(double degree) { Matrix mat; initMatrix(mat); double radian = degree * PI / 180; mat.a[0][0] = cos(radian); mat.a[0][1] = -sin(radian); mat.a[1][0] = sin(radian); mat.a[1][1] = cos(radian); return mat; } // 对矩形进行变换 void transform(Rectangle& rect, Matrix& mat) { for (int i = 0; i < 4; i++) { double x = rect.vertex[i].x; double y = rect.vertex[i].y; rect.vertex[i].x = mat.a[0][0] * x + mat.a[0][1] * y + mat.a[0][2]; rect.vertex[i].y = mat.a[1][0] * x + mat.a[1][1] * y + mat.a[1][2]; } } int main() { initgraph(640, 480); // 原始矩形 Rectangle rect = { {100, 100}, {200, 100}, {200, 200}, {100, 200} }; // 画出原始矩形 setlinecolor(RED); for (int i = 0; i < 4; i++) { Vector p1 = rect.vertex[i]; Vector p2 = rect.vertex[(i + 1) % 4]; line(p1.x, p1.y, p2.x, p2.y); } // 复合平移变换 Matrix mat1 = translate(50, 50); // 复合比例变换 Matrix mat2 = scale(0.5, 0.5); // 复合旋转变换 Matrix mat3 = rotate(30); // 对矩形进行变换 transform(rect, mat1); transform(rect, mat2); transform(rect, mat3); // 画出变换后的矩形 setlinecolor(BLUE); for (int i = 0; i < 4; i++) { Vector p1 = rect.vertex[i]; Vector p2 = rect.vertex[(i + 1) % 4]; line(p1.x, p1.y, p2.x, p2.y); } getch(); closegraph(); return 0; } ``` 在这个示例代码中,我们定义了矩阵、向量和矩形三个结构体,用于表示变换所需的数据。然后,我们实现了初始化矩阵、矩阵相乘、复合平移变换复合比例变换复合旋转变换这几个函数。最后,我们将原始矩形进行变换,并画出变换后的矩形。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值