Dieter: C++ openGL glVertexPointer() mit deque Container

Hallo!

Ich habe ein Problem was eigentlich so gar nichts mit HTML zu tun hat. Ich schätze aber die Fachkompetenz hier und hoffe, dass mir vielleicht trotzdem jemand helfen kann. :)

Ich versuche mich gerade an einem openGL-Projekt mit C++.
Ich habe einen Container deque<float> vertices den ich gern der glVertexPointer()-Funktion als vierten Parameter übergeben würde.
Die Funktion erwartet als vierten Parameter einen Pointer auf die erste Koordinate des ersten Vektors im Array.

glVertexPointer(3, GL_FLOAT, 0, &vertices[0]);

Es werden aber keine Vektoren gezeichnet.
Ich hatte die Vektoren vorher in einem vector-Kontainer gespeichert und so benutzt:

glVertexPointer(3, GL_FLOAT, 0, vertices.data());

Das funktionierte ohne Probleme.

Was ist mein Fehler bei der Verwendung eines deque-Kontainers?
Der Grund warum ich einen deque-Kontainer verwenden möchte ist der, dass ich damit eine Funktion zur Verfügung habe um einfach neue Elemente an den Anfang der Liste einzufügen.

Danke für eure Hilfe!

  1. gudn tach!

    Ich versuche mich gerade an einem openGL-Projekt mit C++.
    Ich habe einen Container deque<float> vertices den ich gern der glVertexPointer()-Funktion als vierten Parameter übergeben würde.
    Die Funktion erwartet als vierten Parameter einen Pointer auf die erste Koordinate des ersten Vektors im Array.

    glVertexPointer(3, GL_FLOAT, 0, &vertices[0]);

    das problem koennte sein, dass ein deque intern (im gegensatz zu einem vector oder array) iirc nicht als zusammenhaengender block im speicher liegen muss.

    Der Grund warum ich einen deque-Kontainer verwenden möchte ist der, dass ich damit eine Funktion zur Verfügung habe um einfach neue Elemente an den Anfang der Liste einzufügen.

    hmm, sieht fuer mich nach einem fall von "man kann nicht alles haben" aus. entweder du kopierst den inhalt in ein array oder du verwendest kein deque.

    prost
    seth

    1. hmm, sieht fuer mich nach einem fall von "man kann nicht alles haben" aus. entweder du kopierst den inhalt in ein array oder du verwendest kein deque.

      Ich habe herausgefunden, dass ein vector-Objekt auch Einträge an den Anfang setzen kann.

      vector<float> vertices;
      vertices.insert(vertices.begin(), 1); // push 1 at the first position

      Was mir dabei nicht gefällt ist, dass ich nicht mehrere Einträge, respektive ein anderes vector-Objekt, anhängen kann. Aber da sind wir wieder bei "man kan nnicht alles haben".

      1. gudn tach!

        hmm, sieht fuer mich nach einem fall von "man kann nicht alles haben" aus. entweder du kopierst den inhalt in ein array oder du verwendest kein deque.

        Ich habe herausgefunden, dass ein vector-Objekt auch Einträge an den Anfang setzen kann.

        klar geht das, aber es kostet mehr zeit als bei einem deque, und ich dachte, darum gehe es dir.

        Was mir dabei nicht gefällt ist, dass ich nicht mehrere Einträge, respektive ein anderes vector-Objekt, anhängen kann. Aber da sind wir wieder bei "man kan nnicht alles haben".

        doch, auch das geht, siehe http://www.cplusplus.com/reference/vector/vector/insert/.

        prost
        seth

  2. Hallo!

    Ich hänge die Frage hier einfach mal an weil sie auch wieder nichts mit den sonst hier üblichen Themen zu tun hat. Ich hoffe, dass ist ok.

    Jetzt, da mein anderes "Problem" gelöst ist, möchte ich gern Kreispunkte in ein Koordinatensystem zeichnen.

    Die Berechnung dazu ist erstmal recht trivial. Als Mittelpunkt sind erstmal die Koordinaten 0,0 gegeben und tauchen deshalb nicht mehr in der Formel auf.

    Gegeben sind ausserdem die Anzahl der Punkte n und der Radius r.
    Daraus lässt sich das Bogenmaß b berechnen.
    Die Punkte berechne ich und hänge sie anschließend an ein vector-Objekt.

    unsigned int n = 60;
    unsigned int counter = 0;
    float r = 0.5f;
    float b = 2*M_PI/n;

    while(counter < n)
    {
        cout << cos((n-counter)*b)*r << endl;    // X-Koordinate
        cout << sin((n-counter)*b)*r << endl;    // Y-Koordinate
        counter++;
    }

    Die Berechnung startet aber mit einem Winkel von 0°. Auf einer Uhr also 3.
    Ich würde den Winkel, bzw. den Startpunkt, gern selbst angeben können aber ich weiß nicht an welcher Stelle der Formel ich ansetzen. Alle meine Versuche irgendwo mit +/- 90° als Test anzusetzen ergaben chaotische Werte.

    Kann mir bitte jemand zeigen wie ich die Formeln anpassen muss?

    Danke für eure Hilfe!

    1. Hallo Dieter,

      vielleicht verstehe ich dich ja falsch, aber versuch mal

      cout << cos((n-counter)*b+phi0)*r << endl;    // X-Koordinate
           cout << sin((n-counter)*b+phi0)*r << endl;    // Y-Koordinate

      Gruß, Jürgen

      1. Hallo Dieter,

        vielleicht verstehe ich dich ja falsch, aber versuch mal

        cout << cos((n-counter)*b+phi0)*r << endl;    // X-Koordinate
             cout << sin((n-counter)*b+phi0)*r << endl;    // Y-Koordinate

        Hallo Jürgen!

        Kannst du mir bitte noch sagen was "phi0" ist?

        1. Hallo Dieter,

          vielleicht verstehe ich dich ja falsch, aber versuch mal

          cout << cos((n-counter)*b+phi0)*r << endl;    // X-Koordinate
               cout << sin((n-counter)*b+phi0)*r << endl;    // Y-Koordinate

          Hallo Jürgen!

          Kannst du mir bitte noch sagen was "phi0" ist?

          Ah ok, phi0 ist der Versatz im Bogenmaß.
          Für einen Versatz auf 12 Uhr als Startpunkt wäre es also

          unsigned int n = 60;
          unsigned int counter = 0;
          float r = 0.5f;
          float b = 2*M_PI/n;

          while(counter < n)
          {
              cout << cos((n-counter)*b+(0.5f*M_PI))*r << endl;    // X-Koordinate
              cout << sin((n-counter)*b+(0.5f*M_PI))*r << endl;    // Y-Koordinate
              counter++;
          }

          Das funktioniert super. Danke!
          Aber wenn ich die Berechnung anders durchführe:

          cout << cos((n-counter)*b+((2/360*90)*M_PI))*r << endl;    // X-Koordinate
              cout << sin((n-counter)*b+((2/360*90)*M_PI))*r << endl;    // Y-Koordinate

          kommen wieder falsche Werte raus.

          ein cout sagt mir, dass 2/360*90 = 0 wäre. Wobei ich 0.5 erwartet hätte.

          Was mache ich da falsch?

          1. Hallo Dieter,

            ein cout sagt mir, dass 2/360*90 = 0 wäre. Wobei ich 0.5 erwartet hätte.

            Integer-Arithmetik: 2/360 = 0, versuch mal 2.0/360

            Gruß, Jürgen

            1. Hallo Dieter,

              ein cout sagt mir, dass 2/360*90 = 0 wäre. Wobei ich 0.5 erwartet hätte.

              Integer-Arithmetik: 2/360 = 0, versuch mal 2.0/360

              Ach natürlich. Herzlichen Dank für deine Hilfe!

    2. Hallo,

      cout << cos((n-counter)*b)*r << endl;    // X-Koordinate
          cout << sin((n-counter)*b)*r << endl;    // Y-Koordinate

      Die Berechnung startet aber mit einem Winkel von 0°. Auf einer Uhr also 3.
      Ich würde den Winkel, bzw. den Startpunkt, gern selbst angeben können aber ich weiß nicht an welcher Stelle der Formel ich ansetzen. Alle meine Versuche irgendwo mit +/- 90° als Test anzusetzen ergaben chaotische Werte.

      Kann mir bitte jemand zeigen wie ich die Formeln anpassen muss?

      vertausch doch einfach x und y...

      Gruß
      Kalk

      1. vertausch doch einfach x und y...

        Damit komme ich nicht weiter wenn ich bei z.B. 2 Uhr starten möchte.