我希望允许用户通过控制台更改prob数组的值,然后将这些更改反映到窗口中。
我知道我必须使用双缓冲,所以我在主函数中将显示模式设置为
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运行程序时在窗口上反映这些更改。我尝试在for循环之前使用while循环,以允许用户更改prob数组的值,但这对我不起作用。关于如何实现我想要的任何想法?
答案 0 :(得分:0)
但我只是不明白如何在窗口上反映这些变化
你需要国家。声明要使用的程序的变量,在处理控制台事件时更改它,使用该变量来显示内容。
除非您可以将控制台缓冲区交互与渲染交错,否则您很可能需要一个线程解决方案。
答案 1 :(得分:0)
关于如何实现我想要的任何想法?
最简单的解决方案是产生一个与stdio交互的额外线程。如果在GLUT主循环(线程)中执行此操作,则每次对stdio块进行操作时,整个程序都会冻结。这绝对不是你想要的。
另一种选择是在stdio上单独使用非阻塞操作,如果输入可用则轮询并将其传递给statefull解析器。问题是,你一次只能得到一个角色,当然,对于fscanf
,fgets
等类似的功能来说,它并不是那么顺利。