Mausereignis terminieren



  • Hallo zusammen,

    ich habe ein kleines Programm geschrieben, in OpenGL, ich möchte damit einen Polygon zeichnen können.

    Im moment kann ich mit der rechten Maustaste einen Knoten zeichnen und mit einem vorigen Knoten verbinden. Ich möchte nun, dass ich mit der linken Maustaste, den Prozess terminieren, d.h. die letzte Kante mit der Hand zu der ersten Kante zeichnen. Es soll beim betätigen der linken Maustaste auch nicht mehr möglich sein einen neuen Knoten hinzuzufügen.

    Meine Funktion ist diese hier:

    void polyline(GLint button, GLint action, GLint xMouse, GLint yMouse) //Mouse callback prozedur
    {
    	static polygon endPt1, endPt2;
    
    	if(button == GLUT_RIGHT_BUTTON && action == GLUT_DOWN)
    		{
    			endPt1.x = xMouse;
    			endPt1.y = winHeight - yMouse;
    
    			drawLineSegment(endPt1, endPt2);
    			glFlush();
    			drawLine(endPt1, endPt2);	
    
    		}
    	else 
    		if(button == GLUT_LEFT_BUTTON)
    		????
    		glEnd();	
    
    		glFlush();							
    }
    

    Hat einer ne Idee wie ich das machen kann ?



  • Das Problem hat eher mit OpenGL zu tun als mit MFC, deshalb bekommst du von mir einen Schubs ins Grafik-Board.



  • Dieser Thread wurde von Moderator/in CStoll aus dem Forum MFC (Visual C++) in das Forum Spiele-/Grafikprogrammierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Wenn ich das richtig sehe, zeichnest du nicht jeden Frame alle Linien.

    Ich hätte es so gelöst: Du hast eine dynamische Liste mit Punkten und ein Flag, ob es noch möglich ist, Punkte zu setzen, welches anfangs auf true ist.
    Jetzt mit jedem Rechtsklick wird (sofern es möglich ist, Punkte zu setzen) ein Punkt dem Array hinzugefügt. Wird linke Maustaste wird, setzt du das Flag auf false.
    Wenn du jetzt jeden Frame renderst, überprüfst du einfach, ob das Flag auf true oder false steht. Du verbindest alle Punkte im Array und wenn jetzt noch das Flag auf false ist, es also nich mehr möglich ist, Punkte zu setzen, verbindest du noch den letzten mit dem ersten Punkt.

    (bin müde)



  • das hört sich echt cool an, du meinst also..

    -sofern das Flag auf true ist
    -ich speichere jeden Punkt den ich auf der Graphic setze in ein Array...
    -wenn ich die linke Maustaste drücke, wird Flag auf false gesetzt
    -Danach durchlaufe ich quasi meinen Array und verbinde die Punkte miteiander

    Ist das so richtig ?



  • mehr oder weniger... wenn du es so machst, wie du grad beschreibst, renderst du ja nur einmal am Schluss. Das würde bedeuten, dass erst alle Linien gezeichnet werden, wenn man das Klicken mit der linken Maustaste beendet hat.

    Du kannst es natürlich auch so machen, dass du mit jeden Mausklick den Bildschirm leerst und die Linien zeichnest.



  • @xindon: ich habe noch eine Frage in bezug auf die Speicherung der Knoten

    ich komme einfach nicht so darauf...bzw habe zwar ne lösung die scheint mir selber nicht so effizient zu sein..

    Ich möchte einen zweidimensionales Array anlegen. Die größe der Array soll gleich der größe des Bildschirmes haben, d.h. in diesem fall "array[150][200]" (kann sein dass ich übertreibe). Wenn ich einen Knoten speichern möchte setzte ich das in ein Array und setzte ebenso einen Wert 1 dahinter, z.B. Punkt 3,6 array[3][6] = 1.

    Danach wenn ich das zeichnen möchte, durchlaufe ich meinen Array, und überprüfe ob dort eine 1 ist, und falls es so ist, wird dieser Punkt gezeichnet.

    Problem: -Array zu groß
    -rendering, ich möchte das schon so haben dass die Punkte nicht ganz zum schluß gezeichnet werden, sondern dann wenn ich auf das Bildschirm einen Mausklick gebe

    WIe würdest Du denn so machen, kannst Du mich vielleicht ein kleines beispiel geben ? wäre echt nett..

    Grüße



  • einen zweidimensionales Array gleich der größe des Bildschirmes

    oha...

    vorschlag:

    struct Punkt
    {
      int x,y;
    
    };
    
    DynamischeDatenstrukturDeinerWahl<Punkt> punktListe;
    Punkt punkt= // deine koordinaten eben
    punktListe.append(punkt);
    
    Punkt ersterPunkt= punktListe[0];
    


  • Naja, man kann keine beliebige Struktur nehmen, weil die Reihenfolge der Punkte wichtig ist. Darum hätte das mit dem grossen Array auch nie funktioniert, da haettest du die Punkte gewusst, aber wie sollen sie denn mit Linien verbunden werden?

    Bye, TGGC ([url=http://forum.sunflowers.de/showthread.php?t=11421]Get the next best

    thing[/url])



  • Wieso kann ich denn nicht ohne weiteres auf ein Array zugreifen, den ich ganz am Anfang deklariert habe, es ist doch global...

    #include <GL/glut.h>
    #include <glu.h>
    
    GLsizei winWidth = 700;
    GLsizei winHeight = 400;
    
     static float array[10][10];
     float erste[2];
    

    ich möchte nun in einer Anderen Funktion darauf zugreifen, bekomme aber eine Fehlermeldung, ich habe die Array bereits in einer anderen Funktion gefüllt, also daran liegt es nicht...



  • elturco schrieb:

    ich möchte nun in einer Anderen Funktion darauf zugreifen, bekomme aber eine Fehlermeldung, ich habe die Array bereits in einer anderen Funktion gefüllt, also daran liegt es nicht...

    Ist die andere Funktion in der selben Übersetzungseinheit (also effektiv im selben CPP-File) untergebracht? Wenn nein, liegt dein Array wegen dem "static" (informier dich mal, was das genau bewirkt) wohl außer Reichweite.


Anmelden zum Antworten