Rekursion in Qt/OpenGL
-
Hallo liebe Community,
ich versuche ein Programm zu schreiben, dass einen Pythagoras-Baum mithilfe von OpenGL in Qt durch Rekursion rendert. Mein Problem ist, dass sich das Programm beim Start aufhängt, was nur durch die Rekursion geschieht.
Folgende Funktion, die durch paintGL() in der selben Klasse aufgerufen wird, soll den Baum durch Rekursion zeichnen:
void TreeGL::draw(double ax, double ay, double bx, double by, double cx, double cy, double dx, double dy) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity(); if (iteration > 0) { iteration--; glBegin( GL_LINES); glColor3f(1.0, 0.0, 0.0); glVertex3f(ax, ay, -5.0); glVertex3f(bx, by, -5.0); glVertex3f(cx, cy, -5.0); glVertex3f(dx, dy, -5.0); glVertex3f(ax, ay, -5.0); glVertex3f(dx, dy, -5.0); glVertex3f(bx, by, -5.0); glVertex3f(cx, cy, -5.0); glEnd(); r1 = 0.2 + 0.4*0.6; r2 = sqrt(0.5*0.5-(0.5-r1)*(0.5-r1)); ex = -0.5 + r1*(0.5+0.5) + r2*(-0.5+0.5); ey = 0.5 + r1*(0.5-0.5) + r2*(0.5+0.5); a1x = dx; a1y = dy; b1x = ex; b1y = ey; c1x = b1x+a1y-b1y; c1y = b1y+b1x-a1x; d1x = a1x+a1y-b1y; d1y = a1y+b1x-a1x; // neues Kathetenquadrat links draw(a1x, a1y, b1x, b1y, c1x, c1y, d1x, d1y); a2x = ex; a2y = ey; b2x = cx; b2y = cy; c2x = b2x+a2y-b2y; c2y = b2y+b2x-a2x; d2x = a2x+a2y-b2y; d2y = a2y+b2x-a2x; // neues Kathetenquadrat rechts draw(a2x, a2y, b2x, b2y, c2x, c2y, d2x, d2y); } }
Und dies ist die Initialisierung von OpenGL:
glShadeModel(GL_SMOOTH); glClearColor(1.0f, 1.0f, 1.0f, 0.5f); glClearDepth(1.0f); glEnable(GL_DEPTH_TEST ); glDepthFunc(GL_LEQUAL); glEnable(GL_CULL_FACE); glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
Wäre gut wenn mir jemand weiterhelfen könnte, da ich ein ziemlicher Neuling in Sachen Qt/OpenGL bin. Vielen Dank im Voraus.
-
Das hat nichts mit Qt zu tun und wahrscheinlich ziemlich wenig mit OpenGl. Ich find deinen Aufbau generell nicht sinnvoll, ich würde eher das was du zeichnen willst in einer passenden Datenstruktur aufbauen und dann einfach nur zeichnen, ohne dass draw rekursiv aufgerufen wird.
Welchen Anfangswert hat iteration?
-
Vielen Dank erstmal für deine schnelle Antwort..
Soll ich den Pythagoras-Baum komplett manuell zeichnen?
Was genau ist mit Datenstruktur gemeint?
Der Iterationswert kann eigentlich beliebig sein (über 0 natürlich)...
-
Nicht selber zeichnen, aber ich würde den Aufbau vom Zeichnen trennen. Aufbauen musst den ja nur einmal. Auch wenn du dir einfach die Punkte in einem Array/Vector speicherst. Und das Zeichnen machst du dann nicht rekursiv.
Beliebig groß ist vielleicht auch schon das ProblemHängt es auch wenn du iteration am Anfang auf 1 setzt?
-
Ja, bei 1 auch hängt es auch. Ich habe das noch nicht so richtig strukturiert (Arrays, struct), da ich das erst mal so ausprobieren wollte.
Ordnen wollte ich das später
-
Ich halte es für ungeschickt, das so zu machen, vielleicht kommen dadurch komische Probleme, die man ewig sucht
Debuggs einfach mal. Wo hängt er, was passiert?
-
Habe es gerade etwas abgeändert, jetzt hängt es nicht mehr. Mein Problem ist jetzt aber, dass gezeichnet wird, aber das Gezeichnete verschwindet direkt wieder( man sieht es nur kurz aufblitzen).
In der draw()-Funktion habe ich nur glClear() und glLoadIdentity() in das if darunter gesetzt.
-
Wie gesagt, nicht raten, nur einmal aufbauen, und normal zeichnen. Notfalls debuggen.
-
Ok, ich werde es mir nochmal genau angucken...
Vielen Dank