2015-10-07 2 views
0

Я хочу, чтобы пользователи могли изменять значения массива prob через консоль и затем отражать эти изменения в окне.Двойная буферизация и отражение переменных переменных в C++/OpenGL

Я знаю, что я должен использовать двойную буферизацию, так что я установить режим отображения в моей основной функции, как

glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); 

Ниже моя функция отображения:

void display() { 
    // declare some variables that will be used 
    int point_num = 8000000; 
    double r, x, y, x1 = 0, y1 = 0; 
    double prob[4] = {0.01, 0.19, 0.20, 0.60}; 

    // clear the window 
    glClear (GL_COLOR_BUFFER_BIT); 

    for (int i = 0; i < point_num; i++) { 
     r = drand48(); // generate a random number between 0.0 - 1.0 

     // compare the random number we get to the if statement below and get the appropriate x and y values 
     if (r < prob[0]) { 
      x = ((0.2 * x1) + (4.4 * y1) + 7.5)/((0.2 * x1) + (8.8 * y1) + 15.4); 
      y = ((-0.3 * x1) + (-4.4 * y1) + -10.4)/((0.2 * x1) + (8.8 * y1) + 15.4); 
     } 
     else if (r < prob[1]) { 
      x = ((-32.5 * x1) + (5.81 * y1) + -2.9)/((-128.1 * x1) + (-24.3 * y1) + -5.8); 
      y = ((122.9 * x1) + (-0.1 * y1) + -19.9)/((-128.1 * x1) + (-24.3 * y1) + -5.8); 
     } 
     else if (r < prob[2]) { 
      x = ((96.5 * x1) + (35.2 * y1) + 5.8)/((134.8 * x1) + (30.7 * y1) + 7.5); 
      y = ((-131.4 * x1) + (-6.5 * y1) + 19.1)/((134.8 * x1) + (30.7 * y1) + 7.5); 
     } 
     else { 
      x = ((19.05 * x1) + (0.72 * y1) + 1.86)/((5.63 * x1) + (2.01 * y1) + 20.0); 
      y = ((-0.15 * x1) + (16.9 * y1) + -0.28)/((5.63 * x1) + (2.01 * y1) + 20.0); 
     } 

     x1 = x; 
     y1 = y; 
     // plot the points 
     glBegin(GL_POINTS); 
     glVertex2d(x1, y1); 
     glEnd(); 
    } 

    glutSwapBuffers(); 
} 

Я знаю, как взаимодействовать с пользователь через консоль и измените значения переменных, но я просто не понимаю, как отражать эти изменения в окне, пока программа работает с использованием OpenGL. Я попытался использовать цикл while перед циклом for, чтобы пользователи могли изменять значения массива prob, но это не сработало для меня. Любые идеи о том, как я могу достичь того, чего хочу?

+0

* это не сработало для меня. * - почему именно? –

ответ

0

, но я просто не понимаю, как отразить эти изменения в окне

Вам нужно состояние. Объявите переменную для использования вашей программой, измените ее, когда обрабатываются события консоли, используйте эту переменную для отображения вещей.

Для этого вам, вероятно, понадобится решение для потоковой обработки, если вы не можете чередовать взаимодействие буфера буфера с рендерингом.

+0

Проблема OP заключается в том, что он хочет взаимодействовать с stdio, который сталкивается с потребностями основного цикла GLUT. – datenwolf

0

Любые идеи о том, как я могу достичь того, чего хочу?

Самое простое решение - создать дополнительную нить, которая взаимодействует с stdio. Если вы делаете это в GLUT mainloop (thread), каждый раз, когда выполняется операция над блоками stdio, вся программа зависает. Это определенно не то, что вы хотите.

Другой вариант использует исключительно неблокирующие операции на stdio, опрос, если вход доступен и передается его в полный парсер. Проблема в том, что вы, скорее всего, получите только один символ за раз, что, конечно же, не так хорошо работает с такими функциями, как fscanf, fgets и тому подобное.

+0

'sscanf' на помощь. Но я уверен, что кто-то уже написал кросс-платформенную асинхронную IO-библиотеку. –

Смежные вопросы