|
图形几何变换
图形变换一般是对图形的几何信息经过几何变换后产生新的图形。常见二维图形的变换有平移、比例、对称、旋转、错切等。图形几何变换最有效的手段是采用矩阵变换,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(平移变换)等。
基本绘图函数
在前面许多示例中,我们已经用到如DrawLine等基本绘图函数。除此之外,还有许多这样的函数,并且每个绘图函数都有其重载形式,这给我们带来了许多方便。表7.1列出这些基本绘图函数。
表1 GDI 常用基本绘图函数
绘图函数
功能描述
DrawArc
绘制一条圆弧曲线,范围由起止角大小决定,大小由矩形或长宽值指定
DrawBezier
绘制一条由一系列型值顶点决定的三次Bezier曲线
DrawBeziers
绘制一系列的三次Bezier曲线
DrawClosedCurve
绘制一条封闭的样条曲线
DrawCurve
绘制一条样条曲线
DrawEllipse
绘制一条椭圆轮廓线,大小由矩形或长宽值指定
DrawLine
绘制一条直线
DrawPath
绘制由GraphicsPath定义的路径轮廓线
DrawPie
绘制一条扇形(饼形)轮廓线
DrawPolygon
绘制一个多边形的轮廓线
DrawRectangle
绘制一个矩形
FillEllipse
填充一个椭圆区域
FillPath
填充一个由路径指定的区域
FillPie
填充一个扇形(饼形)区域
FillPolygon
填充一个多边形区域
FillRectangle
填充一个矩形区域
FillRectangles
用同一个画刷填充一系列矩形区域
FillRegion
填充一个区域(Region)的内部 下面的代码是通过路径用两条样条曲线构造一个复杂的区域,然后填充它,其结果如图7.13所示。
程序代码: Graphics graphics( pDC->m_hDC );
Pen pen(Color::Blue, 3); Point point1( 50, 200); Point point2(100, 150); Point point3(160, 180); Point point4(200, 200); Point point5(230, 150); Point point6(220, 50); Point point7(190, 70); Point point8(130, 220);
Point curvePoints[8] = {point1, point2, point3, point4, point5, point6, point7, point8}; Point* pcurvePoints = curvePoints;
GraphicsPath path; path.AddClosedCurve(curvePoints, 8, 0.5);
PathGradientBrush pthGrBrush(&path); pthGrBrush.SetCenterColor(Color(255, 0, 0, 255)); Color colors[] = {Color(0, 0, 0, 255)}; INT count = 1; pthGrBrush.SetSurroundColors(colors, &count);
graphics.DrawClosedCurve(&pen, curvePoints, 8, 0.5); graphics.FillPath(&pthGrBrush, &path);
上一页 [1] [2]
|