图形几何变换
图形变换一般是对图形的几何信息经过几何变换后产生新的图形。常见二维图形的变换有平移、比例、对称、旋转、错切等。图形几何变换最有效的手段是采用矩阵变换,GDI+就有这样的矩阵类Matrix,它为我们提供了许多变换的方法,如Invert(转置)、Multiply(矩阵相乘)、Rotate(旋转)等。例如下面的代码就是Matrix::Rotate一个例子,其结果如图7.11所示。
Graphics graphics( pDC->m_hDC ); Pen pen(Color(255, 0, 0, 255));
Matrix matrix; matrix.Translate(40, 0); // 先平移 matrix.Rotate(30, MatrixOrderAppend); // 后旋转
graphics.SetTransform(&matrix); graphics.DrawEllipse(&pen, 0, 0, 100, 50); |
需要说明的是,代码中的MatrixOrderAppend用来指明第二个矩阵(若有)的操作次序是后置的,即matrix1 OP matrix2,OP表示某种操作;若为MatrixOrderPrepend 则表示matrix2 OP matrix1。而SetTransform则指定一个矩阵对点坐标进行变换,新的坐标点(x*,y*)结果可用下列公式来表示:
[x* y* 1] = [x y 1]
= [m11x+m21y+dx m12x+m22y+dy 1]
式中,dx和dy用来指定x和y方向的平移量,若dx = dy = 0,则:
(1) 当m21 = m12 = 0,m11 = -1,m22 = 1时,有x*= -x,y*= y,产生与y轴对称的反射图形;
(2) 当m21 = m12 = 0,m11 = 1,m22 = -1时,有x*= x,y*= -y,产生与x轴对称的反射图形;
(3) 当m21 = m12 = 0,m11 = m22 = -1时,有x*= -x,y*= -y,产生与原点对称的反射图形;
(4) 当m21 = m12 = 1,m11 = m22 = 0时,有x*= y,y*= x,产生与直线y = x对称的反射图形;
(5) 当m21 = m12 = -1,m11 = m22 = 0时,有x*= -y,y*= -x,产生与直线y = -x对称的反射图形;
(6) 而当m11 = m22 = cosq,m21 = -m12 = sinq 时,则进行旋转变换。
例如下列代码,其结果如图7.12所示。
Graphics graphics( pDC->m_hDC ); Pen pen(Color::Blue,3); graphics.DrawLine(&pen, 150,50,200,80);
pen.SetColor(Color::Gray); Matrix matrix( -1,0,0,1, 150,50); // 使用第一种情况
graphics.SetTransform(&matrix); graphics.DrawLine(&pen, 0,0,50,30); |
其中,Matrix的构造函数有如下定义:
Matrix( REAL m11, REAL m12, REAL m21, REAL m22, REAL dx, REAL dy); |
需要说明的是,除了使用Matrix进行图形变换外,Graphics本身提供相应的变换方法,如RotateTransform(旋转变换)、ScaleTransform(比例变换)和TranslateTransform(平移变换)等。