2

ユーザーがダイアログボックスから画像を選択して表示できるプログラムがあります。メニューは画像の右クリックに関連付けられており、ユーザーがクラスタリングを選択すると、コンソールでクラスター間の最小距離を入力するように求められます。表示ウィンドウは、ウィンドウを作成し、そのGLUTプロパティを設定するメソッドを
呼び出すことによって作成されます。 多くの場合、コンソールウィンドウが画像表示ウィンドウの邪魔になるため、ユーザーがコンソールで入力を求められたときに、ロードされた画像で元のウィンドウを破棄したかったのです。viewer()

ユーザーがコンソールで値を入力した後、ウィンドウが再び表示されるようにしたかったのです。しかし、問題は、入力を読み込んだ後に関数を呼び出しても、次の関数呼び出しの実行が終了するviewer()までウィンドウが再び表示されないことです。Clustering()最初のウィンドウを破棄せずにコンソールウィンドウを移動した場合でも、クラスタリングアルゴリズムが実行されると、イメージの変化を確認できます。

私の質問は、なぜこの明示的な呼び出しcreateWindowが無視され、次のコマンドが実行されるのかということです。を使ってみglFinishましたが、役に立ちませんでした:-(誰かが私に解決策を提供できますか?

私の擬似コードは次のようになります。

Clustering()
{
    loop
    {
        image processing code
    }
    display()  ;
}

...

display()
{
    drawing code
    glutSwapBuffers()
}

void viewer() {

   glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
   glutInitWindowSize(width, height);
   glutInitWindowPosition(100, 100);

   win = glutCreateWindow("Image"); 

   glutCreateMenu(menu);
   glutAddMenuEntry("Load Image", 1);
   glutAddMenuEntry("Clustering", 3);
   glutAddMenuEntry("QUIT", 99);
   glutAttachMenu(GLUT_RIGHT_BUTTON);
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutMouseFunc(mouse);
}

void menu(int id) {

glutSwapBuffers();

switch (id){
    case 1://Open image
                    ...........
        break;  

    case 3://Clustering
        glutDestroyWindow(win);
        cout << "Please enter in the minimum distance between regions - a value between 1 and " << max_distance << ": \n";
        cin >> distance;

        Viewer();
        Clustering();
        break;

    case 99:
        exit(0);
}
glutPostRedisplay();
}

main()
{
    ....
    viewer();
    glutMainLoop();
}

ちなみに、処理中にOpenGLの表示を更新する方法を確認しましたか?すでに 。

質問は非常に似ていましたが、実際の問題は少し異なります。

4

1 に答える 1

0

あなたの思い通りに事が運ぶとは思えません。たとえばglutDestroyWindow、OpenGL コンテキストも破棄します (これは GLUT の制限であり、OpenGL ではありません。これにより、OpenGL コンテキストをウィンドウなしで「リンボ」にすることができます)。そのため、常にウィンドウを作成して破棄すると、その間にすべての画像、テクスチャなどを再読み込みする必要があります。

真剣に、GLUT の限界に達した場合は、GLUT を放棄して「本物の」ツールキットを使用するときです。Qt や wxWidgets や GTK+ のように。

于 2012-10-27T10:27:42.373 に答える