2016-10-18 6 views
0

ich Code schreibe die Figur zu zeichnen Correct outputein einzelnes Objekt opengl Übersetzen

aber mein Code gibt

My output

, wie Sie den mittleren Kreis fehlt sehen können.

Mein Code:

#include <stdio.h> 
#include <stdlib.h> 
#include <GL/glut.h> 
#include <math.h> 

float width, height, r = 0.3, change = 0; 

void draw(float tx, float ty) 
{ 
    glBegin(GL_LINE_LOOP); 
    for(int i = 1; i <= 1200; i++) 
    { 
     float x1, y1, theta; 

     theta = (2 * 3.14159 * i)/1200; 
     x1 = r * cosf(theta) * height/width; 
     y1 = r * sinf(theta); 

     glVertex3f(x1 , y1 ,0); 
    } 

    glEnd(); 
    glTranslatef(tx, ty, 0); 
} 

void display() 
{ 
    float p[6][2]; 
    int j = 0; 

    if (change == 0) 
     change = 1; 
    else if (change == 1) 
     change = 0; 

    width = glutGet(GLUT_WINDOW_WIDTH); 
    height = glutGet(GLUT_WINDOW_HEIGHT) ; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glColor3f(1.0f, 0.0f, 0.0f); 

    glMatrixMode(GL_MODELVIEW); 
    glBegin(GL_LINE_LOOP); 

    for(int i = 1; i <= 1200; i++) 
    { 
     float theta, x1, y1; 

     theta = (2 * 3.14159 * i)/1200; 
     x1 = r * cosf(theta) * height/width; 
     y1 = r * sinf(theta); 

     glVertex3f(x1, y1, 0); 

    if (i == 100 | i == 300 | i == 500 | i == 700 | i == 900 | i == 1100) 
    { 
     if(change == 0){ 
      p[j][0] = x1;      
      p[j][1] = y1; 
      j++; 
     } 
    }  

    } 
    glEnd(); 

    for(int i=0;i<6 && change == 0;i++){ 
     draw(p[i][0],p[i][1]); 
    } 
    glutSwapBuffers(); 
} 

void main(int argc,char *argv[]) 
{ 
    glutInit(&argc, argv); 
    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
    glutInitWindowSize(700,500); 
    glutCreateWindow("circles"); 
    glutDisplayFunc(display); 
    glutMainLoop(); 
} 

Ausgabe ist, wenn ich der Mittelkreis ersten Kreis in Zeichenfunktion übersetze auch zu diesem Punkt übersetzt gezogen wird, die mit anderen circle.My Zweifeln verschmolzen wird, wie nur einen Kreis übersetzen nicht das Zentrum Ich habe versucht zu übersetzen mit Push-und Pop-Matrix, aber es funktioniert nicht. Danke.

+0

Ihr Code nur zieht 6 Kreise:

Wenn Sie jeden Kreis an einer bestimmten Stelle platzieren möchten, können Sie so etwas wie die folgenden tun. Die Funktion 'draw' wird nur aus der Schleife' für (int i = 0; i <6 && change == 0; i ++) {draw (p [i] [0], p [i] [1]); } ' –

+0

@WeatherVane meine Entschuldigung, ich erfahre Browserprobleme –

+0

zeichnen Funktion zieht 6 Kreise + 1 in der Anzeige (Mittelkreis) = 7 –

Antwort

1

glTranslatef() ändert die aktuelle Matrix durch Anhängen einer Übersetzung. So werden Ihre Übersetzungen nur angehäuft. Und da Sie zwischen den ersten beiden Kreisen keine Transformation haben, erscheinen sie an den gleichen Positionen. Ihr Programm führt grundsätzlich folgendes aus:

Wenn Sie absolute Positionierung wünschen, müssen Sie die Transformation zwischendurch zurücksetzen. Dies kann entweder mit glLoadIdentity() oder mit dem Matrixstack erfolgen. Und achten Sie darauf, nach dem Einstellen der Transformation zu zeichnen.

Ich denke, Sie wissen, aber auf jeden Fall eine kleine Erinnerung: Die gesamte Matrix-Stack-Funktionalität ist in modernen OpenGL veraltet und Sie müssen die Matrizen selbst verwalten. Ich nehme an, wenn Sie das tun, wird alles ein bisschen klarer. Ich bin also nicht sicher, ob es einen guten Grund gibt, zu versuchen, die Schnittstelle der Matrixstack-Funktionalitäten zu verstehen. sowieso

void drawCircle() 
{ 
    glBegin(GL_LINE_LOOP); 
    for(int i = 1; i <= 1200; i++) 
    { 
     float x1, y1, theta; 

     theta = (2 * 3.14159 * i)/1200; 
     x1 = r * cosf(theta) * height/width; 
     y1 = r * sinf(theta); 

     glVertex3f(x1 , y1 ,0); 
    } 
    glEnd();  
} 

void display() 
{ 
    // ... 
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    glColor3f(1.0f, 0.0f, 0.0f); 

    glMatrixMode(GL_MODELVIEW); 
    drawCircle(); 

    for(int i = 0; i < 6; ++i) 
    { 
     float angle = M_PI/3 * i; 
     float tx = r * sin(angle); 
     float ty = r * cos(angle); 
     glPushMatrix(); //save the current matrix 
     glTranslatef(tx, ty, 0); //move to the desired location 
     drawCircle(); 
     glPopMatrix(); //restore the old matrix 
    } 
    glutSwapBuffers(); 
} 
+0

Ich habe versucht, GlLoadIdentity zwischen ersten Draw Circle und draw() -Funktion hinzuzufügen, aber es funktioniert nicht –

+0

Nein, Sie müssen eine Übersetzung (oder eine andere Transformation) hinzufügen, wenn Sie die Kreise unterschiedlich sein wollen. –

+0

ich habe ein glTranslatef mit (0,0,0) als Koordinaten hinzugefügt es funktioniert immer noch nicht –

Verwandte Themen