计算机图形学(三)二维几何变换

二维几何变换

几何变换:应用于对象几何描述并改变它的位置、方向或大小的操作

  1. 基本的二维几何变换:

    平移 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();
} 

你可能感兴趣的:(图形学)