我的opengl / glut.h代码中的参数方程出错

时间:2015-05-08 04:21:37

标签: c++ opengl

这就是问题:

  

下面的参数方程设置曲线,其中t∈R:

     

x(t)= sin(t)+ 1/2 sin(5t)+ 1/4 cos(2,3t)

     

y(t)= cos(t)+ 1/2 cos(5t)+ 1/4 sin(2,3t)

     

使用GL_LINE_STRIP执行白色曲线,使用GL_POINTS执行最后一个曲线   计算出的红点。它应该是实时绘制的   意味着,每时每刻都会计算一个新的点,并且   我们将看到正在构建的曲线,如下图所示。使用   回调计时器,等待时间为10毫秒。线索:使用ortho   x和y的范围从-2.0到2.0。

     

图片:http://i.stack.imgur.com/S6tiC.png

我的代码差不多完成了,但有两个问题。

第一个是:图像不在曲线中!它在计算点之间创建直线。我不知道公式是否错误,如果它在某处或某些地方缺少某些括号。

第二个是:正在创建红点,但旧点仍在那里。我需要做一些事情来删除旧的,但这不是一个大问题,第一个是让我疯狂。

这是我的代码: PS:评论是葡萄牙语,因为它是我的第一语言。

#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>
void display(void);
void init(void);
void reshape (int w, int h); 
void desenhaEixos();
void projecao(void);
void desenhaCurvaLinha(float centerX, float centerY);
void timer (int i);
void desenhaPonto(float centerX, float centerY);

float minX = -2; //Parâmetros do glOrtho
float maxX = 2;
float minY = -2;
float maxY = 2;
float minZ = -1;
float maxZ = 1;

int k = 0;

int main(int argc, char *argv[]){
    //Escopo de criação de janela
    glutInit(&argc, argv);//Avisa que será criada uma janela
    glutInitWindowSize(500,500); //Diz o tamanho da janela
    glutInitWindowPosition(10,10); //Diz onde a janela vai abrir na tela, em pixel
    glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); //Prepara o sistema para a janela a ser criada, é extremamente importante

    glutCreateWindow("FreeGLUT Shapes");//Cria a janela

    //Escopo de registro de callbacks
    glutDisplayFunc(display);
    glutReshapeFunc(reshape);   

    //glutIdleFunc(idle);
    glutTimerFunc(1000/*valor em milesegundos*/, timer, 1);

    //Demais
    init();
    glutMainLoop();//Fica esperando a ação do usuário



    return EXIT_SUCCESS;
}



void display(void){
     glClear(GL_COLOR_BUFFER_BIT);//Limpando o buffer de cor

     desenhaCurvaLinha(1, 1);
     desenhaPonto(1, 1);

     glutSwapBuffers();
     }



void init(void){

     glClearColor(0,0,0,0);//Escolhe a cor do fundo da janela, nesse caso, preto
}



void desenhaEixos(){

     //glLineWidth(3); //Caso queira mudar a espessura da linha

     glBegin(GL_LINES); //Indica que vou desenhar linhas

          glColor3f(1,0,0); // Vermelho
          glVertex3f(minX, 0, 0); //Estamos escrevendo o eixo X na tela
          glVertex3f(maxX, 0, 0);// Fui do mínimo até o máximo, da esquerda da tela até a direita

          glColor3f(0,1,0); //Verde
          glVertex3f( 0, minY, 0);
          glVertex3f( 0, maxY, 0);

          glColor3f(0,0,1); //Azul
          glVertex3f( 0, 0, minZ);
          glVertex3f( 0, 0, maxZ);

     glEnd();   
}



void desenhaCurvaLinha(float centerX, float centerY){
     float x, y;
     int t;
     glColor3f(1,1,1);
     glBegin(GL_LINE_STRIP);
          for(t=0;t<=k;t++){ 
               x = sin(t) + 0.5 * sin (5 * t) + 0.25 * cos (2.3*t);
               y = cos(t) + 0.5 * cos (5 * t) + 0.25 * sin (2.3*t);
               glVertex2f(x, y);      
          }  
     glEnd();
}

void desenhaPonto(float centerX, float centerY){
     float x, y;
     int t;
     glPointSize(5);
     glColor3f(1,0,0);
     glBegin(GL_POINTS);
          for(t=0;t<=k;t++){ 
               x = sin(t) + 0.5 * sin (5 * t) + 0.25 * cos (2.3*t);
               y = cos(t) + 0.5 * cos (5 * t) + 0.25 * sin (2.3*t);
               glVertex2f(x, y);      
          }  
     glEnd();
}



void reshape (int w, int h){
     glViewport(0,0,w,h); //linha protocolo
     projecao();
}



void projecao(void){

     glMatrixMode(GL_PROJECTION);
     glLoadIdentity();
     glOrtho(minX, maxX, minY, maxY, minZ, maxZ); // Diz agora, que o X da minha janela começa no -10 e termina no 10, o y também.
     glMatrixMode(GL_MODELVIEW);
     glLoadIdentity();

}



void timer (int i){


      k++;    
      glutPostRedisplay();
      glutTimerFunc(1000, timer, 1);

}

1 个答案:

答案 0 :(得分:0)

您可以在点之间获得直线,因为您在点之间绘制直线(并且您可以在像素显示屏上执行所有操作)。

公式中的t是连续的,t∈R 您的t并非如此,因为您使用的是数字计算机。

要获得更平滑的曲线&#34;,请在线上各点之间使用小于1的小步。

您还会绘制很多分数,因为您正在使用一个绘制曲线上所有点的循环(我怀疑涉及复制和粘贴)。

删除desenhaPonto中的循环并仅绘制最后一个点t = k

glBegin(GL_POINTS);
    x = sin(k) + 0.5 * sin (5 * k) + 0.25 * cos (2.3*k);
    y = cos(k) + 0.5 * cos (5 * k) + 0.25 * sin (2.3*k);
    glVertex2f(x, y);      
glEnd();