几何变换:应用于对象几何描述并改变它的位置、方向或大小的操作
基本的二维几何变换:
平移 x’=x+tx, y’=y+ty
旋转 x’=xcosθ-ysinθ, y’=xsinθ+ycosθ
缩放 x’=sxx, y’=syy
1.1 二维平移
将位移量加到一个点的坐标上来生成一个新的坐标位置,
再重构几何体
x’=x+tx, y’=y+ty
class wcPt2d{
public:
GLfloat x, y;
};
void translatePolygon ( wcPt2d * verts, GLint nVerts, GLfloat tx, GLfloat ty){
GLint k;
for (k = 0; k< nVerts;k++){
verts [k].x = verts [k].x + tx;
verts [k].y = verts [k].y + ty;
}
glBegin (GL_POLYGON);
for ( k=0;k< nVerts;k++)
glVertex2f (verts [k].x, verts [k].y);
glEnd();
}
要删除原来的多边形,可以将其用背景色显示;
1.2 二维旋转
矢量旋转
x’=xcosθ-ysinθ, y’=xsinθ+ycosθ
线段旋转:旋转端点后画线
多边形旋转:每个顶点指定旋转角,用新顶点生成多边形
曲线旋转:重新定位定义的点
圆与椭圆,可以通过将中心位置沿指定旋转角对着的弧长移动,而非绕中心轴转动。
(圆与椭圆还可以通过旋转其长轴和短轴来实现绕中心旋转)
class wcPt2d{
public:
GLfloat x, y;
};
void rotatePolygon ( wcPt2d * verts, GLint nVerts, wcPt2d pivPt, GLdouble theta){
wcPt2d * vertsRot;
GLint k;
for (k = 0; k< nVerts;k++){
vertsRot [k].x = pivPt.x + (verts [k].x - pivPt.x) * cos(theta) -
(verts[k].y - pivPt.y)*sin(theta);
vertsRot [k].y = pivPt.y + (verts [k].x - pivPt.x) * sin(theta) +
(verts[k].y - pivPt.y)*cos(theta);
}
glBegin (GL_POLYGON);
for ( k=0;k< nVerts;k++)
glVertex2f (vertsRot [k].x, vertsRot [k].y);
glEnd();
}
1.3 二维缩放
坐标乘以缩放系数
x’=sxx, y’=syy
sx=sy,一致缩放
sx != sy,差值缩放
选取一个缩放后不改变位置的固定点(xf,yf)
x’= x sx + xf ( 1 - sx )
y’= y sy + yf ( 1 - sy )
class wcPt2d{
public:
GLfloat x, y;
};
void scalePolygon ( wcPt2d * verts, GLint nVerts, wcPt2d fixedPt, GLdouble sx, GLdouble 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();
}