OpenGL Polygone
-
Hallo zusammen,
ich habe einen Programm geschrieben mit denen ich Polygone bzw. geometrische Fuguren zeichnen kann.
Ich möchte es verbessern, habe aber irgendwie keine Idee wie ich das am besten machen kann, da ich mich bisher auch nicht solange mit OpenGL beschäftig habe.Im moment kann mit rechter Mausklick einen Punkt darstellen, dieser Punkt wird direkt mit einem anderen Punkt verbunden.
NUn möchte ich das so erweitern, dass ich wenn die letzte Kante ziehen möchte, auf die linke Maustaste drücke, es soll dann nicht mehr möglich sein einen neuen Knoten hinzuzufügen.
Ich möchte auch dass sich die letzte Kante sich automatisch mit dem ersten Knoten verbinden, wie kann ich mir denn den ersten Knoten merken ?Ich zeige euch mal meinen Code :
#include <GL/glut.h> #include <glu.h> GLsizei winWidth = 700; GLsizei winHeight = 400; bool blnAction = false; class polygon { public: GLint x,y; }; void init() { glClearColor(0.0, 0.0, 1.0, 1.0); // set Window Color to blue Hintergrundfarbe glMatrixMode(GL_PROJECTION); //Art des Koordinatensystems gluOrtho2D(0.0, 200.0, 0.0, 150.0);////Koordinatenverteilung festlegen //x-> 0.0 ... 200.0 //y- > 0.0 ... 150.0 } void displayFcn(void) { glClear(GL_COLOR_BUFFER_BIT); //Fenster löschen glPointSize(5.0); glLineWidth(1.75); } void winReshapeFcn(GLint newWidth, GLint newHeight) { glViewport(0,0,newWidth, newHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,GLdouble(newWidth),0.0,GLdouble(newHeight)); winWidth = newWidth; winHeight= newHeight; } void drawPolygon(polygon endPt1, polygon endPt2) { glBegin(GL_POLYGON); glVertex2i(endPt1.x,endPt2.y); } void drawLineSegment(polygon endPt1, polygon endPt2) { glBegin(GL_POINTS); //Zeichenmodus setzten glVertex2i(endPt1.x, endPt1.y); glEnd(); } /* void drawLineLoop(polygon endPt1, polygon endPt2) { drawLineSegment(endPt1,endPt2); glFlush(); glBegin(GL_LINES); glVertex2i(endPt1.x, endPt1.y); glBegin(GL_LINE_LOOP); glVertex2i(endPt1.x, endPt1.y); glFlush(); } */ void drawLine(polygon endPt1, polygon endPt2) { drawLineSegment(endPt1,endPt2); glBegin(GL_LINES); glFlush(); glVertex2i(endPt1.x, endPt1.y); glFlush(); } 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); glFlush(); //drawLineLoop(endPt1,endPt2); glFlush(); // endPtCtr = 0; } else if(button == GLUT_LEFT_BUTTON) glEnd(); //bool bInAction = false; glFlush(); //zeichen } void main(int argc, char**argv) { glutInit(&argc, argv); //initialisierung der GLUT Bibliothek glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //Initialisierung des Bildschirms(Art des Zwischenspeichers, Farben) glutInitWindowPosition(100,100); //Positionierung des Fensters glutInitWindowSize(winWidth,winHeight); //Fenstergröße glutCreateWindow("Draw Interactive Polyline"); //Fenstertitel init(); glutDisplayFunc(displayFcn); //Festlegen der Funktion die zum zeichen auf dem Bildschurm verwendet wird glutReshapeFunc(winReshapeFcn); glutMouseFunc(polyline); //Funktion die die Funktion "polyline" aufruft, wenn der Maus betätigt wurde glutMainLoop(); } #include <GL/glut.h> #include <glu.h> GLsizei winWidth = 700; GLsizei winHeight = 400; bool blnAction = false; class polygon { public: GLint x,y; }; void init() { glClearColor(0.0, 0.0, 1.0, 1.0); // set Window Color to blue Hintergrundfarbe glMatrixMode(GL_PROJECTION); //Art des Koordinatensystems gluOrtho2D(0.0, 200.0, 0.0, 150.0);////Koordinatenverteilung festlegen //x-> 0.0 ... 200.0 //y- > 0.0 ... 150.0 } void displayFcn(void) { glClear(GL_COLOR_BUFFER_BIT); //Fenster löschen glPointSize(5.0); glLineWidth(1.75); } void winReshapeFcn(GLint newWidth, GLint newHeight) { glViewport(0,0,newWidth, newHeight); glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluOrtho2D(0.0,GLdouble(newWidth),0.0,GLdouble(newHeight)); winWidth = newWidth; winHeight= newHeight; } void drawPolygon(polygon endPt1, polygon endPt2) { glBegin(GL_POLYGON); glVertex2i(endPt1.x,endPt2.y); } void drawLineSegment(polygon endPt1, polygon endPt2) { glBegin(GL_POINTS); //Zeichenmodus setzten glVertex2i(endPt1.x, endPt1.y); glEnd(); } /* void drawLineLoop(polygon endPt1, polygon endPt2) { drawLineSegment(endPt1,endPt2); glFlush(); glBegin(GL_LINES); glVertex2i(endPt1.x, endPt1.y); glBegin(GL_LINE_LOOP); glVertex2i(endPt1.x, endPt1.y); glFlush(); } */ void drawLine(polygon endPt1, polygon endPt2) { drawLineSegment(endPt1,endPt2); glBegin(GL_LINES); glFlush(); glVertex2i(endPt1.x, endPt1.y); glFlush(); } 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); glFlush(); //drawLineLoop(endPt1,endPt2); glFlush(); // endPtCtr = 0; } else if(button == GLUT_LEFT_BUTTON) glEnd(); //bool bInAction = false; glFlush(); //zeichen } void main(int argc, char**argv) { glutInit(&argc, argv); //initialisierung der GLUT Bibliothek glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); //Initialisierung des Bildschirms(Art des Zwischenspeichers, Farben) glutInitWindowPosition(100,100); //Positionierung des Fensters glutInitWindowSize(winWidth,winHeight); //Fenstergröße glutCreateWindow("Draw Interactive Polyline"); //Fenstertitel init(); glutDisplayFunc(displayFcn); //Festlegen der Funktion die zum zeichen auf dem Bildschurm verwendet wird glutReshapeFunc(winReshapeFcn); glutMouseFunc(polyline); //Funktion die die Funktion "polyline" aufruft, wenn der Maus betätigt wurde glutMainLoop(); }wäre echt nett wenn sich der eine oder andere einige vorschläge hätten
-
schon mal in erwaegung gezogen, dir deine koordinaten in datenstrukturen deiner wahl zu merken?
-
Ja das habe ich, habe aber nicht die Funktion gefunden um die Koordinaten auszulesen, ich habe auch einige Probleme gehabt mit den verschieden Typ, auf der einen Seite habe ich Typ "polygon" auf der andere seite wollte ich eine Datenstruktur mit float zahlen gehabt. Ich wußte nicht wie ich das umschreiben kann.
Weißt Du denn die Funktion zum herauslesen der Koordinaten ?
-
da sind'se doch:
if(button == GLUT_RIGHT_BUTTON && action == GLUT_DOWN) { endPt1.x = xMouse; endPt1.y = winHeight - yMouse; // ...koennte es sein, dass du erstmal einige c++-grundlagen nachzuholen haettest?
-
nein nein das ist mir schon klar, ich meine nur, da gabs eine openGl Funktion, damit bräuchte ich nur ein eindimesionales Array und nicht zwei....
Danke Dir
-
Ehrmm, Crossposting? Ist das echt nötig?
Bye, TGGC (Get the next best thing)
-
hellihjb schrieb:
schon mal in erwaegung gezogen, dir deine koordinaten in datenstrukturen deiner wahl zu merken?
*hehe*