Experiment 6 – 2D-Grafiktransformation

1. Zweck des Experiments

1. Verstehen und beherrschen Sie die 2D-Grafiktransformation: Lernen Sie die Verwendung der OpenGL-Übersetzungs-, Rotations- und Skalierungsfunktionen und beherrschen Sie die Methoden zur Implementierung grundlegender Grafiktransformationen und zusammengesetzter Grafiktransformationen.
2. Wenden Sie 2D-Grafiktransformationsfunktionen und Mensch-Computer-Interaktionsfunktionen umfassend an, um interaktive 2D-Grafikprogramme zu entwerfen.

2. Experimenteller Inhalt

Erfordert ein Umschreiben des Codes, um die geometrischen Transformationsfunktionen von OpenGL zu verwenden.
1) Verwenden Sie die Funktion glTranslatef (), um eine 2D-Grafikübersetzung zu realisieren, mit der das rechteckige interaktive Bewegungsprogramm in Experiment 2 neu geschrieben werden kann, wie in der folgenden Abbildung dargestellt.
a) vor der Übersetzung
Fügen Sie hier eine Bildbeschreibung ein


Fügen Sie hier eine Bildbeschreibung ein
a) Kerncode nach der Übersetzung :

void Display(void)
{
    
    
    glClear(GL_COLOR_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glTranslatef(tx,ty,0);
	glColor3f(1.0f, 1.0f, 1.0f);
    glBegin(GL_POLYGON);
	glVertex2f( -0.5, -0.5 );
	glVertex2f( -0.5, 0.5 );
	glVertex2f( 0.5, 0.5 );
	glVertex2f( 0.5, -0.5 );
	glEnd();
	glutSwapBuffers();
}

2) Verwenden Sie die Funktion glRotatef (), um die Drehung von 2D-Grafiken um einen festen Punkt auf der Ebene zu realisieren, wodurch das sechseckige Rotationsprogramm in Experiment 3 neu geschrieben werden kann. Wie nachfolgend dargestellt:

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

3. Referenzfunktion

1.gltranslatef (x,y, z); //x, y, z stellen die Übersetzung in x-, y-, z-Richtung dar, für 2D-Grafiken ist z=0 2.glrotatef (Q,x,y, z)
; //Q ist der Winkelgrad der Drehung gegen den Uhrzeigersinn (0 ~ 360), (x, y, z) ist der Richtungsvektor der Rotationsachse, (x, y, z)=(0, 0, 1) stellt entlang z dar Achsenrichtungsdrehung; (x,y,z) = (l, 0, 0) stellt die Drehung entlang der x-Achsenrichtung dar; (x,y,z) = (O, 1, 0) stellt die Drehung entlang der y-Achse dar Richtung
3.glscalef (x,y, z); //x, y und z repräsentieren die Skalierungsfaktoren in x-, y- bzw. z-Richtung. Für 2D-Grafiken ist z=0. Wenn der Skalierungsfaktor -1 ist, wird eine symmetrische Transformation generiert

4. Codebeispiel

1. Ein Graph wird um Tx bzw. Ty entlang der horizontalen Richtung und der vertikalen Richtung verschoben.

//清屏
glMatrixMode (GL_MODELVIEW);	//设置矩阵模式为模型变换模式,表示在世界坐标系下
glLoadIdentity();					 //将当前矩阵设置为单位矩阵
glTranslatef(Tx,Ty,0);				
DrawSomeShape();
刷新

2. Drehen Sie eine Figur um einen ALPHA-Winkel um einen beliebigen Punkt (cx, cy).

//清屏
glMatrixMode(GL_MODELVIEW); glLoadldentity();	//设置矩阵模式为模型变换模式,表示在世界坐标系下.
glLoadIdentity();					 //将当前矩阵设置为单位矩阵
glTranslatef(cx,cy,0);		//平移回去
glRotatef(ALPHA,0,0,1);     //绕原点旋转ALPHA角度
glTranslatef(-cx,-cy,0);      //平移回原点
 DrawSomeShape ();	
//刷新

3. Skalieren Sie die Sx- und Sy-Skalierungsfaktoren eines Diagramms um einen beliebigen Punkt (z. B. cy).

//清屏
glMatrixMode(GL_MODELVIEW); //设置矩阵模式为模型变换模式,表示在世界坐标系下
glLoadldentity();	 //将当前矩阵设置为单位矩阵
glTranslatef(cx,cy,0);//平移回去
 glScalef(Sx,Sy,1);	//绕原点水平缩放系数Sx,垂直缩放系数Sy
glTranslatef(-cx,-cy,0);	//平移回原点
DrawSomeShape(); 
//刷新

Kerncode:

void Display(void)
{
    
    
    glClear(GL_COLOR_BUFFER_BIT);
	glMatrixMode(GL_MODELVIEW);
	glLoadIdentity();
	glTranslatef(tx,ty,0);
	glColor3f(1.0f, 1.0f, 1.0f);
    glBegin(GL_POLYGON);
	glVertex2f( -0.5, -0.5 );
	glVertex2f( -0.5, 0.5 );
	glVertex2f( 0.5, 0.5 );
	glVertex2f( 0.5, -0.5 );
	glEnd();
	glutSwapBuffers();
}

2) Verwenden Sie die Funktion glRotatef (), um die Drehung von 2D-Grafiken um einen festen Punkt auf der Ebene zu realisieren, wodurch das sechseckige Rotationsprogramm in Experiment 3 neu geschrieben werden kann
. Wie in der folgenden Abbildung dargestellt:
a) Vor der Drehung:
Fügen Sie hier eine Bildbeschreibung ein
b) Nach der Drehung
Fügen Sie hier eine Bildbeschreibung ein
Kerncode:

void Display(void)
{
    
    
    glClear(GL_COLOR_BUFFER_BIT);                    //清屏
    glMatrixMode(GL_MODELVIEW);                      //设置矩阵模式为模型变换模式,表示在世界坐标下
    glLoadIdentity();                                //将当前矩阵设置为单位矩阵
    glTranslatef(cx, cy, 0);                         //平移回去
    glRotatef(theta, 0, 0, 1);                       //绕原点旋转theta角度
    glTranslatef(-cx, -cy, 0);                       //平移回原点
    glColor3f(1.0f, 0.0f, 0.0f);                     //设置红色绘图颜色
    glBegin(GL_POLYGON);                             //开始绘制六边形 
    for (int i = 0; i < n; i++)
        glVertex2f(R * cos(theta + i * 2 * PI / n), R * sin(theta + i * 2 * PI / n));  //顶点坐标 
    glEnd();
    glutSwapBuffers();              //双缓存的刷新模式
}
void myidle()
{
    
    
theta += 1.0 ;                     //旋转角增加1° 
    if (theta >= 360) theta -= 360;    //旋转角复位
    glutPostRedisplay();   
}

3) Verwenden Sie die Funktion glScalef (), um die Skalierung von 2D-Grafiken um einen festen Punkt zu realisieren und sie auf der Grundlage des vorherigen Programms zu entwerfen und zu ändern. Wie in der folgenden Abbildung dargestellt:
a) Vor der Skalierung
Fügen Sie hier eine Bildbeschreibung ein

b) Nachdem die Sperre aufgehoben wurde, lautet
Fügen Sie hier eine Bildbeschreibung ein
der Kerncode:

void Display(void)
{
    
    
    glClear(GL_COLOR_BUFFER_BIT);                    //清屏
    glMatrixMode(GL_MODELVIEW);                      //设置矩阵模式为模型变换模式,表示在世界坐标下
    glLoadIdentity();                                //将当前矩阵设置为单位矩阵
    glTranslatef(cx, cy, 0);                         //平移回去
    glRotatef(theta, 0, 0, 1);                       //绕原点旋转theta角度
    glScalef(sx, sy, 1);                             //比例缩放变换
    glTranslatef(-cx, -cy, 0);                       //平移回原点
    glColor3f(1.0f, 0.0f, 0.0f);                     //设置红色绘图颜色
    glBegin(GL_POLYGON);                             //开始绘制六边形 
    for (int i = 0; i < n; i++)
        //glVertex2f(R * cos(theta + i * 2 * PI / n), R * sin(theta + i * 2 * PI / n));  //顶点坐标 
        glVertex2f(R * cos(i * 2 * PI / n), R * sin(i * 2 * PI / n));  //顶点坐标 
    glEnd();
    glutSwapBuffers();              //双缓存的刷新模式
}
void myidle()
{
    
    
theta += 0.2;                     //旋转角度增量 
    if (theta >= 360) theta -= 360;    //旋转角复位(旋转角大于360°时减去360°)
    //比例因子放大一个增量
    sx = sx * 0.999;
    sy = sy * 0.999;
    if (sx > 3)      sx = 1;
    if (sy > 3)      sy = 1;
    glutPostRedisplay(); 
}

4) Ändern Sie den Code so, dass sich eine kleine dreieckige rote Fahne mit einer Stange kontinuierlich entlang der Unterseite der Stange dreht. Wie in der folgenden Abbildung dargestellt:
a) Rotierende kleine rote Flagge
Fügen Sie hier eine Bildbeschreibung ein
Kerncode:

void Display(void)
{
    
    
    glClear(GL_COLOR_BUFFER_BIT);                    //清屏
    glMatrixMode(GL_MODELVIEW);                      //设置矩阵模式为模型变换模式,表示在世界坐标下
    glLoadIdentity();                                //将当前矩阵设置为单位矩阵
    glTranslatef(cx, cy, 0);                         //平移回去
    glRotatef(theta, 0, 0, 1);                       //绕原点旋转theta角度
    glTranslatef(-cx, -cy, 0);                       //平移回原点
    
    //旗杆
    glColor3f(1.0f, 1.0f, 1.0f);                     //设置白色色绘图颜色
    glBegin(GL_LINES);                             
    glVertex2f(0.0f,0.0f);                          
    glVertex2f(0.0f, R);
    glEnd();

    //旗帜
    glColor3f(1.0f, 0.0f, 0.0f);                     //设置红色绘图颜色
    glBegin(GL_POLYGON);  
    glVertex2f(0.0f, R);
    glVertex2f(0.0f, R-n);
    glVertex2f(n , R);
    glEnd();
    glutSwapBuffers();              //双缓存的刷新模式
}
void myidle()
{
    
    
theta += 0.2;                     //旋转角度增量 
    if (theta >= 360) theta -= 360;    //旋转角复位(旋转角大于360°时减去360°)
    glutPostRedisplay();
}

5) Das regelmäßige Sechseck zoomt heran, während es sich dreht, zoomt hinein, bis es fast den gesamten Bildschirm erreicht, und zoomt dann kontinuierlich heraus und so weiter. Wie in der folgenden Abbildung dargestellt:
a) Ausgangszustand
Fügen Sie hier eine Bildbeschreibung ein

b) hineinzoomen
Fügen Sie hier eine Bildbeschreibung ein


Fügen Sie hier eine Bildbeschreibung ein
c) Auf den Kerncode reduziert :

void Display(void)
{
    
    
    glClear(GL_COLOR_BUFFER_BIT);                    //清屏
    glMatrixMode(GL_MODELVIEW);                      //设置矩阵模式为模型变换模式,表示在世界坐标下
    glLoadIdentity();                                //将当前矩阵设置为单位矩阵
    glTranslatef(cx, cy, 0);                         //平移回去
    glRotatef(theta, 0, 0, 1);                       //绕原点旋转theta角度
    glScalef(sx, sy, 1);                             
    glTranslatef(-cx, -cy, 0);                       //平移回原点
    glColor3f(1.0f, 0.0f, 0.0f);                     //设置红色绘图颜色
    glBegin(GL_POLYGON);                             //开始绘制六边形 
    for (int i = 0; i < n; i++)
        //glVertex2f(R * cos(theta + i * 2 * PI / n), R * sin(theta + i * 2 * PI / n));  //顶点坐标 
        glVertex2f(R * cos(i * 2 * PI / n), R * sin(i * 2 * PI / n));  //顶点坐标 
    glEnd();
    glutSwapBuffers();              

}
bool k=true;
void myidle()
{
    
    
theta += 0.2;                     //旋转角度增量 
    if (theta >= 360) theta -= 360;    //旋转角复位(旋转角大于360°时减去360°)
    //比例因子放大一个增量
    if (!k) {
    
    
        sx = sx * 0.99;
        sy = sy * 0.99;
    }
    else {
    
    
        sx = sx * 1.01;
        sy = sy * 1.01;
    }
    if (sx > 1.5 & sy > 1.5)    k = false;
    if(sx < 0.3 & sy < 0.3)     k = true;
    glutPostRedisplay(); 
}

5. Denkfragen

1. Beim Drehen um einen festen Punkt wird die Codesequenz wie folgt umgeschrieben:

glTranslatef(-cx,-cy,0); //平移回原点
glRotatef(ALPHA,0,0,1); //绕原点旋转ALPHA角度
glTranslatef(cx,cy,0); //平移回去

Wie werden die Grafiken aussehen?
Antwort: Die Grafiken werden um (-cx,-cy) gedreht.
2. Bei der Skalierung um einen festen Punkt wird die Codesequenz wie folgt umgeschrieben:

glTranslatef(-cx,-cy,0); //平移回原点
glScalef(Sx,Sy,0); //绕原点水平缩放系数Sx,垂直缩放系数Sy
glTranslatef(cx,cy,0); //平移回去

Wie werden die Grafiken aussehen?
Antwort: Die Grafiken werden um (-cx,-cy) als Mittelpunkt skaliert.
Fügen Sie hier eine Bildbeschreibung ein

Je suppose que tu aimes

Origine blog.csdn.net/weixin_52030647/article/details/130728432
conseillé
Classement