2015-05-24 64 views
0

我有一个方法,我需要这个方法来显示病毒的行为在使用网络GLUT(这是一个使用图形库我的第一次)。更新窗口显示的OpenGL/GLUT C++

我显示的点数和连接它们的线。该程序运行良好,它完美地显示了网络的初始状态,但我无法设法在我调用方法模拟后找到更新显示的方法。

的点改变颜色取决于计算机的状态,所以我需要一种方法来更新显示(网络图)每3秒或类似的东西。有任何想法吗?

我已阅读有关使用glutPostRedisplay()或以某种方式使用glutIdleFunc(),但我不明白如何实现它。谢谢您的帮助。

这里是我的代码:(但是这只能说明初始状态)

void Visualizador::visualizar(int cItr, int ios, double vsc, int vcf, double rc, double grc) { 

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
glutInitWindowSize(1280,720); 
glutCreateWindow("Network initial state"); 
glutDisplayFunc(display); //display creates a number of points (computers) and lines (connections) 
glutIdleFunc(display); 
glutMainLoop(); 

for (int i = 0; i < cItr; i++) { //cItr: Number of times the state of the network will be updated 
    ostringstream oss; 
    oss << "State #" << i+1 << " of the network"; 
    string windowName = oss.str(); 
    const char* cstr = windowName.c_str(); 
    simulator.simulate(1, vsc, vcf, rc, grc); //this method can change which point is infected 
    glutDisplayFunc(display); 
    glutIdleFunc(display); 
    glutSetWindowTitle(cstr); 
    glutMainLoop(); 
    } 
} 

回答

0

经过大量的阅读中,我发现,要完成什么,我试图做的就是删除代码,并把我的模拟方法中的唯一途径的显示功能。代码最终的工作方式如下:

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH); 
glutInitWindowSize(1280,720); 
glutCreateWindow("Network initial state"); 
glutDisplayFunc(display); 
glutIdleFunc(display); 
glutMainLoop(); 

如您所见,我只留下代码的顶部。我这样做的原因是因为glutIdleFunc(display)将被连续调用,所以如果我改变显示函数内部的网络状态(调用模拟),每次glutIdleFunc()调用显示网络都会改变。此外,我不得不在glutIdleFunc()的底部放置glutPostRedisplay()。调用glutPostRedisplay()会导致程序产生一个标志,指示窗口需要重新绘制或者换句话说显示需要更新。

我包括显示的代码,尽管有未知变量,因为它可能会帮助别人的事实:

void Visualizador::display() { 

if(v->displayCount <= Visualizador::cantIterac) 
{ 
    int contVertices = 0; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
    for (int i = 0; i < Visualizador::v->grafo.cntVrt*2; i += 2) { 
     if (Visualizador::v->grafo.obtEst(contVertices) == Grafo::S) { 
      glColor3f(0.0, 1.0, 0.0); 
     } 
     else { 
      if (Visualizador::v->grafo.obtEst(contVertices) == Grafo::R) { 
       glColor3f(0.5, 0.5, 0.5); 
      } 
      else { 
       glColor3f(1.0, 0.0, 0.0); //red 
      } 
     } 
     glPointSize(5.8); 
     glBegin(GL_POINTS); 
     glVertex2f(arrPos[i], arrPos[i + 1]); 
     contVertices++; 
    } 
    glEnd(); 

    contVertices = 0; 
    glLineWidth(1.6); //Ajusta el ancho de las lineas 
    glColor3f(0.2, 1.0, 1.0); //Color blanco 
    glBegin(GL_LINES); //empieza a dibujar lineas, cada dos llamadas a la funcion glVertex dibuja una sola linea 
    for (int i = 0; i < Visualizador::v->grafo.cntVrt*2; i += 2) { 
     int* adyVrt = Visualizador::v->grafo.obtAdy(contVertices); 
     for (int j = 0; j < Visualizador::v->grafo.arrVrt[contVertices].lstAdy->obtCntAdy(); j++) { 
      glVertex2f(arrPos[i], arrPos[i + 1]); 
      glVertex2f(arrPos[adyVrt[j]*2], arrPos[(adyVrt[j]*2) + 1]); 
     } 
     contVertices++; 
    } 
    glEnd(); 
    glutSwapBuffers(); 

    if (v->displayCount < Visualizador::cantIterac) 
    { 
     Sleep(500); 

     v->simulador.simular(1,Visualizador::virusSpreadC, Visualizador::virusCheckFrec, Visualizador::recoveryC, Visualizador::gainResistance); 

     ostringstream oss; 
     oss << "State #" << v->displayCount+1 << " of the network"; 
     string windowName = oss.str(); 
     const char* cstr = windowName.c_str(); 
     glutSetWindowTitle(cstr); 
     glutPostRedisplay(); 
    } 
    v->displayCount++; 
} 
else 
{ 
    glutIdleFunc(NULL); 
} 
}