基本的二维几何变换(三)_缩放
改变一个对象的大小,可使用 缩放(scaling) 变换。一个简单的二维缩放操作可通过将 缩放系数(scaling factor) Sx 和 Sy与对象坐标位置(x, y)相乘而得: 缩放系数Sx 在x方向缩放对象,而Sy在y方向进行缩放。基本的二维缩放方程(5.10)也可以写成矩阵形式: 或: 其中,S是等式(5.11)中的2x2缩放矩阵。 可以赋给缩放系数Sx和Sy任何正数值。值小于1将缩小对象的尺寸,值大于1则放大对象。如果将Sx和Sy都指定为1,那么对象尺寸就不会改变。当赋给Sx和Sy相同的值时,就会产生保持对象相对比例的一致缩放(uniform scaling)。 Sx和Sy值不等时将产生设计应用中常见的差值缩放(differential scaling),其中的图形由少数形状经缩放和定位变换来构造。在有些系统中,也可为缩放参数指定负值。这不仅改变对象的尺寸,还相对于一个或多个坐标轴反射。 利用方程(5.11)变换的对象既被缩放,又被重定位。当缩放系数的绝对值小于1时,缩放后的对象向原点靠近;而缩放系数绝对值大于1时,缩放后的坐标位置远离原点。如图5.7给出了将值0.5赋给方程(5.11)中的Sx和Sy、时对线段的缩放。线段的长度和到原点的距离都减少到1/2。 我们可以选择一个在缩放变换后不改变位置的点,称为固定点(fixed point),以控制缩放后对象的位置。固定点的坐标(xf, yf)可以选择对象的中点等位置或任何其他空间位置。这样,多边形通过缩放每个顶点到固定点的距离而相对于固定点进行缩放(参见图5.8 )。对于坐标为(x, y)的顶点,缩放后的坐标(x', y')可计算为: 我们可以将乘积项和加法项分开而重写上述缩放变换公式: 其中,加法项xf(1-sx)和yf(1 - sy)对于对象中的任何点都是常数。 在缩放公式中包含固定点的坐标,类似于在旋转公式中包含基准点的坐标。我们可以建立一个其元素为方程(5.14)中常数项的列向量,然后将这个列向量加到等式(5.12)中的乘积S*P上。下一节将讨论仅包含矩阵乘法的变换方程的矩阵形式。 多边形的缩放可以通过将变换方程(5.14)应用于每个顶点,然后利用变换后的顶点重新生成多边形而实现。其他对象的变换则将缩放变换公式应用到定义对象的参数上。要改变圆的大小,可通过缩放其半径并计算圆上坐标点的新坐标位置来实现。标准位置中的椭圆通过缩放两个轴并且按其中心坐标重新绘制椭圆而实现缩放椭圆尺寸。
下列程序给出了对一个多边形缩放进行计算的例子。多边形顶点和固定点的坐标以及缩放系数是输入参数。坐标变换后,使用OpenGL子程序重新生成缩放后的多边形。
void scalePolygon (wcPt2D *verts, GLint nVerts, wcPt2D fixedPt, GLfloat sx, GLfloat sy) { wcPt2D vertsNew; GLint k; for(k = 0; k < nVerts; k++){ vertsNew[k].x = verts[k].x * sx + fixedPt.x * (1 - sx); vertsNew[k].y = verts[k].y * sy + fixedPt.y * (1 - sy); } glBegin {GL_POLYGON}; for (k = 0; k < nVerts; k++) glVertex2f (vertsNew[k].x, vertsNew[k].y); glEnd( ); }