3

我正在尝试将数组形式的数据传递给 glutDisplayFunc 调用的函数。请让我知道这是否/如何可能或实现相同目标的简单替代方案。最终我会想要将很多值传递给绘图函数。谢谢!

#include "stdafx.h"
#include <ostream>
#include <iostream>
#include <Windows.h>
#include <ctime>
#include <vector>
using namespace std;
#include <glut.h>

void Draw(int passedArray[]) { // This is probably wrong but just to give you the idea
glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 1.0, 1.0);
    glBegin(GL_POINTS);
        glVertex3f(passedArray[1], passedArray[2], 0.0); // A point is plotted based on passed data
    glEnd();
    glFlush();
}

void Initialize() {
    glClearColor(0.0, 0.0, 0.0, 0.0); // Background color
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0.0, 1.0, 0.0, 1.0, -1.0, 1.0);
}


int main(int iArgc, char** cppArgv) {
    cout << "Start Main" << endl;
    glutInit(&iArgc, cppArgv);
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    glutInitWindowSize(250, 250); // Control window size
    glutInitWindowPosition(200, 200);
    glutCreateWindow("GA");
    Initialize();
    int passedArray[2] = {10, 20}; // create array
    glutDisplayFunc(Draw(passedArray)); // This is not how you do this, just to try to convey what I want
    glutMainLoop();
    return 0;
}
4

1 回答 1

1

要点是,只有全局变量才对 glut 有意义

为什么?

没有理由使用局部变量,因为 glut 本身是全局的。 每个应用程序只能调用一次glutInit 。等等。

沸腾

对于 C++11 及更高版本。传递 lambda 而不是函数指针。下面的示例显示了如何将 lambda 传递到循环体中。通过将 lambda 作为显示函数,您可以使用捕获部分来传递您喜欢的任何内容。

    // Include GLUT headers here as well

    #include <functional>

    typedef std::function<void()> loop_function_t;

    struct GlutArgs {
        loop_function_t loopFunction;
    };

    GlutArgs& getGlutArgs() {
        static GlutArgs glutArgs;
        return glutArgs;
    }

    void display() {
        getGlutArgs().loopFunction();
    }

    void init(int argc, char** argv) {
        // glutInit and friends goes here

        glutDisplayFunc (display);
    }

    void loop(loop_function_t f) {
        getGlutArgs().loopFunction = f;
        glutMainLoop();        
    }

    int main(int argc, char** argv) {
        init(argc, argv);
        int myVar = 1;
        loop([myVar](){
           glClear(...);
           doSomething(myVar);
        });
    }

对于旧的 C++ 标准,所有相同但不是 lambda 只是用你的变量而不是 lambda 填充 GlutArgs 内容,并直接从显示函数使用它们。

于 2018-11-16T13:35:38.107 回答